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 07:36:06
Branch: HEAD Handle: 2007081706360302
Modified files:
rpm CHANGES
rpm/build pack.c
rpm/lib package.c rpmchecksig.c signature.c
rpm/rpmdb hdrinline.h header.c header.h header_internal.h
rpmdb.c
Log:
- add getter/setter for header magic to hide _newmagic construction.
Summary:
Revision Changes Path
1.1579 +1 -0 rpm/CHANGES
2.221 +0 -7 rpm/build/pack.c
2.147 +33 -42 rpm/lib/package.c
1.128 +7 -21 rpm/lib/rpmchecksig.c
2.178 +14 -14 rpm/lib/signature.c
1.12 +28 -0 rpm/rpmdb/hdrinline.h
1.60 +46 -2 rpm/rpmdb/header.c
1.21 +24 -0 rpm/rpmdb/header.h
1.15 +1 -0 rpm/rpmdb/header_internal.h
1.151 +10 -3 rpm/rpmdb/rpmdb.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1578 -r1.1579 CHANGES
--- rpm/CHANGES 16 Aug 2007 20:50:25 -0000 1.1578
+++ rpm/CHANGES 17 Aug 2007 05:36:03 -0000 1.1579
@@ -1,4 +1,5 @@
4.5 -> 5.0:
+ - jbj: add getter/setter for header magic to hide _newmagic construction.
- jbj: functional sign/verify on --nolead --newmagic packages.
- jbj: no-operation code paths for --nolead --nosigh packages.
- jbj: functional sign/verify on --nolead packages.
@@ .
patch -p0 <<'@@ .'
Index: rpm/build/pack.c
============================================================================
$ cvs diff -u -r2.220 -r2.221 pack.c
--- rpm/build/pack.c 14 Aug 2007 17:35:55 -0000 2.220
+++ rpm/build/pack.c 17 Aug 2007 05:36:04 -0000 2.221
@@ -384,13 +384,6 @@
}
/*@=boundswrite@*/
-#ifdef DYING
-/*@unchecked@*/
-static unsigned char header_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00
-};
-#endif
-
#define RPMPKGVERSION_MIN 30004
#define RPMPKGVERSION_MAX 40003
/*@unchecked@*/
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/package.c
============================================================================
$ cvs diff -u -r2.146 -r2.147 package.c
--- rpm/lib/package.c 16 Aug 2007 20:50:26 -0000 2.146
+++ rpm/lib/package.c 17 Aug 2007 05:36:04 -0000 2.147
@@ -41,22 +41,6 @@
extern int _nolead;
extern int _nosigh;
-extern int _newmagic;
-
-/*@unchecked@*/
-static unsigned char header_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00
-};
-
-/*@observer@*/ /*@unchecked@*/
-static unsigned char sigh_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00
-};
-
-/*@observer@*/ /*@unchecked@*/
-static unsigned char meta_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x3f, 0x00, 0x00, 0x00, 0x00
-};
/**
* Alignment needs (and sizeof scalars types) for internal rpm data types.
@@ -584,10 +568,12 @@
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
dig->hdrmd5ctx = rpmDigestInit(dig->signature.hash_algo, RPMDIGEST_NONE);
- b = (unsigned char *) (_newmagic ? meta_magic : header_magic);
- nb = sizeof(header_magic);
- (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
- dig->nbytes += nb;
+ b = NULL; nb = 0;
+ (void) headerGetMagic(NULL, &b, &nb);
+ if (b && nb > 0) {
+ (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
+ dig->nbytes += nb;
+ }
b = (unsigned char *) ildl;
nb = sizeof(ildl);
@@ -628,10 +614,12 @@
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
- b = (unsigned char *) (_newmagic ? meta_magic : header_magic);
- nb = sizeof(header_magic);
- (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
- dig->nbytes += nb;
+ b = NULL; nb = 0;
+ (void) headerGetMagic(NULL, &b, &nb);
+ if (b && nb > 0) {
+ (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
+ dig->nbytes += nb;
+ }
b = (unsigned char *) ildl;
nb = sizeof(ildl);
@@ -683,7 +671,8 @@
int_32 dl;
int_32 * ei = NULL;
size_t uc;
- int_32 nb;
+ unsigned char * b;
+ size_t nb;
Header h = NULL;
const char * origin = NULL;
rpmRC rc = RPMRC_FAIL; /* assume failure */
@@ -705,19 +694,13 @@
goto exit;
}
-if (_newmagic) {
- if (!( !memcmp(block, header_magic, sizeof(header_magic))
- || !memcmp(block, meta_magic, sizeof(meta_magic))
- )) {
+ b = NULL;
+ nb = 0;
+ (void) headerGetMagic(NULL, &b, &nb);
+ if (memcmp(block, b, nb)) {
(void) snprintf(buf, sizeof(buf), _("hdr magic: BAD\n"));
goto exit;
}
-} else {
- if (memcmp(block, header_magic, sizeof(header_magic))) {
- (void) snprintf(buf, sizeof(buf), _("hdr magic: BAD\n"));
- goto exit;
- }
-}
/*@-boundsread@*/
il = ntohl(block[2]);
@@ -747,7 +730,7 @@
ei[1] = block[3];
if ((xx = timedRead(fd, (char *)&ei[2], nb)) != nb) {
(void) snprintf(buf, sizeof(buf),
- _("hdr blob(%d): BAD, read returned %d\n"), nb, xx);
+ _("hdr blob(%u): BAD, read returned %d\n"), (unsigned)nb, xx);
goto exit;
}
/*@=bounds@*/
@@ -986,14 +969,18 @@
{ void * uh = NULL;
int_32 uht;
int_32 uhc;
- unsigned char * hmagic = (_newmagic ? meta_magic : header_magic);
+ unsigned char * hmagic = NULL;
+ size_t nmagic = 0;
if (!headerGetEntry(h, RPMTAG_HEADERIMMUTABLE, &uht, &uh, &uhc))
break;
+ (void) headerGetMagic(NULL, &hmagic, &nmagic);
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
dig->hdrmd5ctx = rpmDigestInit(dig->signature.hash_algo, RPMDIGEST_NONE);
- (void) rpmDigestUpdate(dig->hdrmd5ctx, hmagic, sizeof(header_magic));
- dig->nbytes += sizeof(header_magic);
+ if (hmagic && nmagic > 0) {
+ (void) rpmDigestUpdate(dig->hdrmd5ctx, hmagic, nmagic);
+ dig->nbytes += nmagic;
+ }
(void) rpmDigestUpdate(dig->hdrmd5ctx, uh, uhc);
dig->nbytes += uhc;
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
@@ -1015,14 +1002,18 @@
{ void * uh = NULL;
int_32 uht;
int_32 uhc;
- unsigned char * hmagic = (_newmagic ? meta_magic : header_magic);
+ unsigned char * hmagic = NULL;
+ size_t nmagic = 0;
if (!headerGetEntry(h, RPMTAG_HEADERIMMUTABLE, &uht, &uh, &uhc))
break;
+ (void) headerGetMagic(NULL, &hmagic, &nmagic);
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
- (void) rpmDigestUpdate(dig->hdrsha1ctx, hmagic, sizeof(header_magic));
- dig->nbytes += sizeof(header_magic);
+ if (hmagic && nmagic > 0) {
+ (void) rpmDigestUpdate(dig->hdrsha1ctx, hmagic, nmagic);
+ dig->nbytes += nmagic;
+ }
(void) rpmDigestUpdate(dig->hdrsha1ctx, uh, uhc);
dig->nbytes += uhc;
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/rpmchecksig.c
============================================================================
$ cvs diff -u -r1.127 -r1.128 rpmchecksig.c
--- rpm/lib/rpmchecksig.c 16 Aug 2007 19:04:48 -0000 1.127
+++ rpm/lib/rpmchecksig.c 17 Aug 2007 05:36:04 -0000 1.128
@@ -28,7 +28,6 @@
extern int _nolead;
extern int _nosigh;
-extern int _newmagic;
/**
*/
@@ -661,23 +660,6 @@
return res;
}
-/*@unchecked@*/
-static unsigned char header_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00
-};
-
-#ifdef NOTYET
-/*@observer@*/ /*@unchecked@*/
-static unsigned char sigh_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00
-};
-#endif
-
-/*@observer@*/ /*@unchecked@*/
-static unsigned char meta_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x3f, 0x00, 0x00, 0x00, 0x00
-};
-
/**
* @todo If the GPG key was known available, the md5 digest could be skipped.
*/
@@ -702,7 +684,8 @@
dig->nbytes += headerSizeof(h);
if (headerIsEntry(h, RPMTAG_HEADERIMMUTABLE)) {
- unsigned char * hmagic = (_newmagic ? meta_magic : header_magic);
+ unsigned char * hmagic = NULL;
+ size_t nmagic = 0;
void * uh;
int_32 uht, uhc;
@@ -713,11 +696,14 @@
rpmError(RPMERR_FREAD, _("%s: headerGetEntry failed\n"), fn);
goto exit;
}
+ (void) headerGetMagic(NULL, &hmagic, &nmagic);
dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
- (void) rpmDigestUpdate(dig->hdrsha1ctx, hmagic, sizeof(header_magic));
+ if (hmagic && nmagic > 0)
+ (void) rpmDigestUpdate(dig->hdrsha1ctx, hmagic, nmagic);
(void) rpmDigestUpdate(dig->hdrsha1ctx, uh, uhc);
dig->hdrmd5ctx = rpmDigestInit(dig->signature.hash_algo, RPMDIGEST_NONE);
- (void) rpmDigestUpdate(dig->hdrmd5ctx, hmagic, sizeof(header_magic));
+ if (hmagic && nmagic > 0)
+ (void) rpmDigestUpdate(dig->hdrmd5ctx, hmagic, nmagic);
(void) rpmDigestUpdate(dig->hdrmd5ctx, uh, uhc);
uh = headerFreeData(uh, uht);
}
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/signature.c
============================================================================
$ cvs diff -u -r2.177 -r2.178 signature.c
--- rpm/lib/signature.c 16 Aug 2007 20:50:26 -0000 2.177
+++ rpm/lib/signature.c 17 Aug 2007 05:36:04 -0000 2.178
@@ -143,21 +143,11 @@
/*@unchecked@*/
extern int _newmagic;
-/*@unchecked@*/
-static unsigned char header_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00
-};
-
/*@observer@*/ /*@unchecked@*/
static unsigned char sigh_magic[8] = {
0x8e, 0xad, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00
};
-/*@observer@*/ /*@unchecked@*/
-static unsigned char meta_magic[8] = {
- 0x8e, 0xad, 0xe8, 0x3f, 0x00, 0x00, 0x00, 0x00
-};
-
rpmRC rpmReadSignature(void * _fd, Header * sighp, sigType sig_type,
const char ** msg)
{
@@ -196,9 +186,14 @@
_("sigh size(%d): BAD, read returned %d\n"), (int)sizeof(block), xx);
goto exit;
}
- { unsigned char * hmagic = (_newmagic ? sigh_magic : header_magic);
+ { unsigned char * hmagic = NULL;
+ size_t nmagic = 0;
+
+ (void) headerGetMagic(NULL, &hmagic, &nmagic);
+ if (_newmagic) /* XXX FIXME: sigh needs its own magic. */
+ hmagic = sigh_magic;
- if (memcmp(block, hmagic, sizeof(header_magic))) {
+ if (memcmp(block, hmagic, nmagic)) {
(void) snprintf(buf, sizeof(buf),
_("sigh magic: BAD\n"));
goto exit;
@@ -313,6 +308,8 @@
goto exit;
}
sigh->flags |= HEADERFLAG_ALLOCATED;
+ if (_newmagic) /* XXX FIXME: sigh needs its own magic. */
+ (void) headerSetMagic(sigh, sigh_magic, sizeof(sigh_magic));
{ int sigSize = headerSizeof(sigh);
int pad = (8 - (sigSize % 8)) % 8; /* 8-byte pad */
@@ -698,7 +695,8 @@
(void) Fclose(fd); fd = NULL;
if (headerIsEntry(h, RPMTAG_HEADERIMMUTABLE)) {
- unsigned char * hmagic = (_newmagic ? meta_magic : header_magic);
+ unsigned char * hmagic = NULL;
+ size_t nmagic = 0;
DIGEST_CTX ctx;
void * uh;
int_32 uht, uhc;
@@ -709,8 +707,10 @@
h = headerFree(h);
goto exit;
}
+ (void) headerGetMagic(NULL, &hmagic, &nmagic);
ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
- (void) rpmDigestUpdate(ctx, hmagic, sizeof(header_magic));
+ if (hmagic && nmagic > 0)
+ (void) rpmDigestUpdate(ctx, hmagic, nmagic);
(void) rpmDigestUpdate(ctx, uh, uhc);
(void) rpmDigestFinal(ctx, &SHA1, NULL, 1);
uh = headerFreeData(uh, uht);
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/hdrinline.h
============================================================================
$ cvs diff -u -r1.11 -r1.12 hdrinline.h
--- rpm/rpmdb/hdrinline.h 2 Aug 2007 17:30:12 -0000 1.11
+++ rpm/rpmdb/hdrinline.h 17 Aug 2007 05:36:05 -0000 1.12
@@ -523,6 +523,34 @@
}
/** \ingroup header
+ * Return header magic.
+ * @param h header
+ * @param *magicp magic array
+ * @param *nmagicp no. bytes of magic
+ * @return 0 always
+ */
+/*@unused@*/ static inline
+int headerGetMagic(/*@null@*/ Header h, unsigned char **magicp, size_t *nmagicp)
+ /*@*/
+{
+ return hdrVec->hdrgetmagic(h, magicp, nmagicp);
+}
+
+/** \ingroup header
+ * Store header magic.
+ * @param h header
+ * @param magic magic array
+ * @param nmagic no. bytes of magic
+ * @return 0 always
+ */
+/*@unused@*/ static inline
+int headerSetMagic(/*@null@*/ Header h, unsigned char * magic, size_t nmagic)
+ /*@modifies h @*/
+{
+ return hdrVec->hdrsetmagic(h, magic, nmagic);
+}
+
+/** \ingroup header
* Return header origin (e.g path or URL).
* @param h header
* @return header origin
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.c
============================================================================
$ cvs diff -u -r1.59 -r1.60 header.c
--- rpm/rpmdb/header.c 3 Aug 2007 17:34:27 -0000 1.59
+++ rpm/rpmdb/header.c 17 Aug 2007 05:36:05 -0000 1.60
@@ -224,11 +224,10 @@
{
Header h = xcalloc(1, sizeof(*h));
-/*@-boundsread@*/
+ (void) memcpy(h->magic, header_magic, sizeof(h->magic));
/*@-assignexpose@*/
h->hv = *hdrVec; /* structure assignment */
/*@=assignexpose@*/
-/*@=boundsread@*/
h->blob = NULL;
h->origin = NULL;
h->instance = 0;
@@ -1045,6 +1044,9 @@
dataEnd = dataStart + dl;
h = xcalloc(1, sizeof(*h));
+ { unsigned char * hmagic = (_newmagic ? meta_magic : header_magic);
+ (void) memcpy(h->magic, hmagic, sizeof(h->magic));
+ }
/*@-assignexpose@*/
h->hv = *hdrVec; /* structure assignment */
/*@=assignexpose@*/
@@ -1197,6 +1199,46 @@
}
/** \ingroup header
+ * Return header magic.
+ * @param h header
+ * @param *magicp magic array
+ * @param *nmagicp no. bytes of magic
+ * @return 0 always
+ */
+static
+int headerGetMagic(/*@null@*/ Header h, unsigned char **magicp, size_t *nmagicp)
+ /*@*/
+{
+ unsigned char * hmagic = (_newmagic ? meta_magic : header_magic);
+ if (magicp)
+ *magicp = (h ? h->magic : hmagic);
+ if (nmagicp)
+ *nmagicp = (h ? sizeof(h->magic) : sizeof(header_magic));
+ return 0;
+}
+
+/** \ingroup header
+ * Store header magic.
+ * @param h header
+ * @param magic magic array
+ * @param nmagic no. bytes of magic
+ * @return 0 always
+ */
+static
+int headerSetMagic(/*@null@*/ Header h, unsigned char * magic, size_t nmagic)
+ /*@modifies h @*/
+{
+ if (nmagic > sizeof(h->magic))
+ nmagic = sizeof(h->magic);
+ if (h) {
+ memset(h->magic, 0, sizeof(h->magic));
+ if (nmagic > 0)
+ memcpy(h->magic, magic, nmagic);
+ }
+ return 0;
+}
+
+/** \ingroup header
* Return header origin (e.g path or URL).
* @param h header
* @return header origin
@@ -4080,6 +4122,8 @@
headerFreeIterator,
headerInitIterator,
headerNextIterator,
+ headerGetMagic,
+ headerSetMagic,
headerGetOrigin,
headerSetOrigin,
headerGetInstance,
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.h
============================================================================
$ cvs diff -u -r1.20 -r1.21 header.h
--- rpm/rpmdb/header.h 3 Aug 2007 18:29:54 -0000 1.20
+++ rpm/rpmdb/header.h 17 Aug 2007 05:36:05 -0000 1.21
@@ -715,6 +715,28 @@
/*@modifies hi, *tag, *type, *p, *c @*/;
/** \ingroup header
+ * Return header magic.
+ * @param h header
+ * @param *magicp magic array
+ * @param *nmagicp no. bytes of magic
+ * @return 0 always
+ */
+typedef
+int (*HDRgetmagic)(/*@null@*/ Header h, unsigned char **magicp, size_t *nmagicp)
+ /*@*/;
+
+/** \ingroup header
+ * Store header magic.
+ * @param h header
+ * @param magic magic array
+ * @param nmagic no. bytes of magic
+ * @return 0 always
+ */
+typedef
+int (*HDRsetmagic)(/*@null@*/ Header h, unsigned char * magic, size_t nmagic)
+ /*@modifies h @*/;
+
+/** \ingroup header
* Return header origin (e.g path or URL).
* @param h header
* @return header origin
@@ -788,6 +810,8 @@
HDRfreeiter hdrfreeiter;
HDRinititer hdrinititer;
HDRnextiter hdrnextiter;
+ HDRgetmagic hdrgetmagic;
+ HDRsetmagic hdrsetmagic;
HDRgetorigin hdrgetorigin;
HDRsetorigin hdrsetorigin;
HDRgetinstance hdrgetinstance;
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header_internal.h
============================================================================
$ cvs diff -u -r1.14 -r1.15 header_internal.h
--- rpm/rpmdb/header_internal.h 9 Jun 2007 19:08:00 -0000 1.14
+++ rpm/rpmdb/header_internal.h 17 Aug 2007 05:36:05 -0000 1.15
@@ -55,6 +55,7 @@
struct headerToken_s {
/*@unused@*/
struct HV_s hv; /*!< Header public methods. */
+ unsigned char magic[8]; /*!< Header magic. */
/*@only@*/ /*@null@*/
void * blob; /*!< Header region blob. */
/*@only@*/ /*@null@*/
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/rpmdb.c
============================================================================
$ cvs diff -u -r1.150 -r1.151 rpmdb.c
--- rpm/rpmdb/rpmdb.c 9 Aug 2007 18:45:30 -0000 1.150
+++ rpm/rpmdb/rpmdb.c 17 Aug 2007 05:36:05 -0000 1.151
@@ -1807,13 +1807,15 @@
DBT * data = &mi->mi_data;
sigset_t signalMask;
rpmRC rpmrc = RPMRC_NOTFOUND;
+ size_t nb = 0;
int xx;
+ (void) headerGetMagic(mi->mi_h, NULL, &nb);
/*@i@*/ key->data = (void *) &mi->mi_prevoffset;
key->size = sizeof(mi->mi_prevoffset);
data->data = headerUnload(mi->mi_h);
data->size = headerSizeof(mi->mi_h);
- data->size -= 8; /* XXX HEADER_MAGIC_NO */
+ data->size -= nb; /* XXX HEADER_MAGIC_NO */
/* Check header digest/signature on blob export (if requested). */
if (mi->mi_hdrchk && mi->mi_ts) {
@@ -3086,6 +3088,7 @@
int dbix;
union _dbswap mi_offset;
unsigned int hdrNum = 0;
+ size_t nb;
int ret = 0;
int rc;
int xx;
@@ -3137,10 +3140,12 @@
/*@-branchstate@*/
if (dbi != NULL) {
+ nb = 0;
+ (void) headerGetMagic(h, NULL, &nb);
/* XXX db0: hack to pass sizeof header to fadAlloc */
datap = h;
datalen = headerSizeof(h);
- datalen -= 8; /* XXX HEADER_MAGIC_NO */
+ datalen -= nb; /* XXX HEADER_MAGIC_NO */
xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
@@ -3254,9 +3259,11 @@
key->data = (void *) &mi_offset;
/*@=immediatetrans@*/
key->size = sizeof(mi_offset.ui);
+nb = 0;
+(void) headerGetMagic(h, NULL, &nb);
data->data = headerUnload(h);
data->size = headerSizeof(h);
-data->size -= 8; /* XXX HEADER_MAGIC_NO */
+data->size -= nb; /* XXX HEADER_MAGIC_NO */
/* Check header digest/signature on blob export. */
if (hdrchk && ts) {
@@ .
Received on Fri Aug 17 07:36:06 2007