RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/lib/ package.c rpmchecksig.c rpmlead.c rpmlead.h signat...

From: Jeff Johnson <jbj@rpm5.org>
Date: Fri 17 Aug 2007 - 11:54:20 CEST
Message-Id: <20070817095420.610E5348456@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:   17-Aug-2007 11:54:20
  Branch: HEAD                             Handle: 2007081710541801

  Modified files:
    rpm/lib                 package.c rpmchecksig.c rpmlead.c rpmlead.h
                            signature.c signature.h

  Log:
    start refactoring lead/signature reading.

  Summary:
    Revision    Changes     Path
    2.148       +12 -21     rpm/lib/package.c
    1.129       +29 -52     rpm/lib/rpmchecksig.c
    2.44        +49 -11     rpm/lib/rpmlead.c
    2.18        +4  -3      rpm/lib/rpmlead.h
    2.179       +1  -8      rpm/lib/signature.c
    2.45        +8  -9      rpm/lib/signature.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/lib/package.c
  ============================================================================
  $ cvs diff -u -r2.147 -r2.148 package.c
  --- rpm/lib/package.c	17 Aug 2007 05:36:04 -0000	2.147
  +++ rpm/lib/package.c	17 Aug 2007 09:54:18 -0000	2.148
  @@ -788,7 +788,7 @@
       rpmtsOpX opx;
       size_t nb;
       Header h = NULL;
  -    const char * msg;
  +    const char * msg = NULL;
       rpmVSFlags vsflags;
       rpmRC rc = RPMRC_FAIL;	/* assume failure */
       rpmop opsave = memset(alloca(sizeof(*opsave)), 0, sizeof(*opsave));
  @@ -815,36 +815,27 @@
       (void) rpmswAdd(opsave, fdstat_op(fd, FDSTAT_READ));
   
       memset(l, 0, sizeof(*l));
  -    l->signature_type = RPMSIGTYPE_HEADERSIG;
  -if (!_nolead) {
  -    rc = readLead(fd, l);
  -    if (rc != RPMRC_OK)
  -	goto exit;
   
  -    switch (l->major) {
  -    case 1:
  -	rpmError(RPMERR_NEWPACKAGE,
  -	    _("packaging version 1 is not supported by this version of RPM\n"));
  -	rc = RPMRC_NOTFOUND;
  -	goto exit;
  -	/*@notreached@*/ break;
  -    case 2:
  -    case 3:
  -    case 4:
  -	break;
  +if (!_nolead) {
  +    rc = readLead(fd, l, &msg);
  +    switch (rc) {
       default:
  -	rpmError(RPMERR_NEWPACKAGE, _("only packaging with major numbers <= 4 "
  -		"is supported by this version of RPM\n"));
  -	rc = RPMRC_NOTFOUND;
  +	rpmError(RPMERR_READLEAD, "%s: %s\n", fn, msg);
  +	/*@fallthrough@*/
  +    case RPMRC_NOTFOUND:
  +	msg = _free(msg);
   	goto exit;
   	/*@notreached@*/ break;
  +    case RPMRC_OK:
  +	break;
       }
  +    msg = _free(msg);
   }
   
   if (!_nosigh) {
       /* Read the signature header. */
       msg = NULL;
  -    rc = rpmReadSignature(fd, &sigh, l->signature_type, &msg);
  +    rc = rpmReadSignature(ts, fd, &sigh, &msg);
       switch (rc) {
       default:
   	rpmError(RPMERR_SIGGEN, _("%s: rpmReadSignature failed: %s"), fn,
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmchecksig.c
  ============================================================================
  $ cvs diff -u -r1.128 -r1.129 rpmchecksig.c
  --- rpm/lib/rpmchecksig.c	17 Aug 2007 05:36:04 -0000	1.128
  +++ rpm/lib/rpmchecksig.c	17 Aug 2007 09:54:18 -0000	1.129
  @@ -186,11 +186,11 @@
       FD_t ofd = NULL;
       struct rpmlead lead, *l = &lead;
       int_32 sigtag;
  -    const char *rpm, *trpm;
  +    const char *fn, *tfn;
       const char *sigtarget = NULL;
       char tmprpm[1024+1];
       Header sigh = NULL;
  -    const char * msg;
  +    const char * msg = NULL;
       void * uh = NULL;
       int_32 uht, uhc;
       int res = EXIT_FAILURE;
  @@ -199,56 +199,43 @@
       int xx;
       
       tmprpm[0] = '\0';
  +
       /*@-branchstate@*/
  -/*@-boundsread@*/
       if (argv)
  -    while ((rpm = *argv++) != NULL)
  -/*@=boundsread@*/
  -    {
  +    while ((fn = *argv++) != NULL) {
   
  -	fprintf(stdout, "%s:\n", rpm);
  +	fprintf(stdout, "%s:\n", fn);
   
  -	if (manageFile(&fd, &rpm, O_RDONLY, 0))
  +	if (manageFile(&fd, &fn, O_RDONLY, 0))
   	    goto exit;
   
   /*@-boundswrite@*/
   	memset(l, 0, sizeof(*l));
   /*@=boundswrite@*/
  -	l->signature_type = RPMSIGTYPE_HEADERSIG;
   
   if (!_nolead) {
  -	rc = readLead(fd, l);
  +	rc = readLead(fd, l, &msg);
   	if (rc != RPMRC_OK) {
  -	    rpmError(RPMERR_READLEAD, _("%s: not an rpm package\n"), rpm);
  -	    goto exit;
  -	}
  -	switch (l->major) {
  -	case 1:
  -	    rpmError(RPMERR_BADSIGTYPE, _("%s: Can't sign v1 packaging\n"), rpm);
  -	    goto exit;
  -	    /*@notreached@*/ /*@switchbreak@*/ break;
  -	case 2:
  -	    rpmError(RPMERR_BADSIGTYPE, _("%s: Can't re-sign v2 packaging\n"), rpm);
  +	    rpmError(RPMERR_READLEAD, "%s: %s\n", fn, msg);
  +	    msg = _free(msg);
   	    goto exit;
  -	    /*@notreached@*/ /*@switchbreak@*/ break;
  -	default:
  -	    /*@switchbreak@*/ break;
   	}
  +	msg = _free(msg);
   }
   
   if (!_nosigh) {
   	msg = NULL;
  -	rc = rpmReadSignature(fd, &sigh, l->signature_type, &msg);
  +	rc = rpmReadSignature(ts, fd, &sigh, &msg);
   	switch (rc) {
   	default:
  -	    rpmError(RPMERR_SIGGEN, _("%s: rpmReadSignature failed: %s"), rpm,
  +	    rpmError(RPMERR_SIGGEN, _("%s: rpmReadSignature failed: %s"), fn,
   			(msg && *msg ? msg : "\n"));
   	    msg = _free(msg);
   	    goto exit;
   	    /*@notreached@*/ /*@switchbreak@*/ break;
   	case RPMRC_OK:
   	    if (sigh == NULL) {
  -		rpmError(RPMERR_SIGGEN, _("%s: No signature available\n"), rpm);
  +		rpmError(RPMERR_SIGGEN, _("%s: No signature available\n"), fn);
   		goto exit;
   	    }
   	    /*@switchbreak@*/ break;
  @@ -258,7 +245,7 @@
   
   	/* Write the header and archive to a temp file */
   	/* ASSERT: ofd == NULL && sigtarget == NULL */
  -	if (copyFile(&fd, &rpm, &ofd, &sigtarget))
  +	if (copyFile(&fd, &fn, &ofd, &sigtarget))
   	    goto exit;
   	/* Both fd and ofd are now closed. sigtarget contains tempfile name. */
   	/* ASSERT: fd == NULL && ofd == NULL */
  @@ -361,7 +348,7 @@
   
   		    rpmMessage(RPMMESS_WARNING,
   			_("%s: was already signed by key ID %s, skipping\n"),
  -			rpm, pgpHexStr(newsignid+4, sizeof(newsignid)-4));
  +			fn, pgpHexStr(newsignid+4, sizeof(newsignid)-4));
   
   		    /* Clean up intermediate target */
   		    xx = Unlink(sigtarget);
  @@ -379,25 +366,23 @@
   }
   
   	/* Write the lead/signature of the output rpm */
  -/*@-boundswrite@*/
  -	strcpy(tmprpm, rpm);
  -	strcat(tmprpm, ".XXXXXX");
  -/*@=boundswrite@*/
  +	(void) stpcpy( stpcpy(tmprpm, fn), ".XXXXXX");
  +
   #if defined(HAVE_MKSTEMP)
   	(void) close(mkstemp(tmprpm));
   #else
   	(void) mktemp(tmprpm);
   #endif
  -	trpm = tmprpm;
  +	tfn = tmprpm;
   
  -	if (manageFile(&ofd, &trpm, O_WRONLY|O_CREAT|O_TRUNC, 0))
  +	if (manageFile(&ofd, &tfn, O_WRONLY|O_CREAT|O_TRUNC, 0))
   	    goto exit;
   
   if (!_nolead) {
   	l->signature_type = RPMSIGTYPE_HEADERSIG;
   	rc = writeLead(ofd, l);
   	if (rc != RPMRC_OK) {
  -	    rpmError(RPMERR_WRITELEAD, _("%s: writeLead failed: %s\n"), trpm,
  +	    rpmError(RPMERR_WRITELEAD, _("%s: writeLead failed: %s\n"), tfn,
   		Fstrerror(ofd));
   	    goto exit;
   	}
  @@ -405,7 +390,7 @@
   
   if (!_nosigh) {
   	if (rpmWriteSignature(ofd, sigh)) {
  -	    rpmError(RPMERR_SIGGEN, _("%s: rpmWriteSignature failed: %s\n"), trpm,
  +	    rpmError(RPMERR_SIGGEN, _("%s: rpmWriteSignature failed: %s\n"), tfn,
   		Fstrerror(ofd));
   	    goto exit;
   	}
  @@ -413,14 +398,14 @@
   
   	/* Append the header and archive from the temp file */
   	/* ASSERT: fd == NULL && ofd != NULL */
  -	if (copyFile(&fd, &sigtarget, &ofd, &trpm))
  +	if (copyFile(&fd, &sigtarget, &ofd, &tfn))
   	    goto exit;
   	/* Both fd and ofd are now closed. */
   	/* ASSERT: fd == NULL && ofd == NULL */
   
   	/* Move final target into place. */
  -	xx = Unlink(rpm);
  -	xx = Rename(trpm, rpm);
  +	xx = Unlink(fn);
  +	xx = Rename(tfn, fn);
   	tmprpm[0] = '\0';
   
   	/* Clean up intermediate target */
  @@ -767,7 +752,7 @@
       int_32 siglen;
       Header sigh = NULL;
       HeaderIterator hi = NULL;
  -    const char * msg;
  +    const char * msg = NULL;
       int res = 0;
       int xx;
       rpmRC rc;
  @@ -781,26 +766,18 @@
   	l->signature_type = RPMSIGTYPE_HEADERSIG;
   
   if (!_nolead) {
  -	rc = readLead(fd, l);
  +	rc = readLead(fd, l, &msg);
   	if (rc != RPMRC_OK) {
  -	    rpmError(RPMERR_READLEAD, _("%s: not an rpm package\n"), fn);
  -	    res++;
  -	    goto exit;
  -	}
  -	switch (l->major) {
  -	case 1:
  -	    rpmError(RPMERR_BADSIGTYPE, _("%s: No signature available (v1.0 RPM)\n"), fn);
  +	    rpmError(RPMERR_READLEAD, "%s: %s\n", fn, msg);
  +	    msg = _free(msg);
   	    res++;
   	    goto exit;
  -	    /*@notreached@*/ /*@switchbreak@*/ break;
  -	default:
  -	    /*@switchbreak@*/ break;
   	}
   }
   
   if (!_nosigh) {
   	msg = NULL;
  -	rc = rpmReadSignature(fd, &sigh, l->signature_type, &msg);
  +	rc = rpmReadSignature(ts, fd, &sigh, &msg);
   	switch (rc) {
   	default:
   	    rpmError(RPMERR_SIGGEN, _("%s: rpmReadSignature failed: %s"), fn,
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmlead.c
  ============================================================================
  $ cvs diff -u -r2.43 -r2.44 rpmlead.c
  --- rpm/lib/rpmlead.c	16 Jul 2007 01:32:28 -0000	2.43
  +++ rpm/lib/rpmlead.c	17 Aug 2007 09:54:18 -0000	2.44
  @@ -46,30 +46,68 @@
       return RPMRC_OK;
   }
   
  -rpmRC readLead(FD_t fd, struct rpmlead *lead)
  +rpmRC readLead(FD_t fd, struct rpmlead *lead, const char **msg)
   {
  +    char buf[BUFSIZ];
  +    rpmRC rc = RPMRC_FAIL;		/* assume failure */
  +    int xx;
  +
  +    buf[0] = '\0';
  +
   /*@-boundswrite@*/
       memset(lead, 0, sizeof(*lead));
   /*@=boundswrite@*/
       /*@-type@*/ /* FIX: remove timed read */
  -    if (timedRead(fd, (char *)lead, sizeof(*lead)) != sizeof(*lead)) {
  +    if ((xx = timedRead(fd, (char *)lead, sizeof(*lead))) != sizeof(*lead)) {
   	if (Ferror(fd)) {
  -	    rpmError(RPMERR_READ, _("read failed: %s (%d)\n"),
  -			Fstrerror(fd), errno);
  -	    return RPMRC_FAIL;
  +	    (void) snprintf(buf, sizeof(buf),
  +		_("lead size(%u): BAD, read(%d), %s(%d)\n"),
  +		(unsigned)sizeof(*lead), xx, Fstrerror(fd), errno);
  +	    rc = RPMRC_FAIL;
  +	} else {
  +	    (void) snprintf(buf, sizeof(buf),
  +		_("lead size(%u): BAD, read(%d)\n"),
  +		(unsigned)sizeof(*lead), xx);
  +	    rc = RPMRC_NOTFOUND;
   	}
  -	return RPMRC_NOTFOUND;
  +	goto exit;
       }
       /*@=type@*/
   
  -    if (memcmp(lead->magic, lead_magic, sizeof(lead_magic)))
  -	return RPMRC_NOTFOUND;
  +    if (memcmp(lead->magic, lead_magic, sizeof(lead_magic))) {
  +	(void) snprintf(buf, sizeof(buf), _("lead magic: BAD\n"));
  +	rc = RPMRC_NOTFOUND;
  +	goto exit;
  +    }
       lead->type = ntohs(lead->type);
       lead->archnum = ntohs(lead->archnum);
       lead->osnum = ntohs(lead->osnum);
       lead->signature_type = ntohs(lead->signature_type);
  -    if (lead->signature_type != RPMSIGTYPE_HEADERSIG)
  -	return RPMRC_NOTFOUND;
   
  -    return RPMRC_OK;
  +    switch (lead->major) {
  +    default:
  +	(void) snprintf(buf, sizeof(buf),
  +		_("lead version(%d): UNSUPPORTED\n"), lead->major);
  +	rc = RPMRC_NOTFOUND;
  +	break;
  +    case 3:
  +    case 4:
  +	break;
  +    }
  +
  +    if (lead->signature_type != RPMSIGTYPE_HEADERSIG) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("sigh type(%d): UNSUPPORTED\n"), lead->signature_type);
  +	rc = RPMRC_NOTFOUND;
  +	goto exit;
  +    }
  +
  +    rc = RPMRC_OK;
  +
  +exit:
  +    if (msg != NULL) {
  +	buf[sizeof(buf)-1] = '\0';
  +	*msg = xstrdup(buf);
  +    }
  +    return rc;
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmlead.h
  ============================================================================
  $ cvs diff -u -r2.17 -r2.18 rpmlead.h
  --- rpm/lib/rpmlead.h	16 Apr 2003 17:48:04 -0000	2.17
  +++ rpm/lib/rpmlead.h	17 Aug 2007 09:54:18 -0000	2.18
  @@ -23,10 +23,11 @@
    * Read lead from file handle.
    * @param fd		file handle
    * @retval lead		package lead
  - * @return		RPMRC_OK on success, RPMRC_FAIL/RPMRC_NOTFOUND on error
  + * @retval *msg		failure msg
  + * @return		rpmRC return code
    */
  -rpmRC readLead(FD_t fd, /*@out@*/ struct rpmlead *lead)
  -	/*@modifies fd, *lead @*/;
  +rpmRC readLead(FD_t fd, /*@out@*/ struct rpmlead *lead, const char ** msg)
  +	/*@modifies fd, *lead, *msg @*/;
   
   #ifdef __cplusplus
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/signature.c
  ============================================================================
  $ cvs diff -u -r2.178 -r2.179 signature.c
  --- rpm/lib/signature.c	17 Aug 2007 05:36:04 -0000	2.178
  +++ rpm/lib/signature.c	17 Aug 2007 09:54:19 -0000	2.179
  @@ -148,8 +148,7 @@
   	0x8e, 0xad, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00
   };
   
  -rpmRC rpmReadSignature(void * _fd, Header * sighp, sigType sig_type,
  -		const char ** msg)
  +rpmRC rpmReadSignature(rpmts ts, void * _fd, Header * sighp, const char ** msg)
   {
       FD_t fd = _fd;
       char buf[BUFSIZ];
  @@ -174,12 +173,6 @@
   
       buf[0] = '\0';
   
  -    if (sig_type != RPMSIGTYPE_HEADERSIG) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("sigh type(%d): BAD\n"), sig_type);
  -	goto exit;
  -    }
  -
       memset(block, 0, sizeof(block));
       if ((xx = timedRead(fd, (void *)block, sizeof(block))) != sizeof(block)) {
   	(void) snprintf(buf, sizeof(buf),
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/signature.h
  ============================================================================
  $ cvs diff -u -r2.44 -r2.45 signature.h
  --- rpm/lib/signature.h	9 Aug 2007 22:45:30 -0000	2.44
  +++ rpm/lib/signature.h	17 Aug 2007 09:54:19 -0000	2.45
  @@ -3,7 +3,7 @@
   
   /** \ingroup signature
    * \file lib/signature.h
  - * Generate and verify signatures.
  + * Generate and verify rpm package signatures.
    */
   
   #include <header.h>
  @@ -31,7 +31,7 @@
   #endif
   
   /** \ingroup signature
  - * Return new, empty (signature) header instance.
  + * Return new, empty signature header instance.
    * @return		signature header
    */
   Header rpmNewSignature(void)
  @@ -39,22 +39,21 @@
   
   /** \ingroup signature
    * Read (and verify header+payload size) signature header.
  - * If an old-style signature is found, we emulate a new style one.
  + * @param ts		transaction set
    * @param _fd		file handle
  - * @retval sighp	address of (signature) header (or NULL)
  - * @param sig_type	type of signature header to read (from lead)
  - * @retval msg		failure msg
  + * @retval *sighp	signature header (or NULL)
  + * @retval *msg		failure msg
    * @return		rpmRC return code
    */
  -rpmRC rpmReadSignature(void * _fd, /*@null@*/ /*@out@*/ Header *sighp,
  -		sigType sig_type, /*@null@*/ /*@out@*/ const char ** msg)
  +rpmRC rpmReadSignature(rpmts ts, void * _fd, /*@null@*/ /*@out@*/ Header *sighp,
  +		/*@null@*/ /*@out@*/ const char ** msg)
   	/*@globals fileSystem @*/
   	/*@modifies _fd, *sighp, *msg, fileSystem @*/;
   
   /** \ingroup signature
    * Write signature header.
    * @param _fd		file handle
  - * @param sigh		(signature) header
  + * @param sigh		signature header
    * @return		0 on success, 1 on error
    */
   int rpmWriteSignature(void * _fd, Header sigh)
  @@ .
Received on Fri Aug 17 11:54:20 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.