From 82a8277b6cc6a5ab5f1b024396c43bca3f3f6ebc Mon Sep 17 00:00:00 2001 From: David Shaw Date: Fri, 6 Apr 2007 03:46:03 +0000 Subject: [PATCH] * parse-packet.c (parse_marker): New. Enforce that the marker contains 'P', 'G', 'P', and nothing but. (parse): Call it here. (skip_packet): No longer need to handle marker packets here. --- g10/ChangeLog | 9 ++++++ g10/parse-packet.c | 80 +++++++++++++++++++++++++++++++++------------- 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/g10/ChangeLog b/g10/ChangeLog index 3616e4b1a..01071dcd0 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,12 @@ +2007-04-05 David Shaw + + From STABLE-BRANCH-1-4 + + * parse-packet.c (parse_marker): New. Enforce that the marker + contains 'P', 'G', 'P', and nothing but. + (parse): Call it here. + (skip_packet): No longer need to handle marker packets here. + 2007-03-14 David Shaw From STABLE-BRANCH-1-4 diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 5d5d14a56..90201d6be 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -1,6 +1,6 @@ /* parse-packet.c - read packets - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - * 2006 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + * 2007 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -52,6 +52,7 @@ static int copy_packet( IOBUF inp, IOBUF out, int pkttype, static void skip_packet( IOBUF inp, int pkttype, unsigned long pktlen, int partial ); static void *read_rest( IOBUF inp, size_t pktlen, int partial ); +static int parse_marker( IOBUF inp, int pkttype, unsigned long pktlen ); static int parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet ); static int parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, @@ -579,6 +580,9 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos, case PKT_GPG_CONTROL: rc = parse_gpg_control(inp, pkttype, pktlen, pkt, partial ); break; + case PKT_MARKER: + rc = parse_marker(inp,pkttype,pktlen); + break; default: skip_packet(inp, pkttype, pktlen, partial); break; @@ -644,32 +648,31 @@ copy_packet( IOBUF inp, IOBUF out, int pkttype, static void skip_packet( IOBUF inp, int pkttype, unsigned long pktlen, int partial ) { - if( list_mode ) { - if( pkttype == PKT_MARKER ) - fputs(":marker packet:\n", listfp ); - else - fprintf (listfp, ":unknown packet: type %2d, length %lu\n", - pkttype, pktlen); - if( pkttype ) { - int c, i=0 ; - if( pkttype != PKT_MARKER ) - fputs("dump:", listfp ); - if( partial ) { - while( (c=iobuf_get(inp)) != -1 ) - dump_hex_line(c, &i); + if( list_mode ) + { + fprintf (listfp, ":unknown packet: type %2d, length %lu\n", + pkttype, pktlen); + if( pkttype ) + { + int c, i=0 ; + fputs("dump:", listfp ); + if( partial ) + { + while( (c=iobuf_get(inp)) != -1 ) + dump_hex_line(c, &i); } - else { - for( ; pktlen; pktlen-- ) - dump_hex_line(iobuf_get(inp), &i); + else + { + for( ; pktlen; pktlen-- ) + dump_hex_line(iobuf_get(inp), &i); } - putc ('\n', listfp); - return; + putc ('\n', listfp); + return; } } - iobuf_skip_rest(inp,pktlen,partial); + iobuf_skip_rest(inp,pktlen,partial); } - static void * read_rest( IOBUF inp, size_t pktlen, int partial ) { @@ -688,7 +691,40 @@ read_rest( IOBUF inp, size_t pktlen, int partial ) return p; } +static int +parse_marker( IOBUF inp, int pkttype, unsigned long pktlen ) +{ + if(pktlen!=3) + goto fail; + if(iobuf_get(inp)!='P') + { + pktlen--; + goto fail; + } + + if(iobuf_get(inp)!='G') + { + pktlen--; + goto fail; + } + + if(iobuf_get(inp)!='P') + { + pktlen--; + goto fail; + } + + if(list_mode) + fputs(":marker packet: PGP\n", listfp ); + + return 0; + + fail: + log_error("invalid marker packet\n"); + iobuf_skip_rest(inp,pktlen,0); + return G10ERR_INVALID_PACKET; +} static int parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )