RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/rpmdb/ hdrfmt.c header.c rpmdb.c sqlite.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Tue 16 Oct 2007 - 02:48:15 CEST
Message-Id: <20071016004815.5ABF7348486@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   16-Oct-2007 02:48:15
  Branch: HEAD                             Handle: 2007101601481400

  Modified files:
    rpm/rpmdb               hdrfmt.c header.c rpmdb.c sqlite.c

  Log:
    - rpmdb splint fiddles.

  Summary:
    Revision    Changes     Path
    1.10        +115 -62    rpm/rpmdb/hdrfmt.c
    1.79        +16 -5      rpm/rpmdb/header.c
    1.184       +16 -11     rpm/rpmdb/rpmdb.c
    1.17        +2  -0      rpm/rpmdb/sqlite.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.9 -r1.10 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c	15 Oct 2007 22:44:48 -0000	1.9
  +++ rpm/rpmdb/hdrfmt.c	16 Oct 2007 00:48:14 -0000	1.10
  @@ -885,12 +885,16 @@
       xx = headerGetEntry(h, RPMTAG_TRIGGERFLAGS, NULL, &flags, NULL);
       xx = headerGetEntry(h, RPMTAG_TRIGGERVERSION, NULL, &versions, NULL);
       xx = headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, &s, &numScripts);
  -    s = headerFreeData(s, -1);
  +
  +    if (he->t)
  +	*he->t = RPM_STRING_ARRAY_TYPE;
  +    if (he->c)
  +	*he->c = numScripts;
  +    if (he->p == NULL)
  +	goto exit;
   
       he->freeData = 1;
  -    (*he->p).ptr = conds = xmalloc(sizeof(*conds) * numScripts);
  -    *he->c = numScripts;
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  +    (*he->p).argv = conds = xmalloc(sizeof(*conds) * numScripts);
       for (i = 0; i < numScripts; i++) {
   	chptr = xstrdup("");
   
  @@ -904,9 +908,8 @@
   		flagsStr = depflagsFormat(RPM_INT32_TYPE, flags, buf, 0, j);
   		sprintf(item, "%s %s %s", names[j], flagsStr, versions[j]);
   		flagsStr = _free(flagsStr);
  -	    } else {
  +	    } else
   		strcpy(item, names[j]);
  -	    }
   
   	    chptr = xrealloc(chptr, strlen(chptr) + strlen(item) + 5);
   	    if (*chptr != '\0') strcat(chptr, ", ");
  @@ -917,8 +920,10 @@
   	conds[i] = chptr;
       }
   
  +exit:
       names = headerFreeData(names, -1);
       versions = headerFreeData(versions, -1);
  +    s = headerFreeData(s, -1);
   
       return 0;
   }
  @@ -944,12 +949,16 @@
   
       xx = headerGetEntry(h, RPMTAG_TRIGGERFLAGS, NULL, &flags, NULL);
       xx = headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, &s, &numScripts);
  -    s = headerFreeData(s, -1);
  +
  +    if (he->t)
  +	*he->t = RPM_STRING_ARRAY_TYPE;
  +    if (he->c)
  +	*he->c = numScripts;
  +    if (he->p == NULL)
  +	goto exit;
   
       he->freeData = 1;
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  -    (*he->p).ptr = conds = xmalloc(sizeof(*conds) * numScripts);
  -    *he->c = numScripts;
  +    (*he->p).argv = conds = xmalloc(sizeof(*conds) * numScripts);
       for (i = 0; i < numScripts; i++) {
   	for (j = 0; j < numNames; j++) {
   	    if (indices[j] != i)
  @@ -969,6 +978,8 @@
   	}
       }
   
  +exit:
  +    s = headerFreeData(s, -1);
       return 0;
   }
   
  @@ -997,11 +1008,14 @@
   	/*@modifies he, rpmGlobalMacroContext @*/
   {
       char * dstring = rpmExpand(_macro_i18ndomains, NULL);
  -    int rc;
  +    int rc = 1;		/* assume failure */
   
  -    *he->t = RPM_STRING_TYPE;
  -    (*he->p).ptr = NULL;
  -    *he->c = 0;
  +    if (he->t)
  +	*he->t = RPM_STRING_TYPE;
  +    if (he->p)
  +	(*he->p).ptr = NULL;
  +    if (he->c)
  +	*he->c = 0;
       he->freeData = 0;
   
       if (dstring && *dstring) {
  @@ -1049,29 +1063,46 @@
   
   	if (domain && msgid) {
   	    const char * s = /*@-unrecog@*/ dgettext(domain, msgid) /*@=unrecog@*/;
  -	    (*he->p).str = xstrdup(s);	/* XXX xstrdup has side effects. */
  -	    *he->c = 1;
  -	    he->freeData = 1;
  +	    if (s) {
  +		rc = 0;
  +		if (he->p) {
  +		    (*he->p).str = xstrdup(s);
  +		    he->freeData = 1;
  +		} else
  +		    he->freeData = 0;
  +		if (he->c)
  +		    *he->c = 1;
  +	    }
   	}
  -	dstring = _free(dstring);
  -	if ((*he->p).str)
  -	    return 0;
       }
   
  +/*@-dependenttrans@*/
       dstring = _free(dstring);
  +/*@=dependenttrans@*/
  +    if (!rc)
  +	return rc;
   
       rc = headerGetEntry(h, he->tag, he->t, he->p, he->c);
  -
  -    if (rc && (*he->p).ptr != NULL) {
  -	(*he->p).str = xstrdup((*he->p).str);
  -	(*he->p).str = xstrtolocale((*he->p).str);
  -	he->freeData = 1;
  -	return 0;
  +    if (rc) {
  +	rc = 0;
  +	if (he->p) {
  +	    (*he->p).str = xstrdup((*he->p).str);
  +	    (*he->p).str = xstrtolocale((*he->p).str);
  +	    he->freeData = 1;
  +	}
  +/*@-nullstate@*/
  +	return rc;
  +/*@=nullstate@*/
       }
   
  -    he->freeData = 0;
  -    (*he->p).ptr = NULL;
  -    *he->c = 0;
  +    if (he->t)
  +	*he->t = RPM_STRING_TYPE;
  +    if (he->p) {
  +	(*he->p).ptr = NULL;
  +	he->freeData = 0;
  +    }
  +    if (he->c)
  +	*he->c = 0;
       return 1;
   }
   
  @@ -1083,32 +1114,34 @@
   {
       rpmTagType t;
       char **d, **d2, *dp;
  -    int rc, i, l;
  +    int_32 c;
  +    int rc;
   
  -    rc = headerGetEntry(h, he->tag, &t, &d, he->c);
  -    if (!rc || d == NULL || *he->c == 0) {
  +    rc = headerGetEntry(h, he->tag, &t, &d, &c);
  +    if (!rc || d == NULL || c == 0) {
  +	if (he->p)
  +	    (*he->p).ptr = NULL;
  +	if (he->c)
  +	    *he->c = 0;
   	he->freeData = 0;
  -	(*he->p).ptr = NULL;
  -	*he->c = 0;
   	return 1;
       }
  -    if (he->t)
  -	*he->t = t;
  +
       if (t == RPM_STRING_TYPE) {
   	d = (char **)xstrdup((char *)d);
   	d = (char **)xstrtolocale((char *)d);
   	he->freeData = 1;
       } else if (t == RPM_STRING_ARRAY_TYPE) {
  -	l = 0;
  -	for (i = 0; i < *he->c; i++) {
  +	int i, l = 0;
  +	for (i = 0; i < c; i++) {
   	    d[i] = xstrdup(d[i]);
   	    d[i] = (char *)xstrtolocale(d[i]);
   assert(d[i] != NULL);
   	    l += strlen(d[i]) + 1;
   	}
  -	d2 = xmalloc(*he->c * sizeof(*d2) + l);
  -	dp = (char *)(d2 + *he->c);
  -	for (i = 0; i < *he->c; i++) {
  +	d2 = xmalloc(c * sizeof(*d2) + l);
  +	dp = (char *)(d2 + c);
  +	for (i = 0; i < c; i++) {
   	    d2[i] = dp;
   	    strcpy(dp, d[i]);
   	    dp += strlen(dp) + 1;
  @@ -1119,7 +1152,13 @@
   	he->freeData = 1;
       } else
   	he->freeData = 0;
  -    (*he->p).ptr = (void **)d;
  +
  +    if (he->t)
  +	*he->t = t;
  +    if (he->p)
  +	(*he->p).ptr = (void **)d;
  +    if (he->c)
  +	*he->c = c;
       return 0;
   }
   
  @@ -1192,14 +1231,17 @@
   	/*@modifies he, rpmGlobalMacroContext,
   		fileSystem, internalState @*/
   {
  -    int_32 * valuep = xcalloc(1, sizeof(*valuep));
  -
  -    *valuep = headerGetInstance(h);
  -
  -    *he->t = RPM_INT32_TYPE;
  -    (*he->p).ptr = valuep;
  -    *he->c = 1;
  -    he->freeData = 1;
  +    he->tag = RPMTAG_DBINSTANCE;
  +    if (he->t)
  +	*he->t = RPM_INT32_TYPE;
  +    if (he->p) {
  +	(*he->p).i32p = xcalloc(1, sizeof(*(*he->p).i32p));
  +	(*he->p).i32p[0] = headerGetInstance(h);
  +	he->freeData = 1;
  +    } else
  +	he->freeData = 0;
  +    if (he->c)
  +	*he->c = 1;
   
       return 0;
   }
  @@ -1275,7 +1317,8 @@
    * @retval *fcp		number of files
    */
   static void rpmfiBuildFNames(Header h, rpmTag tagN,
  -		/*@out@*/ const char *** fnp, /*@out@*/ int * fcp)
  +		/*@null@*/ /*@out@*/ const char *** fnp,
  +		/*@null@*/ /*@out@*/ int * fcp)
   	/*@modifies *fnp, *fcp @*/
   {
       const char ** baseNames;
  @@ -1343,7 +1386,7 @@
   	/*@modifies he @*/
   {
       if (he->t) *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildFNames(h, he->tag, (const char ***) he->p, he->c);
  +    rpmfiBuildFNames(h, he->tag, (he->p ? &(*he->p).argv : NULL), he->c);
       he->freeData = 1;
       return 0;
   }
  @@ -1390,16 +1433,26 @@
   	{ .tagFunction = filepathsTag } },
       { HEADER_EXT_TAG, "RPMTAG_ORIGPATHS",
   	{ .tagFunction = origpathsTag } },
  -    { HEADER_EXT_FORMAT, "armor",		{ armorFormat } },
  -    { HEADER_EXT_FORMAT, "base64",		{ base64Format } },
  -    { HEADER_EXT_FORMAT, "depflags",		{ depflagsFormat } },
  -    { HEADER_EXT_FORMAT, "fflags",		{ fflagsFormat } },
  -    { HEADER_EXT_FORMAT, "perms",		{ permsFormat } },
  -    { HEADER_EXT_FORMAT, "permissions",		{ permsFormat } },
  -    { HEADER_EXT_FORMAT, "pgpsig",		{ pgpsigFormat } },
  -    { HEADER_EXT_FORMAT, "triggertype",		{ triggertypeFormat } },
  -    { HEADER_EXT_FORMAT, "xml",			{ xmlFormat } },
  -    { HEADER_EXT_FORMAT, "yaml",		{ yamlFormat } },
  +    { HEADER_EXT_FORMAT, "armor",
  +	{ .formatFunction = armorFormat } },
  +    { HEADER_EXT_FORMAT, "base64",
  +	{ .formatFunction = base64Format } },
  +    { HEADER_EXT_FORMAT, "depflags",
  +	{ .formatFunction = depflagsFormat } },
  +    { HEADER_EXT_FORMAT, "fflags",
  +	{ .formatFunction = fflagsFormat } },
  +    { HEADER_EXT_FORMAT, "perms",
  +	{ .formatFunction = permsFormat } },
  +    { HEADER_EXT_FORMAT, "permissions",	
  +	{ .formatFunction = permsFormat } },
  +    { HEADER_EXT_FORMAT, "pgpsig",
  +	{ .formatFunction = pgpsigFormat } },
  +    { HEADER_EXT_FORMAT, "triggertype",	
  +	{ .formatFunction = triggertypeFormat } },
  +    { HEADER_EXT_FORMAT, "xml",
  +	{ .formatFunction = xmlFormat } },
  +    { HEADER_EXT_FORMAT, "yaml",
  +	{ .formatFunction = yamlFormat } },
       { HEADER_EXT_MORE, NULL,		{ (void *) headerDefaultFormats } }
   } ;
   /*@=type@*/
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.78 -r1.79 header.c
  --- rpm/rpmdb/header.c	15 Oct 2007 16:19:01 -0000	1.78
  +++ rpm/rpmdb/header.c	16 Oct 2007 00:48:14 -0000	1.79
  @@ -1835,7 +1835,9 @@
       memset(he, 0, sizeof(*he));
       he->tag = tag;
       he->t = &he_t;
  +/*@-immediatetrans@*/
       he->p = (p ? &he_p : NULL);
  +/*@=immediatetrans@*/
       he->c = &he_c;
   
       /* Search extensions for specific tag override. */
  @@ -3168,9 +3170,13 @@
   	HE_s he_s;
   	HE_t he = &he_s;
   	he->tag = 0;
  +/*@-immediatetrans@*/
   	he->t = &ec->type;
  +/*@-type@*/
   	he->p = &ec->data;
  +/*@=type@*/
   	he->c = &ec->count;
  +/*@=immediatetrans@*/
   	he->freeData = 0;
   	if (fn(hsa->h, he))
   	    return 1;
  @@ -3941,11 +3947,16 @@
   
   /*@-type@*/ /* FIX: cast? */
   const struct headerSprintfExtension_s headerDefaultFormats[] = {
  -    { HEADER_EXT_FORMAT, "octal", { octalFormat } },
  -    { HEADER_EXT_FORMAT, "hex", { hexFormat } },
  -    { HEADER_EXT_FORMAT, "date", { dateFormat } },
  -    { HEADER_EXT_FORMAT, "day", { dayFormat } },
  -    { HEADER_EXT_FORMAT, "shescape", { shescapeFormat } },
  +    { HEADER_EXT_FORMAT, "octal",
  +	{ .formatFunction = octalFormat } },
  +    { HEADER_EXT_FORMAT, "hex",
  +	{ .formatFunction = hexFormat } },
  +    { HEADER_EXT_FORMAT, "date",
  +	{ .formatFunction = dateFormat } },
  +    { HEADER_EXT_FORMAT, "day",
  +	{ .formatFunction = dayFormat } },
  +    { HEADER_EXT_FORMAT, "shescape",
  +	{ .formatFunction = shescapeFormat } },
       { HEADER_EXT_LAST, NULL, { NULL } }
   };
   /*@=type@*/
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.c
  ============================================================================
  $ cvs diff -u -r1.183 -r1.184 rpmdb.c
  --- rpm/rpmdb/rpmdb.c	15 Oct 2007 07:02:27 -0000	1.183
  +++ rpm/rpmdb/rpmdb.c	16 Oct 2007 00:48:14 -0000	1.184
  @@ -1543,7 +1543,9 @@
   	} while (i < allMatches->count && offset == prevoff);
   
   	baseNames = _free(baseNames);
  +/*@-usereleased@*/
   	dirNames = _free(dirNames);
  +/*@=usereleased@*/
   	dirIndexes = _free(dirIndexes);
   	h = headerFree(h);
       }
  @@ -2926,29 +2928,29 @@
   		switch (he_t) {
   		case RPM_NULL_TYPE:		/* XXX never occurs. */
   assert(0);
  -		    break;
  +		    /*@switchbreak@*/ break;
   		case RPM_CHAR_TYPE:
   		case RPM_INT8_TYPE:
   		    key->size = sizeof(*he_p.i8p);
  -		    key->data = he_p.i8p + i;
  +/*@i@*/		    key->data = he_p.i8p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_INT16_TYPE:
   		    key->size = sizeof(*he_p.i16p);
  -		    key->data = he_p.i16p + i;
  +/*@i@*/		    key->data = he_p.i16p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_INT32_TYPE:
   		    key->size = sizeof(*he_p.i32p);
  -		    key->data = he_p.i32p + i;
  +/*@i@*/		    key->data = he_p.i32p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_INT64_TYPE:
   		    key->size = sizeof(*he_p.i64p);
  -		    key->data = he_p.i64p + i;
  +/*@i@*/		    key->data = he_p.i64p + i;
   		    /*@switchbreak@*/ break;
   		case RPM_OPENPGP_TYPE:
   		case RPM_ASN1_TYPE:
   		case RPM_BIN_TYPE:
   		    key->size = he_c;
  -		    key->data = he_p.ptr;
  +/*@i@*/		    key->data = he_p.ptr;
   		    he_c = 1;		/* XXX break out of loop. */
   		    /*@switchbreak@*/ break;
   		case RPM_I18NSTRING_TYPE:	/* XXX never occurs. */
  @@ -3250,12 +3252,12 @@
   	if (db->db_tagn != NULL)
   	for (dbix = 0; dbix < db->db_ndbi; dbix++) {
   	    byte * bin = NULL;
  -	    int_32 * requireFlags;
  +	    hRET_t requireFlags;
   	    rpmRC rpmrc;
   	    int i, j;
   
   	    rpmrc = RPMRC_NOTFOUND;
  -	    requireFlags = NULL;
  +	    requireFlags.ptr = NULL;
   	    dbi = NULL;
   	    he->tag = db->db_tagn[dbix];
   	    he_t = 0;
  @@ -3387,7 +3389,8 @@
   		    /*@switchbreak@*/ break;
   		case RPMTAG_REQUIRENAME:
   		    /* Filter out install prerequisites. */
  -		    if (requireFlags && isInstallPreReq(requireFlags[i]))
  +		    if (requireFlags.i32p
  +		     && isInstallPreReq(requireFlags.i32p[i]))
   			/*@innercontinue@*/ continue;
   		    /*@switchbreak@*/ break;
   		case RPMTAG_TRIGGERNAME:
  @@ -3409,7 +3412,7 @@
   		switch (he_t) {
   		case RPM_NULL_TYPE:		/* XXX never occurs. */
   assert(0);
  -		    break;
  +		    /*@switchbreak@*/ break;
   		case RPM_CHAR_TYPE:
   		case RPM_INT8_TYPE:
   		    key->size = sizeof(*he_p.i8p);
  @@ -3542,7 +3545,7 @@
   	    he_p.ptr = _free(he_p.ptr);
   	    he_c = 0;
   	    bin = _free(bin);
  -	    requireFlags = _free(requireFlags);
  +	    requireFlags.ptr = _free(requireFlags.ptr);
   	}
   
   	rec = _free(rec);
  @@ -3669,7 +3672,9 @@
   
   	fps = _free(fps);
   	fullBaseNames = _free(fullBaseNames);
  +/*@-usereleased@*/
   	dirNames = _free(dirNames);
  +/*@=usereleased@*/
   	fullDirIndexes = _free(fullDirIndexes);
   	baseNames = _free(baseNames);
   	dirIndexes = _free(dirIndexes);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/sqlite.c
  ============================================================================
  $ cvs diff -u -r1.16 -r1.17 sqlite.c
  --- rpm/rpmdb/sqlite.c	11 Oct 2007 19:44:24 -0000	1.16
  +++ rpm/rpmdb/sqlite.c	16 Oct 2007 00:48:14 -0000	1.17
  @@ -96,10 +96,12 @@
       int used;
   };
   
  +/*@-redef@*/
   union _dbswap {
       uint32_t ui;
       unsigned char uc[4];
   };
  +/*@=redef@*/
   
   #define _DBSWAP(_a) \
     { unsigned char _b, *_c = (_a).uc; \
  @@ .
Received on Tue Oct 16 02:48:15 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.