pkgsrc-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
pkg/37031: realloc failing in audit-packages
>Number: 37031
>Category: pkg
>Synopsis: realloc failing in audit-packages
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: pkg-manager
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Sep 26 21:00:00 +0000 2007
>Originator: David A. Holland <dholland%eecs.harvard.edu@localhost>
>Release: NetBSD 2.1.0_STABLE
>Organization:
Harvard EECS
>Environment:
System: NetBSD bantha 2.1.0_STABLE NetBSD 2.1.0_STABLE (GENERIC) #3: Fri Dec 1
14:58:15 EST 2006 root@bantha:/usr/src/sys/arch/i386/compile/GENERIC i386
Architecture: i386
Machine: i386
>Description:
audit-packages from pkg_install-20070916 bombs with
audit-packages: mkver realloc failed: Cannot allocate memory
>How-To-Repeat:
Update, build, install, run.
>Fix:
The problem turns out to be that it's doubling the size of an array
every time it adds one element. So, don't do that.
Index: files/lib/dewey.c
===================================================================
RCS file: /cvsroot/pkgsrc/pkgtools/pkg_install/files/lib/dewey.c,v
retrieving revision 1.7
diff -u -p -r1.7 dewey.c
--- files/lib/dewey.c 16 Sep 2007 19:03:52 -0000 1.7
+++ files/lib/dewey.c 26 Sep 2007 19:09:07 -0000
@@ -110,6 +110,28 @@ dewey_mktest(int *op, const char *test)
}
/*
+ * add to arr_t
+ */
+static void
+addcomponent(arr_t *ap, int x)
+{
+ if (ap->c >= ap->size) {
+ if (ap->size == 0) {
+ ap->size = 62;
+ if ((ap->v = malloc(ap->size * sizeof(int))) == NULL)
+ err(EXIT_FAILURE, "mkver malloc failed");
+ } else {
+ ap->size *= 2;
+ if ((ap->v = realloc(ap->v, ap->size * sizeof(int)))
+ == NULL)
+ err(EXIT_FAILURE, "mkver realloc failed");
+ }
+ }
+
+ ap->v[ap->c++] = x;
+}
+
+/*
* make a component of a version number.
* '.' encodes as Dot which is '0'
* '_' encodes as 'patch level', or 'Dot', which is 0.
@@ -127,25 +149,16 @@ mkcomponent(arr_t *ap, const char *num)
int n;
const char *cp;
- if (ap->size == 0) {
- ap->size = 62;
- if ((ap->v = malloc(ap->size * sizeof(int))) == NULL)
- err(EXIT_FAILURE, "mkver malloc failed");
- } else {
- ap->size *= 2;
- if ((ap->v = realloc(ap->v, ap->size * sizeof(int))) == NULL)
- err(EXIT_FAILURE, "mkver realloc failed");
- }
if (isdigit((unsigned char)*num)) {
for (cp = num, n = 0 ; isdigit((unsigned char)*num) ; num++) {
n = (n * 10) + (*num - '0');
}
- ap->v[ap->c++] = n;
+ addcomponent(ap, n);
return (int)(num - cp);
}
for (modp = modifiers ; modp->s ; modp++) {
if (strncasecmp(num, modp->s, modp->len) == 0) {
- ap->v[ap->c++] = modp->t;
+ addcomponent(ap, modp->t);
return modp->len;
}
}
@@ -157,12 +170,9 @@ mkcomponent(arr_t *ap, const char *num)
return (int)(num - cp);
}
if (isalpha((unsigned char)*num)) {
- ap->v[ap->c++] = Dot;
+ addcomponent(ap, Dot);
cp = strchr(alphas, tolower((unsigned char)*num));
- ap->size *= 2;
- if ((ap->v = realloc(ap->v, ap->size * sizeof(int))) == NULL)
- err(EXIT_FAILURE, "mkver realloc failed");
- ap->v[ap->c++] = (int)(cp - alphas) + 1;
+ addcomponent(ap, (int)(cp - alphas) + 1);
return 1;
}
return 1;
Home |
Main Index |
Thread Index |
Old Index