diff options
author | Don Scorgie <dscorgie@src.gnome.org> | 2007-09-05 18:28:57 +0000 |
---|---|---|
committer | Don Scorgie <dscorgie@src.gnome.org> | 2007-09-05 18:28:57 +0000 |
commit | 896371aacee702ce3aa9c099259bf3a2a793ec43 (patch) | |
tree | 6a6d9e4e63827a3745f72ce08355d18dd2719c8e | |
parent | 5962bc3431fa525983056179955eef23e066ef55 (diff) | |
download | yelp-896371aacee702ce3aa9c099259bf3a2a793ec43.tar.gz |
Fix potential crasher in transform + various other minor fixes (based on
* src/yelp-transform.c:
Fix potential crasher in transform + various
other minor fixes
(based on patch from Hans Petter Jansson - bug #469436)
* src/yelp-window.c:
Fix potential abuse of freed strings
(patch from Hans Petter Jansson - bug #469438)
svn path=/trunk/; revision=2931
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | src/yelp-transform.c | 20 | ||||
-rw-r--r-- | src/yelp-window.c | 8 |
3 files changed, 32 insertions, 5 deletions
@@ -1,5 +1,14 @@ 2007-09-05 Don Scorgie <dscorgie@svn.gnome.org> + * src/yelp-transform.c: + Fix potential crasher in transform + various + other minor fixes + (based on patch from Hans Petter Jansson - bug #469436) + + * src/yelp-window.c: + Fix potential abuse of freed strings + (patch from Hans Petter Jansson - bug #469438) + * data/icons/yelp-icon-big.png: New tango-ified version diff --git a/src/yelp-transform.c b/src/yelp-transform.c index a10a34dc..6a019b70 100644 --- a/src/yelp-transform.c +++ b/src/yelp-transform.c @@ -342,6 +342,7 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, { YelpTransform *transform; xmlChar *page_id = NULL; + gchar *temp; xmlChar *page_buf; gint buf_size; xsltStylesheetPtr style = NULL; @@ -363,9 +364,13 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, page_id = xsltEvalAttrValueTemplate (ctxt, inst, (const xmlChar *) "href", NULL); - if (page_id == NULL) { - xsltTransformError (ctxt, NULL, inst, - _("No href attribute found on yelp:document")); + if (page_id == NULL || *page_id == '\0') { + if (page_id) + xmlFree (page_id); + else + xsltTransformError (ctxt, NULL, inst, + _("No href attribute found on " + "yelp:document\n")); /* FIXME: put a real error here */ goto done; } @@ -401,10 +406,15 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, ctxt->insert = old_insert; g_mutex_lock (transform->mutex); - g_hash_table_insert (transform->chunks, page_id, page_buf); - g_async_queue_push (transform->queue, g_strdup ((gchar *) page_id)); + + temp = g_strdup (page_id); + xmlFree (page_id); + + g_async_queue_push (transform->queue, g_strdup ((gchar *) temp)); + g_hash_table_insert (transform->chunks, temp, page_buf); transform->idle_funcs++; g_idle_add ((GSourceFunc) transform_chunk, transform); + g_mutex_unlock (transform->mutex); done: diff --git a/src/yelp-window.c b/src/yelp-window.c index e8767b5a..351eba28 100644 --- a/src/yelp-window.c +++ b/src/yelp-window.c @@ -1008,6 +1008,8 @@ yelp_window_load (YelpWindow *window, const gchar *uri) doc = priv->current_document; } else { g_free (priv->base_uri); + priv->base_uri = NULL; + switch (type) { case YELP_RRN_TYPE_TOC: doc = yelp_toc_get (); @@ -1037,6 +1039,7 @@ yelp_window_load (YelpWindow *window, const gchar *uri) break; case YELP_RRN_TYPE_HTML: case YELP_RRN_TYPE_XHTML: + priv->base_uri = g_strdup ("file:///fakefile"); window_do_load_html (window, real_uri, frag_id, type, TRUE); break; case YELP_RRN_TYPE_EXTERNAL: @@ -1046,6 +1049,9 @@ yelp_window_load (YelpWindow *window, const gchar *uri) gchar *cmd = NULL; gint status = 0; GError *error = NULL; + + priv->base_uri = g_strdup ("file:///fakefile"); + cmd = g_strdup_printf ("gnome-open %s", uri); if (!g_spawn_command_line_sync (cmd, &str_stdout, &str_stderr, &status, &error)) { g_free (error); @@ -1063,8 +1069,10 @@ yelp_window_load (YelpWindow *window, const gchar *uri) return; } } + break; default: + priv->base_uri = g_strdup ("file:///fakefile"); break; } } |