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