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]