summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-02-10 18:35:56 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-02-10 18:35:56 +0000
commit72b8a67660ca199b31d1e771e7cb5206697407b6 (patch)
treec653c9c184d5635ba8d9c17f085c3543d3b4e76e /render
parent876c92e58ea75698a9e1f83dd9243e6928c9fa41 (diff)
downloadnetsurf-72b8a67660ca199b31d1e771e7cb5206697407b6.tar.gz
netsurf-72b8a67660ca199b31d1e771e7cb5206697407b6.tar.bz2
Ensure URLs are normalized prior to fetching.
Squash memory leaks. svn path=/trunk/netsurf/; revision=6411
Diffstat (limited to 'render')
-rw-r--r--render/html.c47
1 files changed, 41 insertions, 6 deletions
diff --git a/render/html.c b/render/html.c
index 70ee5ccb3..4063f67ad 100644
--- a/render/html.c
+++ b/render/html.c
@@ -704,7 +704,7 @@ bool html_meta_refresh(struct content *c, xmlNode *head)
bool html_find_stylesheets(struct content *c, xmlNode *html)
{
xmlNode *node;
- char *rel, *type, *media, *href, *url;
+ char *rel, *type, *media, *href, *url, *url2;
unsigned int i = STYLESHEET_START;
unsigned int last_active = 0;
union content_msg_data msg_data;
@@ -827,26 +827,39 @@ bool html_find_stylesheets(struct content *c, xmlNode *html)
LOG(("linked stylesheet %i '%s'", i, url));
+ res = url_normalize(url, &url2);
+ if (res != URL_FUNC_OK) {
+ if (res == URL_FUNC_NOMEM)
+ goto no_memory;
+ continue;
+ }
+
+ free(url);
+
/* start fetch */
stylesheet_content = talloc_realloc(c,
c->data.html.stylesheet_content,
struct content *, i + 1);
- if (!stylesheet_content)
+ if (!stylesheet_content) {
+ free(url2);
goto no_memory;
+ }
+
c->data.html.stylesheet_content = stylesheet_content;
- c->data.html.stylesheet_content[i] = fetchcache(url,
+ c->data.html.stylesheet_content[i] = fetchcache(url2,
html_convert_css_callback,
(intptr_t) c, i, c->width, c->height,
true, 0, 0, false, false);
+ free(url2);
if (!c->data.html.stylesheet_content[i])
goto no_memory;
+
c->active++;
fetchcache_go(c->data.html.stylesheet_content[i],
c->url,
html_convert_css_callback,
(intptr_t) c, i, c->width, c->height,
0, 0, false, c->url);
- free(url);
i++;
} else if (strcmp((const char *) node->name, "style") == 0) {
@@ -1112,11 +1125,24 @@ bool html_fetch_object(struct content *c, char *url, struct box *box,
unsigned int i = c->data.html.object_count;
struct content_html_object *object;
struct content *c_fetch;
+ char *url2;
+ url_func_result res;
+
+ /* Normalize the URL */
+ res = url_normalize(url, &url2);
+ if (res != URL_FUNC_OK) {
+ LOG(("failed to normalize url '%s'", url));
+ return res != URL_FUNC_NOMEM;
+ }
/* initialise fetch */
- c_fetch = fetchcache(url, html_object_callback,
+ c_fetch = fetchcache(url2, html_object_callback,
(intptr_t) c, i, available_width, available_height,
true, 0, 0, false, false);
+
+ /* No longer need normalized url */
+ free(url2);
+
if (!c_fetch)
return false;
@@ -1163,6 +1189,8 @@ bool html_replace_object(struct content *c, unsigned int i, char *url,
{
struct content *c_fetch;
struct content *page;
+ char *url2;
+ url_func_result res;
assert(c->type == CONTENT_HTML);
@@ -1177,12 +1205,19 @@ bool html_replace_object(struct content *c, unsigned int i, char *url,
c->data.html.object[i].box->object = 0;
}
+ res = url_normalize(url, &url2);
+ if (res != URL_FUNC_OK)
+ return res != URL_FUNC_NOMEM;
+
/* initialise fetch */
- c_fetch = fetchcache(url, html_object_callback,
+ c_fetch = fetchcache(url2, html_object_callback,
(intptr_t) c, i,
c->data.html.object[i].box->width,
c->data.html.object[i].box->height,
false, post_urlenc, post_multipart, false, false);
+
+ free(url2);
+
if (!c_fetch)
return false;