jstedfast / gmime

A C/C++ MIME creation and parser library with support for S/MIME, PGP, and Unix mbox spools.
GNU Lesser General Public License v2.1
111 stars 36 forks source link

Issue about calling g_mime_utils_header_decode_text somewhere #157

Closed Icekettle closed 6 months ago

Icekettle commented 6 months ago

I called g_mime_utils_header_decode_text in my code like this:

char* decodedValue = g_mime_utils_header_decode_text(NULL,val);
value.assign(decodedValue);// g_mime_references_decode
g_free(decodedValue);

It's no problem,here. But when I called g_object_unref to unref my MimeMessage at the end of my mime parsing:

g_object_unref(m_gMessage); // crashed

I tried to debug, and looked into ..... I found the exception fired in this method:

g_mime_event_index_of (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data)
{
    EventListener *listener;
    int i;  

    for (i = 0; i < event->array->len; i++) {
        listener = (EventListener*)event->array->pdata[i];
        if (listener->callback == callback && listener->user_data == user_data)
            return i;
    }

    return -1;
}

It says event is null. But why?

So I modified like this, it worked:

g_mime_event_index_of (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data)
{
    EventListener *listener;
    int i;
    if (NULL == event)
        return -1;
    if (NULL == event->array)
        return -1;

    for (i = 0; i < event->array->len; i++) {
        listener = (EventListener*)event->array->pdata[i];
        if (listener->callback == callback && listener->user_data == user_data)
            return i;
    }

    return -1;
}
Icekettle commented 6 months ago

FYI, I'm using the latest version 3.2.14.

jstedfast commented 6 months ago

I'm confused as to what g_mime_utils_header_decode_text() has to do with your m_gMessage? I guess I'm missing context.

Icekettle commented 6 months ago

I'm confused as to what g_mime_utils_header_decode_text() has to do with your m_gMessage? I guess I'm missing context.

Yeah, I 'm confused too. I called g_mime_utils_header_decode_text() when I process headers.

We know ,when called g_object_unref(GMimeMessage object) , sequentially following methods would be called: g_mime_object_finalize g_mime_event_remove g_mime_event_index_of

In g_mime_object_finalize: g_mime_object_finalize (GObject object) { GMimeObject mime = (GMimeObject ) object; GMimeEvent event;
...

if (mime->headers) {
    event = mime->headers->changed;
            // Enter this
    g_mime_event_remove (event, (GMimeEventCallback) header_list_changed, object);
    g_object_unref (mime->headers);
}

g_free (mime->content_id);

G_OBJECT_CLASS (parent_class)->finalize (object);

}

Did I miss something when I process headers?

Icekettle commented 6 months ago

I think I found the reason. Sorry for that.

It's my mistake. I shouldn't unref the point returned by g_mime_object_get_header_list.