Преглед изворни кода

libdpkg: Allocate parsedb_state on the heap

Guillem Jover пре 12 година
родитељ
комит
16405d6edf
2 измењених фајлова са 21 додато и 17 уклоњено
  1. 19 15
      lib/dpkg/parse.c
  2. 2 2
      lib/dpkg/parsedump.h

+ 19 - 15
lib/dpkg/parse.c

@@ -504,13 +504,14 @@ parse_get_type(struct parsedb_state *ps, enum parsedbflags flags)
 /**
  * Open a file for RFC-822 parsing.
  */
-void
-parse_open(struct parsedb_state *ps, const char *filename,
-           enum parsedbflags flags)
+struct parsedb_state *
+parse_open(const char *filename, enum parsedbflags flags)
 {
   static int fd;
+  struct parsedb_state *ps;
   struct stat st;
 
+  ps = m_malloc(sizeof(*ps));
   ps->filename = filename;
   ps->type = parse_get_type(ps, flags);
   ps->flags = flags;
@@ -549,6 +550,8 @@ parse_open(struct parsedb_state *ps, const char *filename,
 
   if (close(fd))
     ohshite(_("failed to close after read: `%.255s'"), filename);
+
+  return ps;
 }
 
 /**
@@ -686,6 +689,7 @@ parse_close(struct parsedb_state *ps)
     free(ps->data);
 #endif
   }
+  free(ps);
 }
 
 /**
@@ -703,13 +707,13 @@ int parsedb(const char *filename, enum parsedbflags flags,
   struct pkg_parse_object pkg_obj;
   int fieldencountered[array_count(fieldinfos)];
   int pdone;
-  struct parsedb_state ps;
+  struct parsedb_state *ps;
   struct field_state fs;
 
   memset(&fs, 0, sizeof(fs));
   fs.fieldencountered = fieldencountered;
 
-  parse_open(&ps, filename, flags);
+  ps = parse_open(filename, flags);
 
   new_pkg = &tmp_set.pkg;
   if (flags & pdb_recordavailable)
@@ -717,8 +721,8 @@ int parsedb(const char *filename, enum parsedbflags flags,
   else
     new_pkgbin = &new_pkg->installed;
 
-  ps.pkg = new_pkg;
-  ps.pkgbin = new_pkgbin;
+  ps->pkg = new_pkg;
+  ps->pkgbin = new_pkgbin;
 
   pkg_obj.pkg = new_pkg;
   pkg_obj.pkgbin = new_pkgbin;
@@ -730,36 +734,36 @@ int parsedb(const char *filename, enum parsedbflags flags,
     memset(fieldencountered, 0, sizeof(fieldencountered));
     pkgset_blank(&tmp_set);
 
-    if (!parse_stanza(&ps, &fs, pkg_parse_field, &pkg_obj))
+    if (!parse_stanza(ps, &fs, pkg_parse_field, &pkg_obj))
       break;
 
     if (pdone && donep)
-      parse_error(&ps,
+      parse_error(ps,
                   _("several package info entries found, only one allowed"));
 
-    pkg_parse_verify(&ps, new_pkg, new_pkgbin);
+    pkg_parse_verify(ps, new_pkg, new_pkgbin);
 
-    db_pkg = parse_find_pkg_slot(&ps, new_pkg, new_pkgbin);
+    db_pkg = parse_find_pkg_slot(ps, new_pkg, new_pkgbin);
     if (flags & pdb_recordavailable)
       db_pkgbin = &db_pkg->available;
     else
       db_pkgbin = &db_pkg->installed;
 
-    if (((flags & pdb_ignoreolder) || ps.type == pdb_file_available) &&
+    if (((flags & pdb_ignoreolder) || ps->type == pdb_file_available) &&
         dpkg_version_is_informative(&db_pkgbin->version) &&
         dpkg_version_compare(&new_pkgbin->version, &db_pkgbin->version) < 0)
       continue;
 
-    pkg_parse_copy(&ps, db_pkg, db_pkgbin, new_pkg, new_pkgbin);
+    pkg_parse_copy(ps, db_pkg, db_pkgbin, new_pkg, new_pkgbin);
 
     if (donep)
       *donep = db_pkg;
     pdone++;
-    if (parse_EOF(&ps))
+    if (parse_EOF(ps))
       break;
   }
 
-  parse_close(&ps);
+  parse_close(ps);
 
   varbuf_destroy(&fs.value);
   if (donep && !pdone) ohshit(_("no package information in `%.255s'"),filename);

+ 2 - 2
lib/dpkg/parsedump.h

@@ -68,8 +68,8 @@ struct field_state {
 	int *fieldencountered;
 };
 
-void parse_open(struct parsedb_state *ps, const char *filename,
-                enum parsedbflags flags);
+struct parsedb_state *
+parse_open(const char *filename, enum parsedbflags flags);
 void parse_close(struct parsedb_state *ps);
 
 typedef void parse_field_func(struct parsedb_state *ps, struct field_state *fs,