The following commit has been merged in the master branch:
commit dac5e30555191203129e309dbed5e823c95620a6
Author: Guillem Jover <[email protected]>
Date:   Fri Sep 18 15:45:57 2009 +0200

    Use varbuf instead of ad-hoc handling of growing strings

diff --git a/dpkg-deb/info.c b/dpkg-deb/info.c
index 09c8a5b..c9b89e0 100644
--- a/dpkg-deb/info.c
+++ b/dpkg-deb/info.c
@@ -93,21 +93,18 @@ static int ilist_select(const struct dirent *de) {
 static void info_spew(const char *debar, const char *directory,
                       const char *const *argv) {
   const char *component;
-  size_t pathlen;
-  char *controlfile = NULL;
+  struct varbuf controlfile = VARBUF_INIT;
   FILE *co;
   int re= 0;
 
   while ((component = *argv++) != NULL) {
-    pathlen = strlen(directory) + strlen(component) + 2;
-    controlfile = m_realloc(controlfile, pathlen);
-    memset(controlfile, 0, sizeof(controlfile));
-
-    strcat(controlfile, directory);
-    strcat(controlfile, "/");
-    strcat(controlfile, component);
-    co= fopen(controlfile,"r");
+    varbufreset(&controlfile);
+    varbufaddstr(&controlfile, directory);
+    varbufaddc(&controlfile, '/');
+    varbufaddstr(&controlfile, component);
+    varbufaddc(&controlfile, '\0');
 
+    co = fopen(controlfile.buf, "r");
     if (co) {
       stream_fd_copy(co, 1, -1, _("info_spew"));
     } else if (errno == ENOENT) {
@@ -120,7 +117,8 @@ static void info_spew(const char *debar, const char 
*directory,
              component, directory);
     }
   }
-  free(controlfile);
+  varbuffree(&controlfile);
+
   if (re==1)
     ohshit(_("One requested control component is missing"));
   else if (re>1)
diff --git a/lib/dpkg/fields.c b/lib/dpkg/fields.c
index 641dfb7..0f21fe1 100644
--- a/lib/dpkg/fields.c
+++ b/lib/dpkg/fields.c
@@ -302,8 +302,7 @@ void f_dependency(struct pkginfo *pigp, struct 
pkginfoperfile *pifp,
   const char *p, *emsg;
   const char *depnamestart, *versionstart;
   int depnamelength, versionlength;
-  static int depnameused= 0, versionused= 0;
-  static char *depname= NULL, *version= NULL;
+  static struct varbuf depname, version;
 
   struct dependency *dyp, **ldypp;
   struct deppossi *dop, **ldopp;
@@ -326,24 +325,21 @@ void f_dependency(struct pkginfo *pigp, struct 
pkginfoperfile *pifp,
        p++;
       }
       depnamelength= p - depnamestart ;
-      if (depnamelength >= depnameused) {
-       depnameused= depnamelength;
-        depname = m_realloc(depname, depnamelength + 1);
-      }
-      strncpy(depname, depnamestart, depnamelength);
-      *(depname + depnamelength) = '\0';
-      if (!*depname)
+      varbufreset(&depname);
+      varbufaddbuf(&depname, depnamestart, depnamelength);
+      varbufaddc(&depname, '\0');
+      if (!depname.buf[0])
         parse_error(ps, pigp,
                     _("`%s' field, missing package name, or garbage where "
                       "package name expected"), fip->name);
-      emsg= illegal_packagename(depname,NULL);
+      emsg = illegal_packagename(depname.buf, NULL);
       if (emsg)
         parse_error(ps, pigp,
                     _("`%s' field, invalid package name `%.255s': %s"),
-                    fip->name, depname, emsg);
+                    fip->name, depname.buf, emsg);
       dop= nfmalloc(sizeof(struct deppossi));
       dop->up= dyp;
-      dop->ed= findpackage(depname);
+      dop->ed = findpackage(depname.buf);
       dop->next= NULL; *ldopp= dop; ldopp= &dop->next;
       dop->nextrev= NULL; /* Don't link this (which is after all only `newpig' 
from */
       dop->backrev= NULL; /* the main parsing loop in parsedb) into the 
depended on
@@ -371,13 +367,13 @@ void f_dependency(struct pkginfo *pigp, struct 
pkginfoperfile *pifp,
             parse_error(ps, pigp,
                         _("`%s' field, reference to `%.255s':\n"
                           " bad version relationship %c%c"),
-                        fip->name, depname, c1, c2);
+                        fip->name, depname.buf, c1, c2);
             dop->verrel= dvr_none;
           } else {
             parse_warn(ps, pigp,
                        _("`%s' field, reference to `%.255s':\n"
                          " `%c' is obsolete, use `%c=' or `%c%c' instead"),
-                       fip->name, depname, c1, c1, c1, c1);
+                       fip->name, depname.buf, c1, c1, c1, c1);
             dop->verrel |= (dvrf_orequal | dvrf_builtup);
           }
         } else if (c1 == '=') {
@@ -388,7 +384,7 @@ void f_dependency(struct pkginfo *pigp, struct 
pkginfoperfile *pifp,
                      _("`%s' field, reference to `%.255s':\n"
                        " implicit exact match on version number, "
                        "suggest using `=' instead"),
-                     fip->name, depname);
+                     fip->name, depname.buf);
           dop->verrel= dvr_exact;
         }
        if ((dop->verrel!=dvr_exact) && (fip->integer==dep_provides))
@@ -400,7 +396,7 @@ void f_dependency(struct pkginfo *pigp, struct 
pkginfoperfile *pifp,
                      _("`%s' field, reference to `%.255s':\n"
                        " version value starts with non-alphanumeric, "
                        "suggest adding a space"),
-                     fip->name, depname);
+                     fip->name, depname.buf);
         }
 /* skip spaces between the relation and the version */
         while (isspace(*p)) p++;
@@ -415,26 +411,24 @@ void f_dependency(struct pkginfo *pigp, struct 
pkginfoperfile *pifp,
         if (*p == '(')
           parse_error(ps, pigp,
                       _("`%s' field, reference to `%.255s': "
-                        "version contains `%c'"), fip->name,depname, ')');
+                        "version contains `%c'"), fip->name, depname.buf, ')');
         else if (*p != ')')
           parse_error(ps, pigp,
                       _("`%s' field, reference to `%.255s': "
-                        "version contains `%c'"), fip->name,depname, ' ');
+                        "version contains `%c'"), fip->name, depname.buf, ' ');
         else if (*p == '\0')
           parse_error(ps, pigp,
                       _("`%s' field, reference to `%.255s': "
-                        "version unterminated"), fip->name, depname);
-       if (versionlength >=  versionused) {
-         versionused= versionlength;
-          version = m_realloc(version, versionlength + 1);
-       }
-       strncpy(version,  versionstart, versionlength);
-        *(version + versionlength) = '\0';
-        emsg= parseversion(&dop->version,version);
+                        "version unterminated"), fip->name, depname.buf);
+        varbufreset(&version);
+        varbufaddbuf(&version, versionstart, versionlength);
+        varbufaddc(&version, '\0');
+        emsg = parseversion(&dop->version, version.buf);
         if (emsg)
           parse_error(ps, pigp,
                       _("`%s' field, reference to `%.255s': "
-                        "error in version: %.255s"), fip->name, depname, emsg);
+                        "error in version: %.255s"),
+                      fip->name, depname.buf, emsg);
         p++; while (isspace(*p)) p++;
       } else {
         dop->verrel= dvr_none;
@@ -461,10 +455,7 @@ void f_dependency(struct pkginfo *pigp, struct 
pkginfoperfile *pifp,
 static const char *
 scan_word(const char **valp)
 {
-  static char *buf;
-  static int avail;
-
-  int l;
+  static struct varbuf word;
   const char *p, *start, *end;
 
   p = *valp;
@@ -488,16 +479,14 @@ scan_word(const char **valp)
     end = p;
     break;
   }
-  l = end - start;
-  if (l >= avail) {
-    avail = l * 2 + 4;
-    buf = m_realloc(buf, avail);
-  }
-  memcpy(buf, start, l);
-  buf[l] = '\0';
+
+  varbufreset(&word);
+  varbufaddbuf(&word, start, end - start);
+  varbufaddc(&word, '\0');
+
   *valp = p;
 
-  return buf;
+  return word.buf;
 }
 
 void

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to