aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2009-05-05 09:30:34 +0000
committerWerner Koch <[email protected]>2009-05-05 09:30:34 +0000
commita4fd67937ccc1ce72c3500dba3240bf383a7632c (patch)
treef77df5f5d7cf2f5f558c6fb4ba95801d29b80b73
parent* gpgkeys_mailto.in: Set 'mail-from' as a keyserver-option, rather (diff)
downloadgnupg-a4fd67937ccc1ce72c3500dba3240bf383a7632c.tar.gz
gnupg-a4fd67937ccc1ce72c3500dba3240bf383a7632c.zip
Fix bug#931.
Silent a compiler warning.
-rw-r--r--g10/ChangeLog9
-rw-r--r--g10/parse-packet.c49
-rw-r--r--g10/tdbio.c16
3 files changed, 46 insertions, 28 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index 5846dc27d..af6bf0981 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,12 @@
+2009-05-05 Werner Koch <[email protected]>
+
+ * tdbio.c (lookup_hashtable): Add const to function args.
+ (cmp_trec_fpr): Ditto.
+ (tdbio_search_trust_byfpr): Remove cast.
+
+ * parse-packet.c (parse): Remove special treatment for compressed
+ new style packets. Fixes bug#931.
+
2009-04-03 Werner Koch <[email protected]>
* gpgv.c (main): Pass readonly flag to keydb_add_resource.
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index 61c289cf8..c614ca264 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -346,12 +346,19 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
rc = G10ERR_INVALID_PACKET;
goto leave;
}
- if (pkttype == PKT_COMPRESSED) {
- iobuf_set_partial_block_mode(inp, c & 0xff);
- pktlen = 0;/* to indicate partial length */
- partial=1;
- }
- else {
+/* The follwing code has been here for ages (2002-08-30) but it is
+ clearly wrong: For example passing a 0 as second argument to
+ iobuf_set_partial_block_mode stops the partial block mode which we
+ definitely do not want. Also all values < 224 or 255 are not
+ valid. Let's disable it and put PKT_COMPRESSED into the list of
+ allowed packets with partial header until someone complains. */
+/* if (pkttype == PKT_COMPRESSED) { */
+/* iobuf_set_partial_block_mode(inp, c & 0xff); */
+/* pktlen = 0;/\* to indicate partial length *\/ */
+/* partial=1; */
+/* } */
+/* else { */
+ {
hdr[hdrlen++] = c;
if( c < 192 )
pktlen = c;
@@ -384,20 +391,22 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
}
else
{
- /* Partial body length. Note that we handled
- PKT_COMPRESSED earlier. */
- if(pkttype==PKT_PLAINTEXT || pkttype==PKT_ENCRYPTED
- || pkttype==PKT_ENCRYPTED_MDC)
- {
- iobuf_set_partial_block_mode(inp, c & 0xff);
- pktlen = 0;/* to indicate partial length */
- partial=1;
- }
- else
- {
- log_error("%s: partial length for invalid"
- " packet type %d\n",iobuf_where(inp),pkttype);
- rc=G10ERR_INVALID_PACKET;
+ /* Partial body length. */
+ switch (pkttype)
+ {
+ case PKT_PLAINTEXT:
+ case PKT_ENCRYPTED:
+ case PKT_ENCRYPTED_MDC:
+ case PKT_COMPRESSED:
+ iobuf_set_partial_block_mode (inp, (c & 0xff));
+ pktlen = 0; /* Indicate partial length. */
+ partial= 1;
+ break;
+
+ default:
+ log_error ("%s: partial length for invalid"
+ " packet type %d\n", iobuf_where(inp),pkttype);
+ rc = G10ERR_INVALID_PACKET;
goto leave;
}
}
diff --git a/g10/tdbio.c b/g10/tdbio.c
index 8fc02bc82..cdfc27a6b 100644
--- a/g10/tdbio.c
+++ b/g10/tdbio.c
@@ -1007,8 +1007,8 @@ drop_from_hashtable( ulong table, byte *key, int keylen, ulong recnum )
*/
static int
lookup_hashtable( ulong table, const byte *key, size_t keylen,
- int (*cmpfnc)(void*, const TRUSTREC *), void *cmpdata,
- TRUSTREC *rec )
+ int (*cmpfnc)(const void*, const TRUSTREC *),
+ const void *cmpdata, TRUSTREC *rec )
{
int rc;
ulong hashrec, item;
@@ -1464,10 +1464,10 @@ tdbio_new_recnum()
static int
-cmp_trec_fpr ( void *fpr, const TRUSTREC *rec )
+cmp_trec_fpr (const void *fpr, const TRUSTREC *rec )
{
- return rec->rectype == RECTYPE_TRUST
- && !memcmp( rec->r.trust.fingerprint, fpr, 20);
+ return (rec->rectype == RECTYPE_TRUST
+ && !memcmp( rec->r.trust.fingerprint, fpr, 20));
}
@@ -1476,9 +1476,9 @@ tdbio_search_trust_byfpr( const byte *fingerprint, TRUSTREC *rec )
{
int rc;
- /* locate the trust record using the hash table */
- rc = lookup_hashtable( get_trusthashrec(), fingerprint, 20,
- cmp_trec_fpr, (void*)fingerprint, rec );
+ /* Locate the trust record using the hash table. */
+ rc = lookup_hashtable (get_trusthashrec(), fingerprint, 20,
+ cmp_trec_fpr, fingerprint, rec);
return rc;
}