- disable expensive header+payload verifies in default config.
- adjust digest/signature stats to count #pkgs and bytes. CVS patchset: 7465 CVS date: 2004/10/15 00:14:29
This commit is contained in:
parent
44b6c33422
commit
d57bc03f65
2
CHANGES
2
CHANGES
|
@ -16,6 +16,8 @@
|
|||
- python: permit rpm.fi() analogue to hdr.fiFromHeader() creator.
|
||||
- silently add default %defattr(-,root,root) for all packages.
|
||||
- fix: don't set handler if SIG_IGN is already set (#134474).
|
||||
- disable expensive header+payload verifies in default config.
|
||||
- adjust digest/signature stats to count #pkgs and bytes.
|
||||
|
||||
4.3.1 -> 4.3.2:
|
||||
- use /etc/selinux/targeted/contexts/files/file_contexts for now.
|
||||
|
|
|
@ -749,9 +749,10 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
|
|||
int_32 sigtype;
|
||||
const void * sig;
|
||||
int_32 siglen;
|
||||
rpmtsOpX opx;
|
||||
size_t nb;
|
||||
Header h = NULL;
|
||||
const char * msg;
|
||||
int hmagic;
|
||||
rpmVSFlags vsflags;
|
||||
rpmRC rc = RPMRC_FAIL; /* assume failure */
|
||||
int xx;
|
||||
|
@ -819,42 +820,60 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
|
|||
|
||||
#define _chk(_mask) (sigtag == 0 && !(vsflags & (_mask)))
|
||||
|
||||
/* Figger the most effective available signature. */
|
||||
/*
|
||||
* Figger the most effective available signature.
|
||||
* Prefer signatures over digests, then header-only over header+payload.
|
||||
* DSA will be preferred over RSA if both exist because tested first.
|
||||
* Note that NEEDPAYLOAD prevents header+payload signatures and digests.
|
||||
*/
|
||||
sigtag = 0;
|
||||
opx = 0;
|
||||
vsflags = rpmtsVSFlags(ts);
|
||||
#ifdef DYING
|
||||
if (_chk(RPMVSF_NODSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_DSA))
|
||||
if (_chk(RPMVSF_NODSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_DSA)) {
|
||||
sigtag = RPMSIGTAG_DSA;
|
||||
if (_chk(RPMVSF_NORSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_RSA))
|
||||
} else
|
||||
if (_chk(RPMVSF_NORSAHEADER) && headerIsEntry(sigh, RPMSIGTAG_RSA)) {
|
||||
sigtag = RPMSIGTAG_RSA;
|
||||
#endif
|
||||
} else
|
||||
if (_chk(RPMVSF_NODSA|RPMVSF_NEEDPAYLOAD) &&
|
||||
headerIsEntry(sigh, RPMSIGTAG_GPG))
|
||||
{
|
||||
sigtag = RPMSIGTAG_GPG;
|
||||
fdInitDigest(fd, PGPHASHALGO_SHA1, 0);
|
||||
}
|
||||
opx = RPMTS_OP_SIGNATURE;
|
||||
} else
|
||||
if (_chk(RPMVSF_NORSA|RPMVSF_NEEDPAYLOAD) &&
|
||||
headerIsEntry(sigh, RPMSIGTAG_PGP))
|
||||
{
|
||||
sigtag = RPMSIGTAG_PGP;
|
||||
fdInitDigest(fd, PGPHASHALGO_MD5, 0);
|
||||
}
|
||||
#ifdef DYING
|
||||
if (_chk(RPMVSF_NOSHA1HEADER) && headerIsEntry(sigh, RPMSIGTAG_SHA1))
|
||||
opx = RPMTS_OP_SIGNATURE;
|
||||
} else
|
||||
if (_chk(RPMVSF_NOSHA1HEADER) && headerIsEntry(sigh, RPMSIGTAG_SHA1)) {
|
||||
sigtag = RPMSIGTAG_SHA1;
|
||||
#endif
|
||||
} else
|
||||
if (_chk(RPMVSF_NOMD5|RPMVSF_NEEDPAYLOAD) &&
|
||||
headerIsEntry(sigh, RPMSIGTAG_MD5))
|
||||
{
|
||||
sigtag = RPMSIGTAG_MD5;
|
||||
fdInitDigest(fd, PGPHASHALGO_MD5, 0);
|
||||
opx = RPMTS_OP_DIGEST;
|
||||
}
|
||||
|
||||
/* Read the metadata, computing digest(s) on the fly. */
|
||||
h = NULL;
|
||||
msg = NULL;
|
||||
|
||||
/* XXX stats will include header i/o and setup overhead. */
|
||||
/* XXX repackaged packages have appended tags, legacy dig/sig check fails */
|
||||
if (opx > 0)
|
||||
(void) rpmswEnter(rpmtsOp(ts, opx), 0);
|
||||
nb = -fd->stats->ops[FDSTAT_READ].bytes;
|
||||
rc = rpmReadHeader(ts, fd, &h, &msg);
|
||||
nb += fd->stats->ops[FDSTAT_READ].bytes;
|
||||
if (opx > 0)
|
||||
(void) rpmswExit(rpmtsOp(ts, opx), nb);
|
||||
|
||||
if (rc != RPMRC_OK || h == NULL) {
|
||||
rpmError(RPMERR_FREAD, _("%s: headerRead failed: %s"), fn,
|
||||
(msg && *msg ? msg : "\n"));
|
||||
|
@ -863,7 +882,7 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
|
|||
}
|
||||
msg = _free(msg);
|
||||
|
||||
/* Any signatures to check? */
|
||||
/* Any digests or signatures to check? */
|
||||
if (sigtag == 0) {
|
||||
rc = RPMRC_OK;
|
||||
goto exit;
|
||||
|
@ -894,7 +913,7 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
|
|||
rpmMessage(RPMMESS_WARNING,
|
||||
_("only V3 signatures can be verified, skipping V%u signature\n"),
|
||||
dig->signature.version);
|
||||
rc = RPMRC_OK;
|
||||
rc = RPMRC_OK; /* XXX return header w/o verify */
|
||||
goto exit;
|
||||
}
|
||||
{ void * uh = NULL;
|
||||
|
@ -903,11 +922,14 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
|
|||
|
||||
if (!headerGetEntry(h, RPMTAG_HEADERIMMUTABLE, &uht, &uh, &uhc))
|
||||
break;
|
||||
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
|
||||
dig->md5ctx = rpmDigestInit(PGPHASHALGO_MD5, RPMDIGEST_NONE);
|
||||
(void) rpmDigestUpdate(dig->md5ctx, header_magic, sizeof(header_magic));
|
||||
dig->nbytes += sizeof(header_magic);
|
||||
(void) rpmDigestUpdate(dig->md5ctx, uh, uhc);
|
||||
dig->nbytes += uhc;
|
||||
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
|
||||
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
|
||||
uh = headerFreeData(uh, uht);
|
||||
} break;
|
||||
case RPMSIGTAG_DSA:
|
||||
|
@ -918,7 +940,7 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
|
|||
rpmMessage(RPMMESS_WARNING,
|
||||
_("only V3 signatures can be verified, skipping V%u signature\n"),
|
||||
dig->signature.version);
|
||||
rc = RPMRC_OK;
|
||||
rc = RPMRC_OK; /* XXX return header w/o verify */
|
||||
goto exit;
|
||||
}
|
||||
/*@fallthrough@*/
|
||||
|
@ -929,42 +951,46 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
|
|||
|
||||
if (!headerGetEntry(h, RPMTAG_HEADERIMMUTABLE, &uht, &uh, &uhc))
|
||||
break;
|
||||
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
|
||||
dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
|
||||
(void) rpmDigestUpdate(dig->hdrsha1ctx, header_magic, sizeof(header_magic));
|
||||
dig->nbytes += sizeof(header_magic);
|
||||
(void) rpmDigestUpdate(dig->hdrsha1ctx, uh, uhc);
|
||||
dig->nbytes += uhc;
|
||||
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
|
||||
if (sigtag == RPMSIGTAG_SHA1)
|
||||
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
|
||||
uh = headerFreeData(uh, uht);
|
||||
} break;
|
||||
case RPMSIGTAG_GPG:
|
||||
case RPMSIGTAG_PGP5: /* XXX legacy */
|
||||
case RPMSIGTAG_PGP:
|
||||
/* Parse the parameters from the OpenPGP packets that will be needed. */
|
||||
xx = pgpPrtPkts(sig, siglen, dig,
|
||||
(_print_pkts & rpmIsDebug()));
|
||||
xx = pgpPrtPkts(sig, siglen, dig, (_print_pkts & rpmIsDebug()));
|
||||
|
||||
/* XXX only V3 signatures for now. */
|
||||
if (dig->signature.version != 3) {
|
||||
rpmMessage(RPMMESS_WARNING,
|
||||
_("only V3 signatures can be verified, skipping V%u signature\n"),
|
||||
dig->signature.version);
|
||||
rc = RPMRC_OK;
|
||||
rc = RPMRC_OK; /* XXX return header w/o verify */
|
||||
goto exit;
|
||||
}
|
||||
/*@fallthrough@*/
|
||||
case RPMSIGTAG_MD5:
|
||||
/* Legacy signatures need the compressed payload in the digest too. */
|
||||
hmagic = ((l->major >= 3) ? HEADER_MAGIC_YES : HEADER_MAGIC_NO);
|
||||
dig->nbytes += headerSizeof(h, hmagic);
|
||||
(void) rpmswEnter(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
|
||||
while ((count = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0)
|
||||
dig->nbytes += count;
|
||||
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), dig->nbytes);
|
||||
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
|
||||
dig->nbytes += nb; /* XXX include size of header blob. */
|
||||
if (count < 0) {
|
||||
rpmError(RPMERR_FREAD, _("%s: Fread failed: %s\n"),
|
||||
fn, Fstrerror(fd));
|
||||
rc = RPMRC_FAIL;
|
||||
goto exit;
|
||||
}
|
||||
dig->nbytes += count;
|
||||
|
||||
/* XXX Steal the digest-in-progress from the file handle. */
|
||||
for (i = fd->ndigests - 1; i >= 0; i--) {
|
||||
|
|
|
@ -1025,6 +1025,7 @@ verifyMD5Signature(const rpmts ts, /*@out@*/ char * t,
|
|||
(void) rpmDigestFinal(rpmDigestDup(md5ctx),
|
||||
(void **)&md5sum, &md5len, 0);
|
||||
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), 0);
|
||||
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
|
||||
|
||||
if (md5len != siglen || memcmp(md5sum, sig, md5len)) {
|
||||
res = RPMRC_FAIL;
|
||||
|
@ -1187,6 +1188,7 @@ verifyPGPSignature(rpmts ts, /*@out@*/ char * t,
|
|||
|
||||
xx = rpmDigestFinal(ctx, (void **)&dig->md5, &dig->md5len, 1);
|
||||
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), sigp->hashlen);
|
||||
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
|
||||
|
||||
/* Compare leading 16 bits of digest for quick check. */
|
||||
s = dig->md5;
|
||||
|
@ -1312,6 +1314,7 @@ verifyGPGSignature(rpmts ts, /*@out@*/ char * t,
|
|||
#endif
|
||||
xx = rpmDigestFinal(ctx, (void **)&dig->sha1, &dig->sha1len, 1);
|
||||
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_DIGEST), sigp->hashlen);
|
||||
rpmtsOp(ts, RPMTS_OP_DIGEST)->count--; /* XXX one too many */
|
||||
|
||||
mpnzero(&dig->hm); (void) mpnsethex(&dig->hm, dig->sha1);
|
||||
|
||||
|
|
14
lib/tgi.c
14
lib/tgi.c
|
@ -65,6 +65,7 @@ main(int argc, char *const argv[])
|
|||
{
|
||||
poptContext optCon;
|
||||
rpmts ts = NULL;
|
||||
rpmVSFlags vsflags;
|
||||
rpmgi gi = NULL;
|
||||
const char ** av;
|
||||
const char * arg;
|
||||
|
@ -79,6 +80,19 @@ main(int argc, char *const argv[])
|
|||
ftsOpts = (FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOSTAT);
|
||||
|
||||
ts = rpmtsCreate();
|
||||
vsflags = rpmExpandNumeric("%{?_vsflags_query}");
|
||||
if (rpmcliQueryFlags & VERIFY_DIGEST)
|
||||
vsflags |= _RPMVSF_NODIGESTS;
|
||||
if (rpmcliQueryFlags & VERIFY_SIGNATURE)
|
||||
vsflags |= _RPMVSF_NOSIGNATURES;
|
||||
if (rpmcliQueryFlags & VERIFY_HDRCHK)
|
||||
vsflags |= RPMVSF_NOHDRCHK;
|
||||
(void) rpmtsSetVSFlags(ts, vsflags);
|
||||
|
||||
{ int_32 tid = (int_32) time(NULL);
|
||||
(void) rpmtsSetTid(ts, tid);
|
||||
}
|
||||
|
||||
av = poptGetArgs(optCon);
|
||||
gi = rpmgiNew(ts, gitag, av, ftsOpts);
|
||||
(void) rpmgiSetQueryFormat(gi, queryFormat);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#/*! \page config_macros Default configuration: @RPMCONFIGDIR@/macros
|
||||
# \verbatim
|
||||
#
|
||||
# $Id: macros.in,v 1.152 2004/10/09 20:22:01 jbj Exp $
|
||||
# $Id: macros.in,v 1.153 2004/10/15 00:14:29 jbj Exp $
|
||||
#
|
||||
# This is a global RPM configuration file. All changes made here will
|
||||
# be lost when the rpm package is upgraded. Any per-system configuration
|
||||
|
@ -727,7 +727,7 @@ print (t)\
|
|||
# Note: the %_vsflags_erase applies to --upgrade/--freshen modes as
|
||||
# well as --erase.
|
||||
#
|
||||
%__vsflags 0
|
||||
%__vsflags 0xf0000
|
||||
%_vsflags_build %{__vsflags}
|
||||
%_vsflags_erase %{__vsflags}
|
||||
%_vsflags_install %{__vsflags}
|
||||
|
|
|
@ -24,7 +24,7 @@ example_LDFLAGS = -L. -lz
|
|||
minigzip_SOURCES = minigzip.c
|
||||
minigzip_LDFLAGS = -L. -lz
|
||||
|
||||
BUILT_SOURCES = Doxyfile zlib.lcd
|
||||
BUILT_SOURCES = # Doxyfile zlib.lcd
|
||||
|
||||
zlib.lcd: Makefile.am ${libz_la_SOURCES} ${noinst_HEADERS}
|
||||
-lclint ${DEFS} ${INCLUDES} ${libz_la_SOURCES} -dump $@ 2>/dev/null
|
||||
|
|
Loading…
Reference in New Issue