Mercurial > pidgin
diff libpurple/util.c @ 23684:de8f2d3e538a
Add temporary purple_util_fetch_url_request_len and purple_util_fetch_url_len
to enable restricting the length of HTTP downloads.
Set a maximum size of 128kB to the UPnP-related downloads.
Thanks to Andrew Hunt and Christian Grothoff for discovering the issue and
providing a solution.
| author | Daniel Atallah <daniel.atallah@gmail.com> |
|---|---|
| date | Fri, 08 Aug 2008 23:34:27 +0000 |
| parents | 187a3649f04b |
| children | 679a61dcf5c2 |
line wrap: on
line diff
--- a/libpurple/util.c Fri Aug 08 20:33:25 2008 +0000 +++ b/libpurple/util.c Fri Aug 08 23:34:27 2008 +0000 @@ -65,6 +65,7 @@ char *webdata; unsigned long len; unsigned long data_len; + gssize max_len; }; static char *custom_user_dir = NULL; @@ -3754,6 +3755,15 @@ gboolean got_eof = FALSE; while((len = read(source, buf, sizeof(buf))) > 0) { + + if(gfud->max_len != -1 && (gfud->len + len) > gfud->max_len) { + /* TODO: Fix this when not string frozen */ + /*purple_util_fetch_url_error(gfud, _("Error reading from %s: response too long (%d bytes limit)"),*/ + purple_util_fetch_url_error(gfud, "Error reading from %s: response too long (%d bytes limit)", + gfud->website.address, gfud->max_len); + return; + } + /* If we've filled up our buffer, make it bigger */ if((gfud->len + len) >= gfud->data_len) { while((gfud->len + len) >= gfud->data_len) @@ -3915,8 +3925,7 @@ gfud->fd = source; - if (!gfud->request) - { + if (!gfud->request) { if (gfud->user_agent) { /* Host header is not forbidden in HTTP/1.0 requests, and HTTP/1.1 * clients must know how to handle the "chunked" transfer encoding. @@ -3960,6 +3969,18 @@ const char *request, gboolean include_headers, PurpleUtilFetchUrlCallback callback, void *user_data) { + return purple_util_fetch_url_request_len(url, full, + user_agent, http11, + request, include_headers, -1, + callback, user_data); +} + +PurpleUtilFetchUrlData * +purple_util_fetch_url_request_len(const char *url, gboolean full, + const char *user_agent, gboolean http11, + const char *request, gboolean include_headers, gssize max_len, + PurpleUtilFetchUrlCallback callback, void *user_data) +{ PurpleUtilFetchUrlData *gfud; g_return_val_if_fail(url != NULL, NULL); @@ -3980,6 +4001,7 @@ gfud->request = g_strdup(request); gfud->include_headers = include_headers; gfud->fd = -1; + gfud->max_len = max_len; purple_url_parse(url, &gfud->website.address, &gfud->website.port, &gfud->website.page, &gfud->website.user, &gfud->website.passwd);
