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: 06-Mar-2010 04:31:20 Branch: HEAD Handle: 2010030603311900 Modified files: rpm/build files.c pack.c parseBuildInstallClean.c parseSpec.c rpmspec.h spec.c Log: - fix: avoid segfaults with unit tests. Summary: Revision Changes Path 1.367 +4 -2 rpm/build/files.c 2.317 +5 -0 rpm/build/pack.c 2.35 +16 -5 rpm/build/parseBuildInstallClean.c 2.143 +2 -0 rpm/build/parseSpec.c 2.86 +2 -0 rpm/build/rpmspec.h 2.208 +14 -21 rpm/build/spec.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/build/files.c ============================================================================ $ cvs diff -u -r1.366 -r1.367 files.c --- rpm/build/files.c 1 Mar 2010 14:18:00 -0000 1.366 +++ rpm/build/files.c 6 Mar 2010 03:31:19 -0000 1.367 @@ -2543,7 +2543,7 @@ classTag = tagValue("Class"); /* Only specific tags are added to the source package header */ - if (!spec->sourceHdrInit) { + if (spec->packages && !spec->sourceHdrInit) { for (hi = headerInit(spec->packages->header); headerNext(hi, he, 0); he->p.ptr = _free(he->p.ptr)) @@ -2646,7 +2646,8 @@ sourceFiles = rpmiobNew(0); /* Construct the source/patch tag entries */ - sourceFiles = rpmiobAppend(sourceFiles, spec->specFile, 1); + if (spec->specFile != NULL) /* XXX segfault avoidance */ + sourceFiles = rpmiobAppend(sourceFiles, spec->specFile, 1); if (spec->sourceHeader != NULL) for (srcPtr = spec->sources; srcPtr != NULL; srcPtr = srcPtr->next) { { const char * sfn; @@ -2967,6 +2968,7 @@ int n = 0; Package pkg1, pkg2; + if (spec->packages) /* XXX segfault avoidance */ for (pkg1 = spec->packages; pkg1->next; pkg1 = pkg1->next) { #ifdef DYING rpmfi fi1 = rpmfiNew(NULL, pkg1->header, RPMTAG_BASENAMES, 0); @@ . patch -p0 <<'@@ .' Index: rpm/build/pack.c ============================================================================ $ cvs diff -u -r2.316 -r2.317 pack.c --- rpm/build/pack.c 10 Feb 2010 18:36:17 -0000 2.316 +++ rpm/build/pack.c 6 Mar 2010 03:31:19 -0000 2.317 @@ -1257,7 +1257,12 @@ /*...@-assignexpose -newreftr...@*/ csa->fi = rpmfiLink(spec->fi, "packageSources"); /*...@=assignexpose =newreftr...@*/ +#ifdef DYING assert(csa->fi != NULL); +#else + if (csa->fi == NULL) /* XXX segfault avoidance */ + return RPMRC_FAIL; +#endif spec->sourcePkgId = NULL; rc = writeRPM(&spec->sourceHeader, &spec->sourcePkgId, fn, @@ . patch -p0 <<'@@ .' Index: rpm/build/parseBuildInstallClean.c ============================================================================ $ cvs diff -u -r2.34 -r2.35 parseBuildInstallClean.c --- rpm/build/parseBuildInstallClean.c 3 Aug 2008 14:00:58 -0000 2.34 +++ rpm/build/parseBuildInstallClean.c 6 Mar 2010 03:31:19 -0000 2.35 @@ -18,22 +18,33 @@ const char *name = NULL; rpmRC rc; - if (parsePart == PART_BUILD) { + switch (parsePart) { + case PART_BUILD: iobp = &spec->build; name = "build"; - } else if (parsePart == PART_INSTALL) { + break; + case PART_INSTALL: iobp = &spec->install; name = "install"; - } else if (parsePart == PART_CHECK) { + break; + case PART_CHECK: iobp = &spec->check; name = "check"; - } else if (parsePart == PART_CLEAN) { + break; + case PART_CLEAN: iobp = &spec->clean; name = "clean"; - } else if (parsePart == PART_ARBITRARY) { + break; + case PART_ARBITRARY: assert(spec->nfoo > 0); iobp = &spec->foo[spec->nfoo-1].iob; name = spec->foo[spec->nfoo-1].str; + break; + default: + rpmlog(RPMLOG_ERR, _("line %d: unknown specfile section\n"), + spec->lineNum); + return RPMRC_FAIL; + break; } if (*iobp != NULL) { @@ . patch -p0 <<'@@ .' Index: rpm/build/parseSpec.c ============================================================================ $ cvs diff -u -r2.142 -r2.143 parseSpec.c --- rpm/build/parseSpec.c 5 Dec 2009 18:28:43 -0000 2.142 +++ rpm/build/parseSpec.c 6 Mar 2010 03:31:19 -0000 2.143 @@ -353,6 +353,8 @@ OFI_t *ofi = spec->fileStack; int rc; + if (ofi == NULL) /* XXX segfault avoidance */ + return 1; if (!restoreFirstChar(spec)) { retry: if ((rc = readLineFromOFI(spec, ofi)) != 0) @@ . patch -p0 <<'@@ .' Index: rpm/build/rpmspec.h ============================================================================ $ cvs diff -u -r2.85 -r2.86 rpmspec.h --- rpm/build/rpmspec.h 10 Feb 2010 18:36:17 -0000 2.85 +++ rpm/build/rpmspec.h 6 Mar 2010 03:31:19 -0000 2.86 @@ -7,6 +7,8 @@ */ #include <rpmevr.h> +#include <rpmfi.h> /* XXX rpmfi typedef */ +#include <rpmcli.h> /* XXX QVA_t typedef */ /** \ingroup rpmbuild */ @@ . patch -p0 <<'@@ .' Index: rpm/build/spec.c ============================================================================ $ cvs diff -u -r2.207 -r2.208 spec.c --- rpm/build/spec.c 16 Feb 2010 15:12:21 -0000 2.207 +++ rpm/build/spec.c 6 Mar 2010 03:31:19 -0000 2.208 @@ -84,6 +84,8 @@ rpmRC rc = RPMRC_OK; int xx; + if (lastp == NULL) /* XXX segfault avoidance */ + goto exit; /* "main" package */ if (name == NULL) goto exit; @@ -364,22 +366,21 @@ int flag = 0; const char *name = NULL; const char *mdir = NULL; - char *nump; const char *fieldp = NULL; char buf[BUFSIZ]; - rpmuint32_t num = 0; + uint32_t num = 0; buf[0] = '\0'; switch (tag) { case RPMTAG_SOURCE: flag = RPMFILE_SOURCE; name = "source"; - fieldp = spec->line + (sizeof("Source")-1); + fieldp = spec->line; break; case RPMTAG_PATCH: flag = RPMFILE_PATCH; name = "patch"; - fieldp = spec->line + (sizeof("Patch")-1); + fieldp = spec->line; break; case RPMTAG_ICON: flag = RPMFILE_ICON; @@ -397,23 +398,15 @@ /* Get the number */ if (fieldp != NULL) { - /* We already know that a ':' exists, and that there */ - /* are no spaces before it. */ - /* This also now allows for spaces and tabs between */ - /* the number and the ':' */ - - nump = buf; - while ((*fieldp != ':') && (*fieldp != ' ') && (*fieldp != '\t')) - *nump++ = *fieldp++; - *nump = '\0'; - - nump = buf; - SKIPSPACE(nump); - if (nump == NULL || *nump == '\0') - num = 0; - else if (parseNum(buf, &num)) { - rpmlog(RPMLOG_ERR, _("line %d: Bad %s number: %s\n"), - spec->lineNum, name, spec->line); + char * end = NULL; + + if (!xstrcasecmp(fieldp, name)) + fieldp += strlen(name); + num = strtoul(fieldp, &end, 10); + SKIPSPACE(end); + if (*end != ':') { + rpmlog(RPMLOG_ERR, _("line %d: No ':' terminator: %s\n"), + spec->lineNum, spec->line); return RPMRC_FAIL; } } @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org