RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  j...@rpm5.org
  Module: rpm                              Date:   13-Jun-2009 11:07:44
  Branch: HEAD                             Handle: 2009061309074400

  Modified files:
    rpm                     CHANGES
    rpm/build               parseReqs.c

  Log:
    - rpmbuild: fix: ensure dependency EVR strings have only 0 or 1
    dashes.

  Summary:
    Revision    Changes     Path
    1.3022      +1  -0      rpm/CHANGES
    2.57        +60 -39     rpm/build/parseReqs.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3021 -r1.3022 CHANGES
  --- rpm/CHANGES       13 Jun 2009 02:34:24 -0000      1.3021
  +++ rpm/CHANGES       13 Jun 2009 09:07:44 -0000      1.3022
  @@ -1,5 +1,6 @@
   
   5.2b1 -> 5.3a1
  +    - jbj: rpmbuild: fix: ensure dependency EVR strings have only 0 or 1 
dashes.
       - jbj: augeas: add aug_init() and aug_close() calls to the rpmaug 
wrapper.
       - jbj: js: stub-in a Aug class.
       - jbj: augeas: stub-in rpmaug object with ctors/dtors.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/parseReqs.c
  ============================================================================
  $ cvs diff -u -r2.56 -r2.57 parseReqs.c
  --- rpm/build/parseReqs.c     5 Jan 2009 00:44:05 -0000       2.56
  +++ rpm/build/parseReqs.c     13 Jun 2009 09:07:44 -0000      2.57
  @@ -20,10 +20,14 @@
   rpmRC parseRCPOT(Spec spec, Package pkg, const char *field, rpmTag tagN,
               rpmuint32_t index, rpmsenseFlags tagflags)
   {
  +    EVR_t evr = alloca(sizeof(*evr));
       const char *r, *re, *v, *ve;
  -    char * N, * EVR;
  +    char * N = NULL;
  +    char * EVR = NULL;
       rpmsenseFlags Flags;
       Header h;
  +    rpmRC rc = RPMRC_FAIL;   /* assume failure */
  +    int ix;
   
       switch (tagN) {
       case RPMTAG_PROVIDEFLAGS:
  @@ -95,24 +99,26 @@
   
        Flags = (tagflags & ~RPMSENSE_SENSEMASK);
   
  -     /* Tokens must begin with alphanumeric, _, or / */
  -     nr = strlen(r);
  -     if (!(xisalnum(r[0]) || r[0] == '_' || r[0] == '/'
  -      || (nr > 2 && r[0] == '!')
  -      || (nr > 3 && r[0] == '%' && r[1] == '{' && r[nr-1] == '}')))
  -     {
  -         rpmlog(RPMLOG_ERR,
  -                  _("line %d: Dependency \"%s\" must begin with 
alpha-numeric, '_' or '/': %s\n"),
  -                  spec->lineNum, spec->line, r);
  -         return RPMRC_FAIL;
  -     }
  -
        re = r;
        SKIPNONWHITE(re);
        N = xmalloc((re-r) + 1);
        strncpy(N, r, (re-r));
        N[re-r] = '\0';
   
  +     /* N must begin with alphanumeric, _, or /, or a macro. */
  +     nr = strlen(N);
  +     ix = 0;
  +     if (N[ix] == '!')
  +         ix++;
  +     if (!(xisalnum(N[ix]) || N[ix] == '_' || N[ix] == '/'
  +      || (nr > 5 && N[ix] == '%' && N[ix+1] == '{' && N[nr-1] == '}')))
  +     {
  +         rpmlog(RPMLOG_ERR,
  +                  _("line %d: Dependency \"%s\" must begin with 
alpha-numeric, '_' or '/': %s\n"),
  +                  spec->lineNum, N, spec->line);
  +         goto exit;
  +     }
  +
        /* Parse EVR */
        v = re;
        SKIPWHITE(v);
  @@ -130,7 +136,7 @@
                rpmlog(RPMLOG_ERR,
                         _("line %d: Versioned file name not permitted: %s\n"),
                         spec->lineNum, spec->line);
  -             return RPMRC_FAIL;
  +             goto exit;
            }
            if (F) {
                /* now parse EVR */
  @@ -144,33 +150,44 @@
        }
   
        if (Flags & RPMSENSE_SENSEMASK) {
  -         if (*v == '\0' || ve == v) {
  -             rpmlog(RPMLOG_ERR, _("line %d: Version required: %s\n"),
  -                     spec->lineNum, spec->line);
  -             return RPMRC_FAIL;
  -         }
  -         EVR = xmalloc((ve-v) + 1);
  -         strncpy(EVR, v, (ve-v));
  -         EVR[ve-v] = '\0';
  -         re = ve;    /* ==> next token after EVR string starts here */
  -     } else
  -         EVR = NULL;
  +         char * t;
   
  -     /* Make sure that EVR is parseable during install. */
  -     if (EVR != NULL) {
  -         EVR_t evr = memset(alloca(sizeof(*evr)), 0, sizeof(*evr));
  -         int xx = rpmEVRparse(xstrdup(EVR), evr);
  +         EVR = t = xmalloc((ve-v) + 1);
  +         nr = 0;
  +         while (v < ve && *v != '\0')
  +         switch ((int)*v) {
  +         case '-':   nr++;   /*...@fallthrough@*/
  +         default:    *t++ = *v++;    break;
  +         }
  +         *t = '\0';
   
  -         evr->str = _free(evr->str);
  -         if (xx != 0) {
  -             rpmlog(RPMLOG_ERR,
  -                      _("line %d: EVR does not parse: %s\n"),
  -                      spec->lineNum, spec->line);
  -             N = _free(N);
  -             EVR = _free(EVR);
  -             return RPMRC_FAIL;
  +         if (*EVR == '\0') {
  +             rpmlog(RPMLOG_ERR, _("line %d: %s must be specified: %s\n"),
  +                     spec->lineNum, "EVR", spec->line);
  +             goto exit;
            }
  -     }
  +         if (nr > 1) {
  +             rpmlog(RPMLOG_ERR, _("line %d: Illegal char '-' in %s: %s\n"),
  +                     spec->lineNum, "EVR", spec->line);
  +             goto exit;
  +            }
  +         /* EVR must be parseable (or a macro). */
  +         ix = 0;
  +         nr = strlen(EVR);
  +         if (!(nr > 3 && EVR[0] == '%' && EVR[1] == '{' && EVR[nr-1] == '}'))
  +         {
  +             memset(evr, 0, sizeof(*evr));
  +             ix = rpmEVRparse(xstrdup(EVR), evr);
  +             evr->str = _free(evr->str);
  +         }
  +         if (ix != 0) {
  +             rpmlog(RPMLOG_ERR, _("line %d: %s does not parse: %s\n"),
  +                      spec->lineNum, "EVR", spec->line);
  +             goto exit;
  +         }
  +         re = ve;    /* ==> next token after EVR string starts here */
  +     } else
  +         EVR = NULL;
   
        (void) addReqProv(spec, h, tagN, N, EVR, Flags, index);
   
  @@ -178,6 +195,10 @@
        EVR = _free(EVR);
   
       }
  +    rc = RPMRC_OK;
   
  -    return RPMRC_OK;
  +exit:
  +    N = _free(N);
  +    EVR = _free(EVR);
  +    return rc;
   }
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to