RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: [EMAIL PROTECTED]
Module: rpm Date: 02-Apr-2008 22:34:18
Branch: HEAD Handle: 2008040220341701
Modified files:
rpm CHANGES
rpm/build parsePreamble.c parseSpec.c rpmspec.h spec.c
rpm/lib rpmchecksig.c rpmlock.c
Log:
- jbj: fix: RPMTAG_NVRA w .src/.pubkey in error msg is bogus.
- jbj: permit noarch sub-packages. Pattern match guaranteee next ...
- rpm.org: Enhance error message on failed ts lock acquire (rhbz#427064).
- jbj: fix the rpm.org memory leak.
- rpm.org: Don't use static buffers to communicate between funcs, avoid
buffer overflows.
- rpm.org: Use more meaningful variable names than res2 and res3.
- rpm.org: Make signature verification result not depend on rpm verbosity
level, ick.
Summary:
Revision Changes Path
1.2277 +7 -0 rpm/CHANGES
2.171 +44 -24 rpm/build/parsePreamble.c
2.133 +24 -12 rpm/build/parseSpec.c
2.75 +2 -0 rpm/build/rpmspec.h
2.185 +1 -0 rpm/build/spec.c
1.215 +51 -59 rpm/lib/rpmchecksig.c
2.18 +4 -2 rpm/lib/rpmlock.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.2276 -r1.2277 CHANGES
--- rpm/CHANGES 2 Apr 2008 19:12:05 -0000 1.2276
+++ rpm/CHANGES 2 Apr 2008 20:34:17 -0000 1.2277
@@ -1,4 +1,11 @@
5.0.0 -> 5.1a1:
+ - jbj: fix: RPMTAG_NVRA w .src/.pubkey in error msg is bogus.
+ - jbj: permit noarch sub-packages. Pattern match guaranteee next ...
+ - rpm.org: Enhance error message on failed ts lock acquire (rhbz#427064).
+ - jbj: fix the rpm.org memory leak.
+ - rpm.org: Don't use static buffers to communicate between funcs, avoid
buffer overflows.
+ - rpm.org: Use more meaningful variable names than res2 and res3.
+ - rpm.org: Make signature verification result not depend on rpm
verbosity level, ick.
- rse: upgraded build environment to use GNU libtool 2.2.2
- rse: replace %as format specifier with malloc(3) plus %s under
non-GLIBC sscanf(3)
- rse: various code cleanups related to pre-processor macros and C types
@@ .
patch -p0 <<'@@ .'
Index: rpm/build/parsePreamble.c
============================================================================
$ cvs diff -u -r2.170 -r2.171 parsePreamble.c
--- rpm/build/parsePreamble.c 11 Mar 2008 12:24:25 -0000 2.170
+++ rpm/build/parsePreamble.c 2 Apr 2008 20:34:17 -0000 2.171
@@ -82,7 +82,7 @@
}
/* Parse a simple part line that only take -n <pkg> or <pkg> */
-/* <pkg> is return in name as a pointer into a static buffer */
+/* <pkg> is returned in name as a pointer into malloc'd storage. */
/**
*/
@@ -91,31 +91,32 @@
/[EMAIL PROTECTED] [EMAIL PROTECTED]/
/[EMAIL PROTECTED] *name, *flag, internalState @*/
{
+ char * linebuf = xstrdup(line);
char *tok;
- char linebuf[BUFSIZ];
- static char buf[BUFSIZ];
-
- strcpy(linebuf, line);
+ int rc = 0; /* assume failure */
/* Throw away the first token (the %xxxx) */
(void)strtok(linebuf, " \t\n");
- if (!(tok = strtok(NULL, " \t\n"))) {
- *name = NULL;
- return 0;
- }
+ *name = NULL;
+ if (!(tok = strtok(NULL, " \t\n")))
+ goto exit;
if (!strcmp(tok, "-n")) {
- if (!(tok = strtok(NULL, " \t\n")))
- return 1;
+ if (!(tok = strtok(NULL, " \t\n"))) {
+ rc = 1;
+ goto exit;
+ }
*flag = PART_NAME;
- } else {
+ } else
*flag = PART_SUBNAME;
- }
- strcpy(buf, tok);
- *name = buf;
- return (strtok(NULL, " \t\n")) ? 1 : 0;
+ *name = xstrdup(tok);
+ rc = (strtok(NULL, " \t\n") ? 1 : 0);
+
+exit:
+ linebuf = _free(linebuf);
+ return rc;
}
/**
@@ -784,18 +785,34 @@
case RPMTAG_EXCLUSIVEOS:
addOrAppendListEntry(spec->sourceHeader, tag, field);
break;
+
case RPMTAG_BUILDARCHS:
- if ((rc = poptParseArgvString(field,
- &(spec->BACount),
- &(spec->BANames)))) {
+ { const char ** BANames = NULL;
+ int BACount = 0;
+ if ((rc = poptParseArgvString(field, &BACount, &BANames))) {
rpmlog(RPMLOG_ERR,
_("line %d: Bad BuildArchitecture format: %s\n"),
spec->lineNum, spec->line);
return RPMRC_FAIL;
}
- if (!spec->BACount)
- spec->BANames = _free(spec->BANames);
- break;
+ if (spec->toplevel) {
+ if (BACount > 0 && BANames != NULL) {
+ spec->BACount = BACount;
+ spec->BANames = BANames;
+ BANames = NULL; /* XXX don't free. */
+ }
+ } else {
+ if (BACount != 1 || strcmp(BANames[0], "noarch")) {
+ rpmlog(RPMLOG_ERR,
+ _("line %d: Only \"noarch\" sub-packages are supported:
%s\n"),
+ spec->lineNum, spec->line);
+ BANames = _free(BANames);
+ return RPMRC_FAIL;
+ }
+ pkg->noarch = 1;
+ }
+ BANames = _free(BANames);
+ } break;
default:
macro = NULL;
@@ -992,7 +1009,7 @@
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
rpmParseState nextPart;
int xx;
- char *name, *linep;
+ char *linep;
Package pkg;
char NVR[BUFSIZ];
char lang[BUFSIZ];
@@ -1003,6 +1020,7 @@
pkg = newPackage(spec);
if (! initialPackage) {
+ char *name = NULL;
rpmParseState flag;
/* There is one option to %package: <pkg> or -n <pkg> */
flag = PART_NONE;
@@ -1015,6 +1033,7 @@
if (lookupPackage(spec, name, flag, NULL) == RPMRC_OK) {
rpmlog(RPMLOG_ERR, _("Package already exists: %s\n"),
spec->line);
+ name = _free(name);
return RPMRC_FAIL;
}
@@ -1026,6 +1045,7 @@
he->p.ptr = _free(he->p.ptr);
} else
strcpy(NVR, name);
+ name = _free(name);
he->tag = RPMTAG_NAME;
he->t = RPM_STRING_TYPE;
he->p.str = NVR;
@@ -1053,7 +1073,7 @@
}
if (handlePreambleTag(spec, pkg, tag, macro, lang))
return RPMRC_FAIL;
- if (spec->BANames && !spec->recursing)
+ if (spec->BANames && !spec->recursing && spec->toplevel)
return PART_BUILDARCHITECTURES;
}
if ((rc =
@@ .
patch -p0 <<'@@ .'
Index: rpm/build/parseSpec.c
============================================================================
$ cvs diff -u -r2.132 -r2.133 parseSpec.c
--- rpm/build/parseSpec.c 10 Mar 2008 04:46:10 -0000 2.132
+++ rpm/build/parseSpec.c 2 Apr 2008 20:34:17 -0000 2.133
@@ -511,6 +511,7 @@
spec->fileStack->fileName = xstrdup(spec->specFile);
spec->recursing = recursing;
+ spec->toplevel = (!recursing ? 1 : 0);
spec->anyarch = anyarch;
spec->force = force;
@@ -533,6 +534,7 @@
/[EMAIL PROTECTED]@*/ /* LCL: parsePart is modified @*/
while (parsePart > PART_NONE) {
int goterror = 0;
+
switch (parsePart) {
default:
goterror = 1;
@@ -588,7 +590,12 @@
return parsePart;
}
- if (parsePart == PART_BUILDARCHITECTURES) {
+ /* Detect whether BuildArch: is toplevel or within %package. */
+ if (spec->toplevel && parsePart != PART_BUILDARCHITECTURES)
+ spec->toplevel = 0;
+
+ /* Restart parse iff toplevel BuildArch: is encountered. */
+ if (spec->toplevel && parsePart == PART_BUILDARCHITECTURES) {
int index;
int x;
@@ -660,25 +667,16 @@
const char *os = rpmExpand("%{_target_os}", NULL);
for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
- if (!headerIsEntry(pkg->header, RPMTAG_DESCRIPTION)) {
- he->tag = RPMTAG_NVRA;
- xx = headerGet(pkg->header, he, 0);
- rpmlog(RPMLOG_ERR, _("Package has no %%description: %s\n"),
- he->p.str);
- he->p.ptr = _free(he->p.ptr);
- spec = freeSpec(spec);
- return RPMRC_FAIL;
- }
-
he->tag = RPMTAG_OS;
he->t = RPM_STRING_TYPE;
+ /* XXX todo: really need "noos" like pkg->noarch somewhen. */
he->p.str = os;
he->c = 1;
xx = headerPut(pkg->header, he, 0);
he->tag = RPMTAG_ARCH;
he->t = RPM_STRING_TYPE;
- he->p.str = arch;
+ he->p.str = (pkg->noarch ? "noarch" : arch);
he->c = 1;
xx = headerPut(pkg->header, he, 0);
@@ -688,6 +686,20 @@
he->c = 1;
xx = headerPut(pkg->header, he, 0);
+ if (!headerIsEntry(pkg->header, RPMTAG_DESCRIPTION)) {
+ char * t;
+ he->tag = RPMTAG_NVRA;
+ xx = headerGet(pkg->header, he, 0);
+ /* sourcerpm not added, so ".src" returned. Hack around for now. */
+ if ((t = strstr(he->p.str, ".src")) != NULL)
+ *t = '\0';
+ rpmlog(RPMLOG_ERR, _("Package has no %%description: %s\n"),
+ he->p.str);
+ he->p.ptr = _free(he->p.ptr);
+ spec = freeSpec(spec);
+ return RPMRC_FAIL;
+ }
+
pkg->ds = rpmdsThis(pkg->header, RPMTAG_REQUIRENAME, RPMSENSE_EQUAL);
}
@@ .
patch -p0 <<'@@ .'
Index: rpm/build/rpmspec.h
============================================================================
$ cvs diff -u -r2.74 -r2.75 rpmspec.h
--- rpm/build/rpmspec.h 2 Mar 2008 00:22:02 -0000 2.74
+++ rpm/build/rpmspec.h 2 Apr 2008 20:34:17 -0000 2.75
@@ -138,6 +138,7 @@
const char ** BANames;
int BACount;
int recursing; /*!< parse is recursive? */
+ int toplevel;
int force;
int anyarch;
@@ -201,6 +202,7 @@
int autoReq;
int autoProv;
+ int noarch;
/[EMAIL PROTECTED]@*/
const char * preInFile; /*!< %pre scriptlet. */
@@ .
patch -p0 <<'@@ .'
Index: rpm/build/spec.c
============================================================================
$ cvs diff -u -r2.184 -r2.185 spec.c
--- rpm/build/spec.c 12 Mar 2008 19:41:10 -0000 2.184
+++ rpm/build/spec.c 2 Apr 2008 20:34:17 -0000 2.185
@@ -527,6 +527,7 @@
spec->BANames = NULL;
spec->BACount = 0;
spec->recursing = 0;
+ spec->toplevel = 1;
spec->BASpecs = NULL;
spec->force = 0;
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/rpmchecksig.c
============================================================================
$ cvs diff -u -r1.214 -r1.215 rpmchecksig.c
--- rpm/lib/rpmchecksig.c 12 Mar 2008 19:41:11 -0000 1.214
+++ rpm/lib/rpmchecksig.c 2 Apr 2008 20:34:18 -0000 1.215
@@ -855,7 +855,6 @@
{
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
HE_t she = memset(alloca(sizeof(*she)), 0, sizeof(*she));
- int res2, res3;
char result[1024];
char buf[8192], * b;
char missingKeys[7164], * m;
@@ -867,7 +866,8 @@
const char * msg = NULL;
int res = 0;
int xx;
- rpmRC rc;
+ rpmRC rc, sigres;
+ int failed;
int nodigests = !(qva->qva_flags & VERIFY_DIGEST);
int nosignatures = !(qva->qva_flags & VERIFY_SIGNATURE);
@@ -950,7 +950,7 @@
goto exit;
}
- res2 = 0;
+ failed = 0;
b = buf; *b = '\0';
m = missingKeys; *m = '\0';
u = untrustedKeys; *u = '\0';
@@ -1004,64 +1004,56 @@
/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ break;
}
- res3 = rpmVerifySignature(dig, result);
+ sigres = rpmVerifySignature(dig, result);
- if (res3) {
- if (rpmIsVerbose()) {
+ if (sigres) {
+ failed = 1;
+ if (rpmIsVerbose())
b = stpcpy( stpcpy( stpcpy(b, " "), result), "\n");
- res2 = 1;
- } else {
- switch ((rpmSigTag)she->tag) {
- case RPMSIGTAG_SIZE:
- b = stpcpy(b, "SIZE ");
- res2 = 1;
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_SHA1:
- b = stpcpy(b, "SHA1 ");
- res2 = 1;
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_MD5:
- b = stpcpy(b, "MD5 ");
- res2 = 1;
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_RSA:
- b = stpcpy(b, "RSA ");
- res2 = 1;
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_DSA:
- b = stpcpy(b, "(SHA1) DSA ");
- res2 = 1;
- /[EMAIL PROTECTED]@*/ break;
- default:
- b = stpcpy(b, "?UnknownSignatureType? ");
- res2 = 1;
- /[EMAIL PROTECTED]@*/ break;
- }
+ else
+ switch ((rpmSigTag)she->tag) {
+ case RPMSIGTAG_SIZE:
+ b = stpcpy(b, "SIZE ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_SHA1:
+ b = stpcpy(b, "SHA1 ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_MD5:
+ b = stpcpy(b, "MD5 ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_RSA:
+ b = stpcpy(b, "RSA ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_DSA:
+ b = stpcpy(b, "(SHA1) DSA ");
+ /[EMAIL PROTECTED]@*/ break;
+ default:
+ b = stpcpy(b, "?UnknownSignatureType? ");
+ /[EMAIL PROTECTED]@*/ break;
}
} else {
- if (rpmIsVerbose()) {
+ if (rpmIsVerbose())
b = stpcpy( stpcpy( stpcpy(b, " "), result), "\n");
- } else {
- switch ((rpmSigTag)she->tag) {
- case RPMSIGTAG_SIZE:
- b = stpcpy(b, "size ");
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_SHA1:
- b = stpcpy(b, "sha1 ");
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_MD5:
- b = stpcpy(b, "md5 ");
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_RSA:
- b = stpcpy(b, "rsa ");
- /[EMAIL PROTECTED]@*/ break;
- case RPMSIGTAG_DSA:
- b = stpcpy(b, "(sha1) dsa ");
- /[EMAIL PROTECTED]@*/ break;
- default:
- b = stpcpy(b, "??? ");
- /[EMAIL PROTECTED]@*/ break;
- }
+ else
+ switch ((rpmSigTag)she->tag) {
+ case RPMSIGTAG_SIZE:
+ b = stpcpy(b, "size ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_SHA1:
+ b = stpcpy(b, "sha1 ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_MD5:
+ b = stpcpy(b, "md5 ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_RSA:
+ b = stpcpy(b, "rsa ");
+ /[EMAIL PROTECTED]@*/ break;
+ case RPMSIGTAG_DSA:
+ b = stpcpy(b, "(sha1) dsa ");
+ /[EMAIL PROTECTED]@*/ break;
+ default:
+ b = stpcpy(b, "??? ");
+ /[EMAIL PROTECTED]@*/ break;
}
}
}
@@ -1071,14 +1063,14 @@
xx = pgpSetSig(dig, 0, 0, NULL, 0);
/[EMAIL PROTECTED]@*/
- res += res2;
+ res += failed;
- if (res2) {
+ if (failed) {
if (rpmIsVerbose()) {
rpmlog(RPMLOG_NOTICE, "%s", buf);
} else {
rpmlog(RPMLOG_NOTICE, "%s%s%s%s%s%s%s%s\n", buf,
- _("NOT OK"),
+ _("NOT_OK"),
(missingKeys[0] != '\0') ? _(" (MISSING KEYS:") : "",
missingKeys,
(missingKeys[0] != '\0') ? _(") ") : "",
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/rpmlock.c
============================================================================
$ cvs diff -u -r2.17 -r2.18 rpmlock.c
--- rpm/lib/rpmlock.c 19 Nov 2007 18:57:54 -0000 2.17
+++ rpm/lib/rpmlock.c 2 Apr 2008 20:34:18 -0000 2.18
@@ -147,7 +147,8 @@
if (rc) {
if (rpmlock_path != NULL && strcmp(rpmlock_path, rootDir))
rpmlog(RPMLOG_ERR,
- _("can't create transaction lock on %s\n"), rpmlock_path);
+ _("can't create transaction lock on %s (%s)\n"),
+ rpmlock_path, strerror(errno));
} else if (lock != NULL) {
if (!rpmlock_acquire(lock, RPMLOCK_WRITE)) {
if (lock->omode & RPMLOCK_WRITE)
@@ -156,7 +157,8 @@
if (!rpmlock_acquire(lock, RPMLOCK_WRITE|RPMLOCK_WAIT)) {
if (rpmlock_path != NULL && strcmp(rpmlock_path, rootDir))
rpmlog(RPMLOG_ERR,
- _("can't create transaction lock on %s\n"),
rpmlock_path);
+ _("can't create transaction lock on %s (%s)\n"),
+ rpmlock_path, strerror(errno));
lock = rpmlock_free(lock);
}
}
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository [email protected]