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

Reply via email to