aboutsummaryrefslogtreecommitdiffstats
path: root/g10/parse-packet.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>1998-07-06 10:23:57 +0000
committerWerner Koch <[email protected]>1998-07-06 10:23:57 +0000
commita9ec668cbe5b3335f5db0f05b8e9e88e29ada52c (patch)
treee159c79b615fcdcb65f31ee5d1d0a2b1ba84e9aa /g10/parse-packet.c
parentpartly added creation of OP partial length headers (diff)
downloadgnupg-a9ec668cbe5b3335f5db0f05b8e9e88e29ada52c.tar.gz
gnupg-a9ec668cbe5b3335f5db0f05b8e9e88e29ada52c.zip
intermediate release
Diffstat (limited to 'g10/parse-packet.c')
-rw-r--r--g10/parse-packet.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index 20afd4163..ab1e6cdf8 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -203,7 +203,7 @@ static int
parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
int *skip, IOBUF out, int do_skip )
{
- int rc, c, ctb, pkttype, lenbytes;
+ int rc=0, c, ctb, pkttype, lenbytes;
unsigned long pktlen;
byte hdr[8];
int hdrlen;
@@ -213,13 +213,16 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
assert( !pkt->pkt.generic );
if( retpos )
*retpos = iobuf_tell(inp);
- if( (ctb = iobuf_get(inp)) == -1 )
- return -1;
+ if( (ctb = iobuf_get(inp)) == -1 ) {
+ rc = -1;
+ goto leave;
+ }
hdrlen=0;
hdr[hdrlen++] = ctb;
if( !(ctb & 0x80) ) {
log_error("%s: invalid packet (ctb=%02x)\n", iobuf_where(inp), ctb );
- return G10ERR_INVALID_PACKET;
+ rc = G10ERR_INVALID_PACKET;
+ goto leave;
}
pktlen = 0;
new_ctb = !!(ctb & 0x40);
@@ -227,7 +230,8 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
pkttype = ctb & 0x3f;
if( (c = iobuf_get(inp)) == -1 ) {
log_error("%s: 1st length byte missing\n", iobuf_where(inp) );
- return G10ERR_INVALID_PACKET;
+ rc = G10ERR_INVALID_PACKET;
+ goto leave;
}
hdr[hdrlen++] = c;
if( c < 192 )
@@ -236,7 +240,8 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
pktlen = (c - 192) * 256;
if( (c = iobuf_get(inp)) == -1 ) {
log_error("%s: 2nd length byte missing\n", iobuf_where(inp) );
- return G10ERR_INVALID_PACKET;
+ rc = G10ERR_INVALID_PACKET;
+ goto leave;
}
hdr[hdrlen++] = c;
pktlen += c + 192;
@@ -247,7 +252,8 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
pktlen |= (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 8;
if( (c = iobuf_get(inp)) == -1 ) {
log_error("%s: 4 byte length invalid\n", iobuf_where(inp) );
- return G10ERR_INVALID_PACKET;
+ rc = G10ERR_INVALID_PACKET;
+ goto leave;
}
pktlen |= (hdr[hdrlen++] = c );
}
@@ -277,13 +283,14 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
rc = G10ERR_WRITE_FILE;
else
rc = copy_packet(inp, out, pkttype, pktlen );
- return rc;
+ goto leave;
}
if( do_skip || !pkttype || (reqtype && pkttype != reqtype) ) {
skip_packet(inp, pkttype, pktlen);
*skip = 1;
- return 0;
+ rc = 0;
+ goto leave;
}
if( DBG_PACKET )
@@ -341,6 +348,9 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
break;
}
+ leave:
+ if( rc == -1 && iobuf_error(inp) )
+ rc = G10ERR_INV_KEYRING;
return rc;
}
@@ -925,6 +935,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
sk->hdrbytes = hdrlen;
sk->version = version;
sk->pubkey_algo = algorithm;
+ sk->pubkey_usage = 0; /* not yet used */
}
else {
PKT_public_key *pk = pkt->pkt.public_key;
@@ -934,6 +945,7 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
pk->hdrbytes = hdrlen;
pk->version = version;
pk->pubkey_algo = algorithm;
+ pk->pubkey_usage = 0; /* not yet used */
}
nskey = pubkey_get_nskey( algorithm );
npkey = pubkey_get_npkey( algorithm );