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