summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2011-10-24 12:21:01 +0300
committerPanu Matilainen <pmatilai@redhat.com>2011-10-24 12:34:07 +0300
commit97a452f732a256e033c16b4b87a8674b91429b45 (patch)
tree4951425f021c5c9cd7ebc79a35a554c91c9aa19b
parentb88b2178d40147be6c28dd9b97905ee1dc5366d5 (diff)
downloadrpm-97a452f732a256e033c16b4b87a8674b91429b45.tar.gz
rpm-97a452f732a256e033c16b4b87a8674b91429b45.tar.bz2
rpm-97a452f732a256e033c16b4b87a8674b91429b45.zip
Sanitize pgpsigFormat()
- Eliminate bogus size calculations: we have a buffer of td->count size that may or may not contain legal OpenPGP signature. Leave it up to pgpPrtPkts() to validate & figure it out and check its return code instead, eliminating need to repeat a bunch of tedious calculations here. - Use non-zero signature version is used as a hint for valid signature, should be "close enough" for the rest of the code.
-rw-r--r--lib/formats.c49
1 files changed, 13 insertions, 36 deletions
diff --git a/lib/formats.c b/lib/formats.c
index b24d80b3f..fb203559f 100644
--- a/lib/formats.c
+++ b/lib/formats.c
@@ -422,46 +422,23 @@ static char * pgpsigFormat(rpmtd td)
if (rpmtdType(td) != RPM_BIN_TYPE) {
val = xstrdup(_("(not a blob)"));
} else {
- const uint8_t * pkt = td->data;
- size_t pktlen = 0;
- unsigned int v = *pkt;
- pgpTag tag = 0;
- size_t plen;
- size_t hlen = 0;
-
- if (v & 0x80) {
- if (v & 0x40) {
- tag = (v & 0x3f);
- plen = pgpLen(pkt+1, &hlen);
- } else {
- tag = (v >> 2) & 0xf;
- plen = (1 << (v & 0x3));
- hlen = pgpGrab(pkt+1, plen);
- }
-
- pktlen = 1 + plen + hlen;
- }
+ pgpDig dig = pgpNewDig();
+ pgpDigParams sigp = &dig->signature;
- if (pktlen == 0 || tag != PGPTAG_SIGNATURE) {
+ if (pgpPrtPkts(td->data, td->count, dig, 0) || sigp->version == 0) {
val = xstrdup(_("(not an OpenPGP signature)"));
} else {
- pgpDig dig = pgpNewDig();
- pgpDigParams sigp = &dig->signature;
char dbuf[BUFSIZ];
- char *keyid = NULL;
-
- (void) pgpPrtPkts(pkt, pktlen, dig, 0);
-
- { unsigned int dateint = pgpGrab(sigp->time, sizeof(sigp->time));
- time_t date = dateint;
- struct tm * tms = localtime(&date);
- if (!(tms && strftime(dbuf, sizeof(dbuf), "%c", tms) > 0)) {
- snprintf(dbuf, sizeof(dbuf),
- _("Invalid date %u\n"), dateint);
- dbuf[sizeof(dbuf)-1] = '\0';
- }
+ char *keyid = pgpHexStr(sigp->signid, sizeof(sigp->signid));
+ unsigned int dateint = pgpGrab(sigp->time, sizeof(sigp->time));
+ time_t date = dateint;
+ struct tm * tms = localtime(&date);
+
+ if (!(tms && strftime(dbuf, sizeof(dbuf), "%c", tms) > 0)) {
+ snprintf(dbuf, sizeof(dbuf),
+ _("Invalid date %u\n"), dateint);
+ dbuf[sizeof(dbuf)-1] = '\0';
}
- keyid = pgpHexStr(sigp->signid, sizeof(sigp->signid));
rasprintf(&val, "%s/%s, %s, Key ID %s\n",
pgpValString(PGPVAL_PUBKEYALGO, sigp->pubkey_algo),
@@ -469,8 +446,8 @@ static char * pgpsigFormat(rpmtd td)
dbuf, keyid);
free(keyid);
- pgpFreeDig(dig);
}
+ pgpFreeDig(dig);
}
return val;