[yum-cvs] yum-metadata-parser xml-parser.c,1.15,1.16

James Bowes jbowes at linux.duke.edu
Tue Jul 3 03:01:38 UTC 2007


Update of /home/groups/yum/cvs/yum-metadata-parser
In directory login1.linux.duke.edu:/tmp/cvs-serv6611

Modified Files:
	xml-parser.c 
Log Message:
Fix segfault in the xml parser

Index: xml-parser.c
===================================================================
RCS file: /home/groups/yum/cvs/yum-metadata-parser/xml-parser.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- xml-parser.c	3 Jun 2007 15:38:00 -0000	1.15
+++ xml-parser.c	3 Jul 2007 03:01:36 -0000	1.16
@@ -554,6 +554,24 @@
 };
 
 void
+sax_context_init (SAXContext *sctx,
+                  const char *md_type,
+                  CountFn count_callback,
+                  PackageFn package_callback,
+                  gpointer user_data,
+                  GError **err)
+{
+    sctx->md_type = md_type;
+    sctx->error = err;
+    sctx->count_fn = count_callback;
+    sctx->package_fn = package_callback;
+    sctx->user_data = user_data;
+    sctx->current_package = NULL;
+    sctx->want_text = FALSE;
+    sctx->text_buffer = g_string_sized_new (PACKAGE_FIELD_SIZE);
+}
+
+void
 yum_xml_parse_primary (const char *filename,
                        CountFn count_callback,
                        PackageFn package_callback,
@@ -561,30 +579,25 @@
                        GError **err)
 {
     PrimarySAXContext ctx;
-    SAXContext sctx = ctx.sctx;
+    SAXContext *sctx = &ctx.sctx;
     int rc;
 
-    sctx.md_type = "primary.xml";
     ctx.state = PRIMARY_PARSER_TOPLEVEL;
-    sctx.error = err;
-    sctx.count_fn = count_callback;
-    sctx.package_fn = package_callback;
-    sctx.user_data = user_data;
-    sctx.current_package = NULL;
     ctx.current_dep_list = NULL;
     ctx.current_file = NULL;
-    sctx.want_text = FALSE;
-    sctx.text_buffer = g_string_sized_new (PACKAGE_FIELD_SIZE);
+
+    sax_context_init(sctx, "primary.xml", count_callback, package_callback,
+                     user_data, err);
 
     xmlSubstituteEntitiesDefault (1);
     rc = xmlSAXUserParseFile (&primary_sax_handler, &ctx, filename);
 
-    if (sctx.current_package) {
+    if (sctx->current_package) {
         g_warning ("Incomplete package lost");
-        package_free (sctx.current_package);
+        package_free (sctx->current_package);
     }
 
-    g_string_free (sctx.text_buffer, TRUE);
+    g_string_free (sctx->text_buffer, TRUE);
 }
 
 /*****************************************************************************/
@@ -803,33 +816,28 @@
                          GError **err)
 {
     FilelistSAXContext ctx;
-    SAXContext sctx = ctx.sctx;
+    SAXContext *sctx = &ctx.sctx;
 
     int rc;
 
-    sctx.md_type = "filelists.xml";
     ctx.state = FILELIST_PARSER_TOPLEVEL;
-    sctx.error = err;
-    sctx.count_fn = count_callback;
-    sctx.package_fn = package_callback;
-    sctx.user_data = user_data;
-    sctx.current_package = NULL;
     ctx.current_file = NULL;
-    sctx.want_text = FALSE;
-    sctx.text_buffer = g_string_sized_new (PACKAGE_FIELD_SIZE);
+    
+    sax_context_init(sctx, "filelists.xml", count_callback, package_callback,
+                     user_data, err);
 
     xmlSubstituteEntitiesDefault (1);
     rc = xmlSAXUserParseFile (&filelist_sax_handler, &ctx, filename);
 
-    if (sctx.current_package) {
+    if (sctx->current_package) {
         g_warning ("Incomplete package lost");
-        package_free (sctx.current_package);
+        package_free (sctx->current_package);
     }
 
     if (ctx.current_file)
         g_free (ctx.current_file);
 
-    g_string_free (sctx.text_buffer, TRUE);
+    g_string_free (sctx->text_buffer, TRUE);
 }
 
 /*****************************************************************************/
@@ -1031,31 +1039,26 @@
                      GError **err)
 {
     OtherSAXContext ctx;
-    SAXContext sctx = ctx.sctx;
+    SAXContext *sctx = &ctx.sctx;
 
     int rc;
 
-    sctx.md_type = "other.xml";
     ctx.state = OTHER_PARSER_TOPLEVEL;
-    sctx.error = err;
-    sctx.count_fn = count_callback;
-    sctx.package_fn = package_callback;
-    sctx.user_data = user_data;
-    sctx.current_package = NULL;
     ctx.current_entry = NULL;
-    sctx.want_text = FALSE;
-    sctx.text_buffer = g_string_sized_new (PACKAGE_FIELD_SIZE);
+    
+    sax_context_init(sctx, "other.xml", count_callback, package_callback,
+                     user_data, err);
 
     xmlSubstituteEntitiesDefault (1);
     rc = xmlSAXUserParseFile (&other_sax_handler, &ctx, filename);
 
-    if (sctx.current_package) {
+    if (sctx->current_package) {
         g_warning ("Incomplete package lost");
-        package_free (sctx.current_package);
+        package_free (sctx->current_package);
     }
 
     if (ctx.current_entry)
         g_free (ctx.current_entry);
 
-    g_string_free (sctx.text_buffer, TRUE);
+    g_string_free (sctx->text_buffer, TRUE);
 }




More information about the Yum-cvs-commits mailing list