diff options
author | Dan Winship <danw@gnome.org> | 2009-07-12 12:22:45 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2009-07-12 12:25:44 -0400 |
commit | 97391f4fed914ee3b5fd373c1881295c08df7b3f (patch) | |
tree | a6d002af62f086d9bebe5fc7f1dc6e8fd1aa8d16 | |
parent | d9bcaac69203e8f6501a3a60aae350a0cfc342bb (diff) | |
download | libsoup-97391f4fed914ee3b5fd373c1881295c08df7b3f.tar.gz |
Fix a content-sniffer crash with redirected URLs
SoupMessageHeaders was not properly cleaning up the cached
Content-Type when a request was redirected, which meant that if the
redirected-to URL had no Content-Type header, then
soup_message_headers_get_content_type() would return the Content-Type
of the original request, but
soup_message_headers_get_one("Content-Type") would return NULL,
causing the sniffer to crash.
http://bugzilla.gnome.org/show_bug.cgi?id=588335
-rw-r--r-- | libsoup/soup-message-headers.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/libsoup/soup-message-headers.c b/libsoup/soup-message-headers.c index 185346e1..6acca0c9 100644 --- a/libsoup/soup-message-headers.c +++ b/libsoup/soup-message-headers.c @@ -33,6 +33,7 @@ typedef void (*SoupHeaderSetter) (SoupMessageHeaders *, const char *); static const char *intern_header_name (const char *name, SoupHeaderSetter *setter); +static void clear_special_headers (SoupMessageHeaders *hdrs); typedef struct { const char *name; @@ -98,7 +99,6 @@ soup_message_headers_free (SoupMessageHeaders *hdrs) g_array_free (hdrs->array, TRUE); if (hdrs->concat) g_hash_table_destroy (hdrs->concat); - g_free (hdrs->content_type); g_slice_free (SoupMessageHeaders, hdrs); } } @@ -137,7 +137,7 @@ soup_message_headers_clear (SoupMessageHeaders *hdrs) if (hdrs->concat) g_hash_table_remove_all (hdrs->concat); - hdrs->encoding = -1; + clear_special_headers (hdrs); } /** @@ -548,6 +548,22 @@ intern_header_name (const char *name, SoupHeaderSetter *setter) return interned; } +static void +clear_special_headers (SoupMessageHeaders *hdrs) +{ + SoupHeaderSetter setter; + GHashTableIter iter; + gpointer key, value; + + /* Make sure header_setters has been initialized */ + intern_header_name ("", NULL); + + g_hash_table_iter_init (&iter, header_setters); + while (g_hash_table_iter_next (&iter, &key, &value)) { + setter = value; + setter (hdrs, NULL); + } +} /* Specific headers */ |