Fix memory leak of errors GString
authorJakub Zawadzki <darkjames-ws@darkjames.pl>
Fri, 27 Jul 2012 08:45:53 +0000 (08:45 -0000)
committerJakub Zawadzki <darkjames-ws@darkjames.pl>
Fri, 27 Jul 2012 08:45:53 +0000 (08:45 -0000)
Valgrind log:
  = 308 (264 direct, 44 indirect) bytes in 11 blocks are definitely lost in loss record 39,914 of 41,651
  =    at 0x4C26ABB: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
  =    by 0xC5B0574: g_malloc (in /usr/lib64/libglib-2.0.so.0.2800.8)
  =    by 0xC5C94DF: g_slice_alloc (in /usr/lib64/libglib-2.0.so.0.2800.8)
  =    by 0xC5CEC52: g_string_sized_new (in /usr/lib64/libglib-2.0.so.0.2800.8)
  =    by 0x6A723C5: proto_register_xml (packet-xml.c:1249)

svn path=/trunk/; revision=44064

epan/dissectors/packet-xml.c

index 5bb4c199d3df52ff5cc0799d7f5893df0b15c890..9fa31818ed39cb2e0403c1813ff7cc1f83bc7e85 100644 (file)
@@ -1238,18 +1238,21 @@ static void init_xml_names(void) {
        }
 
        if (test_for_directory(dirname) == EISDIR) {
-
                if ((dir = OPENDIR_OP(dirname)) != NULL) {
+                       GString* errors = g_string_new("");
+
                        while ((file = DIRGETNEXT_OP(dir)) != NULL) {
                                guint namelen;
                                filename = GETFNAME_OP(file);
 
                                namelen = (int)strlen(filename);
                                if ( namelen > 4 && ( g_ascii_strcasecmp(filename+(namelen-4),".dtd")  == 0 ) ) {
-                                       GString* errors = g_string_new("");
-                                       GString* preparsed = dtd_preparse(dirname, filename, errors);
+                                       GString* preparsed;
                                        dtd_build_data_t* dtd_data;
 
+                                       g_string_truncate(errors, 0);
+                                       preparsed = dtd_preparse(dirname, filename, errors);
+
                                        if (errors->len) {
                                                report_failure("Dtd Preparser in file %s%c%s: %s",dirname,G_DIR_SEPARATOR,filename,errors->str);
                                                continue;
@@ -1269,11 +1272,11 @@ static void init_xml_names(void) {
 
                                        if (errors->len) {
                                                report_failure("Dtd Registration in file: %s%c%s: %s",dirname,G_DIR_SEPARATOR,filename,errors->str);
-                                               g_string_free(errors,TRUE);
                                                continue;
                                        }
                                }
                        }
+                       g_string_free(errors,TRUE);
 
                        CLOSEDIR_OP(dir);
                }