From 654ba16db55cdab42c4c1f381a967e006dfe10cd Mon Sep 17 00:00:00 2001 From: David Shaw Date: Wed, 28 Jan 2004 01:04:30 +0000 Subject: [PATCH] * getkey.c: Set MAX_PK_CACHE_ENTRIES and MAX_UID_CACHE_ENTRIES to PK_UID_CACHE_SIZE (set in ./configure). * getkey.c (get_pubkey): When reading key data into the cache, properly handle keys that are partially (pk, no UIDs) cached already. This is Debian bug #176425 and #229549. * compress.c (init_compress, push_compress_filter2): Do the right thing (i.e. nothing) with compress algo 0. * main.h, decrypt.c (decrypt_messages): Accept filenames to decrypt on stdin. This is bug #253. --- g10/ChangeLog | 15 +++++++++++++ g10/compress.c | 4 ++-- g10/decrypt.c | 58 +++++++++++++++++++++++++++++++++++++++----------- g10/getkey.c | 26 ++++++++++++---------- g10/main.h | 2 +- 5 files changed, 79 insertions(+), 26 deletions(-) diff --git a/g10/ChangeLog b/g10/ChangeLog index d1577516e..3e1de617e 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,18 @@ +2004-01-27 David Shaw + + * getkey.c: Set MAX_PK_CACHE_ENTRIES and MAX_UID_CACHE_ENTRIES to + PK_UID_CACHE_SIZE (set in ./configure). + + * getkey.c (get_pubkey): When reading key data into the cache, + properly handle keys that are partially (pk, no UIDs) cached + already. This is Debian bug #176425 and #229549. + + * compress.c (init_compress, push_compress_filter2): Do the right + thing (i.e. nothing) with compress algo 0. + + * main.h, decrypt.c (decrypt_messages): Accept filenames to + decrypt on stdin. This is bug #253. + 2004-01-23 David Shaw * mainproc.c (list_node): Show sigs with --verbose. diff --git a/g10/compress.c b/g10/compress.c index 88eacf8de..cb5b9e52e 100644 --- a/g10/compress.c +++ b/g10/compress.c @@ -60,7 +60,7 @@ init_compress( compress_filter_context_t *zfx, z_stream *zs ) zlib_initialized = riscos_load_module("ZLib", zlib_path, 1); #endif - if( opt.compress_level >= 0 && opt.compress_level <= 9 ) + if( opt.compress_level >= 1 && opt.compress_level <= 9 ) level = opt.compress_level; else if( opt.compress_level == -1 ) level = Z_DEFAULT_COMPRESSION; @@ -337,7 +337,7 @@ void push_compress_filter2(IOBUF out,compress_filter_context_t *zfx, int algo,int rel) { - if(algo>0) + if(algo>=0) zfx->algo=algo; else zfx->algo=DEFAULT_COMPRESS_ALGO; diff --git a/g10/decrypt.c b/g10/decrypt.c index df778d1ad..028815eec 100644 --- a/g10/decrypt.c +++ b/g10/decrypt.c @@ -1,5 +1,6 @@ /* decrypt.c - verify signed data - * Copyright (C) 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 + * 2004 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -83,13 +84,14 @@ decrypt_message( const char *filename ) } void -decrypt_messages(int nfiles, char **files) +decrypt_messages(int nfiles, char *files[]) { IOBUF fp; armor_filter_context_t afx; progress_filter_context_t pfx; char *p, *output = NULL; - int rc = 0; + int rc=0,use_stdin=0; + unsigned int lno=0; if (opt.outfile) { @@ -98,20 +100,53 @@ decrypt_messages(int nfiles, char **files) } - while (nfiles--) + if(!nfiles) + use_stdin=1; + + for(;;) { - print_file_status(STATUS_FILE_START, *files, 3); - output = make_outfile_name(*files); + char line[2048]; + char *filename=NULL; + + if(use_stdin) + { + if(fgets(line, DIM(line), stdin)) + { + lno++; + if (!*line || line[strlen(line)-1] != '\n') + log_error("input line %u too long or missing LF\n", lno); + else + { + line[strlen(line)-1] = '\0'; + filename=line; + } + } + } + else + { + if(nfiles) + { + filename=*files; + nfiles--; + files++; + } + } + + if(filename==NULL) + break; + + print_file_status(STATUS_FILE_START, filename, 3); + output = make_outfile_name(filename); if (!output) goto next_file; - fp = iobuf_open(*files); + fp = iobuf_open(filename); if (!fp) { - log_error(_("can't open `%s'\n"), print_fname_stdin(*files)); + log_error(_("can't open `%s'\n"), print_fname_stdin(filename)); goto next_file; } - handle_progress (&pfx, fp, *files); + handle_progress (&pfx, fp, filename); if (!opt.no_armor) { @@ -124,7 +159,7 @@ decrypt_messages(int nfiles, char **files) rc = proc_packets(NULL, fp); iobuf_close(fp); if (rc) - log_error("%s: decryption failed: %s\n", print_fname_stdin(*files), + log_error("%s: decryption failed: %s\n", print_fname_stdin(filename), g10_errstr(rc)); p = get_last_passphrase(); set_next_passphrase(p); @@ -134,8 +169,7 @@ decrypt_messages(int nfiles, char **files) /* Note that we emit file_done even after an error. */ write_status( STATUS_FILE_DONE ); m_free(output); - files++; } + set_next_passphrase(NULL); } - diff --git a/g10/getkey.c b/g10/getkey.c index e5c311832..3f0997e2d 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -35,14 +35,13 @@ #include "trustdb.h" #include "i18n.h" -#define MAX_PK_CACHE_ENTRIES 200 -#define MAX_UID_CACHE_ENTRIES 200 +#define MAX_PK_CACHE_ENTRIES PK_UID_CACHE_SIZE +#define MAX_UID_CACHE_ENTRIES PK_UID_CACHE_SIZE #if MAX_PK_CACHE_ENTRIES < 2 #error We need the cache for key creation #endif - struct getkey_ctx_s { int exact; KBNODE keyblock; @@ -320,16 +319,21 @@ get_pubkey( PKT_public_key *pk, u32 *keyid ) int rc = 0; #if MAX_PK_CACHE_ENTRIES - { /* Try to get it from the cache */ + if(pk) + { + /* Try to get it from the cache. We don't do this when pk is + NULL as it does not guarantee that the user IDs are + cached. */ pk_cache_entry_t ce; - for( ce = pk_cache; ce; ce = ce->next ) { - if( ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1] ) { - if( pk ) - copy_public_key( pk, ce->pk ); + for( ce = pk_cache; ce; ce = ce->next ) + { + if( ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1] ) + { + copy_public_key( pk, ce->pk ); return 0; - } - } - } + } + } + } #endif /* more init stuff */ if( !pk ) { diff --git a/g10/main.h b/g10/main.h index da627ba32..ebf57e6e4 100644 --- a/g10/main.h +++ b/g10/main.h @@ -232,7 +232,7 @@ int verify_files( int nfiles, char **files ); /*-- decrypt.c --*/ int decrypt_message( const char *filename ); -void decrypt_messages(int nfiles, char **files); +void decrypt_messages(int nfiles, char *files[]); /*-- plaintext.c --*/ int hash_datafiles( MD_HANDLE md, MD_HANDLE md2,