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]

Reply via email to