summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDon Scorgie <dscorgie@src.gnome.org>2007-09-05 18:28:57 +0000
committerDon Scorgie <dscorgie@src.gnome.org>2007-09-05 18:28:57 +0000
commit896371aacee702ce3aa9c099259bf3a2a793ec43 (patch)
tree6a6d9e4e63827a3745f72ce08355d18dd2719c8e
parent5962bc3431fa525983056179955eef23e066ef55 (diff)
downloadyelp-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--ChangeLog9
-rw-r--r--src/yelp-transform.c20
-rw-r--r--src/yelp-window.c8
3 files changed, 32 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 12cc3277..810f15e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}
}