1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-05-24 16:43:28 +02:00

Re-indented.

This commit is contained in:
Werner Koch 2009-10-01 09:56:51 +00:00
parent fafe852c33
commit b432da7574

View File

@ -1,6 +1,6 @@
/* plaintext.c - process plaintext packets /* plaintext.c - process plaintext packets
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
* 2006 Free Software Foundation, Inc. * 2006, 2009 Free Software Foundation, Inc.
* *
* This file is part of GnuPG. * This file is part of GnuPG.
* *
@ -40,12 +40,10 @@
#include "i18n.h" #include "i18n.h"
/**************** /* Handle a plaintext packet. If MFX is not NULL, update the MDs
* Handle a plaintext packet. If MFX is not NULL, update the MDs * Note: We should have used the filter stuff here, but we have to add
* Note: we should use the filter stuff here, but we have to add some * some easy mimic to set a read limit, so we calculate only the bytes
* easy mimic to set a read limit, so we calculate only the * from the plaintext. */
* bytes from the plaintext.
*/
int int
handle_plaintext (PKT_plaintext * pt, md_filter_context_t * mfx, handle_plaintext (PKT_plaintext * pt, md_filter_context_t * mfx,
int nooutput, int clearsig) int nooutput, int clearsig)
@ -61,8 +59,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
#endif #endif
/* Let people know what the plaintext info is. This allows the /* Let people know what the plaintext info is. This allows the
receiving program to try and do something different based on receiving program to try and do something different based on the
the format code (say, recode UTF-8 to local). */ format code (say, recode UTF-8 to local). */
if (!nooutput && is_status_enabled ()) if (!nooutput && is_status_enabled ())
{ {
char status[50]; char status[50];
@ -73,7 +71,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
status message. */ status message. */
fflush (stdout); fflush (stdout);
sprintf(status,"%X %lu ",(byte)pt->mode,(ulong)pt->timestamp); snprintf (status, sizeof status,
"%X %lu ", (byte) pt->mode, (ulong) pt->timestamp);
write_status_text_and_buffer (STATUS_PLAINTEXT, write_status_text_and_buffer (STATUS_PLAINTEXT,
status, pt->name, pt->namelen, 0); status, pt->name, pt->namelen, 0);
@ -84,22 +83,26 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
} }
} }
/* create the filename as C string */ /* Create the filename as C string. */
if (nooutput) if (nooutput)
; ;
else if( opt.outfile ) { else if (opt.outfile)
{
fname = xmalloc (strlen (opt.outfile) + 1); fname = xmalloc (strlen (opt.outfile) + 1);
strcpy (fname, opt.outfile); strcpy (fname, opt.outfile);
} }
else if( pt->namelen == 8 && !memcmp( pt->name, "_CONSOLE", 8 ) ) { else if (pt->namelen == 8 && !memcmp (pt->name, "_CONSOLE", 8))
{
log_info (_("data not saved; use option \"--output\" to save it\n")); log_info (_("data not saved; use option \"--output\" to save it\n"));
nooutput = 1; nooutput = 1;
} }
else if( !opt.flags.use_embedded_filename ) { else if (!opt.flags.use_embedded_filename)
{
fname = make_outfile_name (iobuf_get_real_fname (pt->buf)); fname = make_outfile_name (iobuf_get_real_fname (pt->buf));
if (!fname) if (!fname)
fname = ask_outfile_name (pt->name, pt->namelen); fname = ask_outfile_name (pt->name, pt->namelen);
if( !fname ) { if (!fname)
{
rc = gpg_error (GPG_ERR_GENERAL); /* Can't create file. */ rc = gpg_error (GPG_ERR_GENERAL); /* Can't create file. */
goto leave; goto leave;
} }
@ -117,12 +120,16 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
setmode (fileno (fp), O_BINARY); setmode (fileno (fp), O_BINARY);
#endif #endif
} }
else { else
while( !overwrite_filep (fname) ) { {
while (!overwrite_filep (fname))
{
char *tmp = ask_outfile_name (NULL, 0); char *tmp = ask_outfile_name (NULL, 0);
if ( !tmp || !*tmp ) { if (!tmp || !*tmp)
{
xfree (tmp); xfree (tmp);
rc = gpg_error (GPG_ERR_GENERAL); /* G10ERR_CREATE_FILE*/ /* FIXME: Below used to be G10ERR_CREATE_FILE */
rc = gpg_error (GPG_ERR_GENERAL);
goto leave; goto leave;
} }
xfree (fname); xfree (fname);
@ -140,7 +147,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
log_error (_("error creating `%s': %s\n"), fname, strerror (errno)); log_error (_("error creating `%s': %s\n"), fname, strerror (errno));
goto leave; goto leave;
} }
else if( !(fp = fopen(fname,"wb")) ) { else if (!(fp = fopen (fname, "wb")))
{
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error (_("error creating `%s': %s\n"), fname, strerror (errno)); log_error (_("error creating `%s': %s\n"), fname, strerror (errno));
goto leave; goto leave;
@ -156,9 +164,11 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
if (fp || nooutput) if (fp || nooutput)
; ;
else { else
{
fp = fopen (fname, "wb"); fp = fopen (fname, "wb");
if( !fp ) { if (!fp)
{
log_error (_("error creating `%s': %s\n"), fname, strerror (errno)); log_error (_("error creating `%s': %s\n"), fname, strerror (errno));
rc = G10ERR_CREATE_FILE; rc = G10ERR_CREATE_FILE;
if (errno == 106) if (errno == 106)
@ -169,28 +179,31 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
/* If there's a ,xxx extension in the embedded filename, /* If there's a ,xxx extension in the embedded filename,
use that, else check whether the user input (in fname) use that, else check whether the user input (in fname)
has a ,xxx appended, then use that in preference */ has a ,xxx appended, then use that in preference */
if( (c = riscos_get_filetype_from_string( pt->name, if ((c = riscos_get_filetype_from_string (pt->name, pt->namelen)) != -1)
pt->namelen )) != -1 )
filetype = c; filetype = c;
if( (c = riscos_get_filetype_from_string( fname, if ((c = riscos_get_filetype_from_string (fname, strlen (fname))) != -1)
strlen(fname) )) != -1 )
filetype = c; filetype = c;
riscos_set_filetype_by_number (fname, filetype); riscos_set_filetype_by_number (fname, filetype);
} }
#endif /* __riscos__ */ #endif /* __riscos__ */
if( !pt->is_partial ) { if (!pt->is_partial)
{
/* We have an actual length (which might be zero). */ /* We have an actual length (which might be zero). */
if (clearsig) { if (clearsig)
{
log_error ("clearsig encountered while not expected\n"); log_error ("clearsig encountered while not expected\n");
rc = G10ERR_UNEXPECTED; rc = G10ERR_UNEXPECTED;
goto leave; goto leave;
} }
if( convert ) { /* text mode */ if (convert) /* Text mode. */
for( ; pt->len; pt->len-- ) { {
if( (c = iobuf_get(pt->buf)) == -1 ) { for (; pt->len; pt->len--)
{
if ((c = iobuf_get (pt->buf)) == -1)
{
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error ("problem reading source (%u bytes remaining)\n", log_error ("problem reading source (%u bytes remaining)\n",
(unsigned) pt->len); (unsigned) pt->len);
@ -224,12 +237,15 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
} }
} }
} }
else { /* binary mode */ else /* Binary mode. */
{
byte *buffer = xmalloc (32768); byte *buffer = xmalloc (32768);
while( pt->len ) { while (pt->len)
{
int len = pt->len > 32768 ? 32768 : pt->len; int len = pt->len > 32768 ? 32768 : pt->len;
len = iobuf_read (pt->buf, buffer, len); len = iobuf_read (pt->buf, buffer, len);
if( len == -1 ) { if (len == -1)
{
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error ("problem reading source (%u bytes remaining)\n", log_error ("problem reading source (%u bytes remaining)\n",
(unsigned) pt->len); (unsigned) pt->len);
@ -262,9 +278,12 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
xfree (buffer); xfree (buffer);
} }
} }
else if( !clearsig ) { else if (!clearsig)
if( convert ) { /* text mode */ {
while( (c = iobuf_get(pt->buf)) != -1 ) { if (convert)
{ /* text mode */
while ((c = iobuf_get (pt->buf)) != -1)
{
if (mfx->md) if (mfx->md)
gcry_md_putc (mfx->md, c); gcry_md_putc (mfx->md, c);
#ifndef HAVE_DOSISH_SYSTEM #ifndef HAVE_DOSISH_SYSTEM
@ -293,11 +312,13 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
} }
} }
} }
else { /* binary mode */ else
{ /* binary mode */
byte *buffer = xmalloc (32768); byte *buffer = xmalloc (32768);
int eof_seen = 0; int eof_seen = 0;
while ( !eof_seen ) { while (!eof_seen)
{
/* Why do we check for len < 32768: /* Why do we check for len < 32768:
* If we won't, we would practically read 2 EOFs but * If we won't, we would practically read 2 EOFs but
* the first one has already popped the block_filter * the first one has already popped the block_filter
@ -321,7 +342,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
xfree (buffer); xfree (buffer);
goto leave; goto leave;
} }
else if( fwrite( buffer, 1, len, fp ) != len ) { else if (fwrite (buffer, 1, len, fp) != len)
{
rc = (errno ? gpg_error_from_syserror () rc = (errno ? gpg_error_from_syserror ()
: gpg_error (GPG_ERR_INTERNAL)); : gpg_error (GPG_ERR_INTERNAL));
log_error ("error writing to `%s': %s\n", log_error ("error writing to `%s': %s\n",
@ -335,10 +357,12 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
} }
pt->buf = NULL; pt->buf = NULL;
} }
else { /* clear text signature - don't hash the last cr,lf */ else /* Clear text signature - don't hash the last CR,LF. */
{
int state = 0; int state = 0;
while( (c = iobuf_get(pt->buf)) != -1 ) { while ((c = iobuf_get (pt->buf)) != -1)
{
if (fp) if (fp)
{ {
if (opt.max_output && (++count) > opt.max_output) if (opt.max_output && (++count) > opt.max_output)
@ -359,12 +383,14 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
} }
if (!mfx->md) if (!mfx->md)
continue; continue;
if( state == 2 ) { if (state == 2)
{
gcry_md_putc (mfx->md, '\r'); gcry_md_putc (mfx->md, '\r');
gcry_md_putc (mfx->md, '\n'); gcry_md_putc (mfx->md, '\n');
state = 0; state = 0;
} }
if( !state ) { if (!state)
{
if (c == '\r') if (c == '\r')
state = 1; state = 1;
else if (c == '\n') else if (c == '\n')
@ -372,14 +398,17 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
else else
gcry_md_putc (mfx->md, c); gcry_md_putc (mfx->md, c);
} }
else if( state == 1 ) { else if (state == 1)
{
if (c == '\n') if (c == '\n')
state = 2; state = 2;
else { else
{
gcry_md_putc (mfx->md, '\r'); gcry_md_putc (mfx->md, '\r');
if (c == '\r') if (c == '\r')
state = 1; state = 1;
else { else
{
state = 0; state = 0;
gcry_md_putc (mfx->md, c); gcry_md_putc (mfx->md, c);
} }
@ -389,7 +418,8 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
pt->buf = NULL; pt->buf = NULL;
} }
if( fp && fp != stdout && fclose(fp) ) { if (fp && fp != stdout && fclose (fp))
{
rc = (errno ? gpg_error_from_syserror () rc = (errno ? gpg_error_from_syserror ()
: gpg_error (GPG_ERR_INTERNAL)); : gpg_error (GPG_ERR_INTERNAL));
log_error ("error closing `%s': %s\n", fname, strerror (errno)); log_error ("error closing `%s': %s\n", fname, strerror (errno));
@ -399,9 +429,9 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
fp = NULL; fp = NULL;
leave: leave:
/* Make sure that stdout gets flushed after the plaintext has /* Make sure that stdout gets flushed after the plaintext has been
been handled. This is for extra security as we do a handled. This is for extra security as we do a flush anyway
flush anyway before checking the signature. */ before checking the signature. */
fflush (stdout); fflush (stdout);
if (fp && fp != stdout) if (fp && fp != stdout)
@ -410,27 +440,33 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
return rc; return rc;
} }
static void static void
do_hash (gcry_md_hd_t md, gcry_md_hd_t md2, IOBUF fp, int textmode) do_hash (gcry_md_hd_t md, gcry_md_hd_t md2, IOBUF fp, int textmode)
{ {
text_filter_context_t tfx; text_filter_context_t tfx;
int c; int c;
if( textmode ) { if (textmode)
{
memset (&tfx, 0, sizeof tfx); memset (&tfx, 0, sizeof tfx);
iobuf_push_filter (fp, text_filter, &tfx); iobuf_push_filter (fp, text_filter, &tfx);
} }
if( md2 ) { /* work around a strange behaviour in pgp2 */ if (md2)
{ /* work around a strange behaviour in pgp2 */
/* It seems that at least PGP5 converts a single CR to a CR,LF too */ /* It seems that at least PGP5 converts a single CR to a CR,LF too */
int lc = -1; int lc = -1;
while( (c = iobuf_get(fp)) != -1 ) { while ((c = iobuf_get (fp)) != -1)
{
if (c == '\n' && lc == '\r') if (c == '\n' && lc == '\r')
gcry_md_putc (md2, c); gcry_md_putc (md2, c);
else if( c == '\n' ) { else if (c == '\n')
{
gcry_md_putc (md2, '\r'); gcry_md_putc (md2, '\r');
gcry_md_putc (md2, c); gcry_md_putc (md2, c);
} }
else if( c != '\n' && lc == '\r' ) { else if (c != '\n' && lc == '\r')
{
gcry_md_putc (md2, '\n'); gcry_md_putc (md2, '\n');
gcry_md_putc (md2, c); gcry_md_putc (md2, c);
} }
@ -442,8 +478,10 @@ do_hash( gcry_md_hd_t md, gcry_md_hd_t md2, IOBUF fp, int textmode )
lc = c; lc = c;
} }
} }
else { else
while( (c = iobuf_get(fp)) != -1 ) { {
while ((c = iobuf_get (fp)) != -1)
{
if (md) if (md)
gcry_md_putc (md, c); gcry_md_putc (md, c);
} }
@ -467,10 +505,12 @@ ask_for_detached_datafile (gcry_md_hd_t md, gcry_md_hd_t md2,
pfx = new_progress_context (); pfx = new_progress_context ();
fp = open_sigfile (inname, pfx); /* Open default file. */ fp = open_sigfile (inname, pfx); /* Open default file. */
if( !fp && !opt.batch ) { if (!fp && !opt.batch)
{
int any = 0; int any = 0;
tty_printf (_("Detached signature.\n")); tty_printf (_("Detached signature.\n"));
do { do
{
char *name; char *name;
xfree (answer); xfree (answer);
@ -482,7 +522,8 @@ ask_for_detached_datafile (gcry_md_hd_t md, gcry_md_hd_t md2,
answer = make_filename (name, (void *) NULL); answer = make_filename (name, (void *) NULL);
xfree (name); xfree (name);
if( any && !*answer ) { if (any && !*answer)
{
rc = gpg_error (GPG_ERR_GENERAL); /*G10ERR_READ_FILE */ rc = gpg_error (GPG_ERR_GENERAL); /*G10ERR_READ_FILE */
goto leave; goto leave;
} }
@ -493,20 +534,24 @@ ask_for_detached_datafile (gcry_md_hd_t md, gcry_md_hd_t md2,
fp = NULL; fp = NULL;
errno = EPERM; errno = EPERM;
} }
if( !fp && errno == ENOENT ) { if (!fp && errno == ENOENT)
{
tty_printf ("No such file, try again or hit enter to quit.\n"); tty_printf ("No such file, try again or hit enter to quit.\n");
any++; any++;
} }
else if (!fp) else if (!fp)
{ {
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
log_error(_("can't open `%s': %s\n"), answer, strerror(errno)); log_error (_("can't open `%s': %s\n"), answer,
strerror (errno));
goto leave; goto leave;
} }
} while( !fp ); }
while (!fp);
} }
if( !fp ) { if (!fp)
{
if (opt.verbose) if (opt.verbose)
log_info (_("reading stdin ...\n")); log_info (_("reading stdin ...\n"));
fp = iobuf_open (NULL); fp = iobuf_open (NULL);
@ -537,10 +582,12 @@ hash_datafiles( gcry_md_hd_t md, gcry_md_hd_t md2, strlist_t files,
pfx = new_progress_context (); pfx = new_progress_context ();
if( !files ) { if (!files)
{
/* check whether we can open the signed material */ /* check whether we can open the signed material */
fp = open_sigfile (sigfilename, pfx); fp = open_sigfile (sigfilename, pfx);
if( fp ) { if (fp)
{
do_hash (md, md2, fp, textmode); do_hash (md, md2, fp, textmode);
iobuf_close (fp); iobuf_close (fp);
release_progress_context (pfx); release_progress_context (pfx);
@ -552,7 +599,8 @@ hash_datafiles( gcry_md_hd_t md, gcry_md_hd_t md2, strlist_t files,
} }
for (sl=files; sl; sl = sl->next ) { for (sl = files; sl; sl = sl->next)
{
fp = iobuf_open (sl->d); fp = iobuf_open (sl->d);
if (fp && is_secured_file (iobuf_get_fd (fp))) if (fp && is_secured_file (iobuf_get_fd (fp)))
{ {
@ -560,7 +608,8 @@ hash_datafiles( gcry_md_hd_t md, gcry_md_hd_t md2, strlist_t files,
fp = NULL; fp = NULL;
errno = EPERM; errno = EPERM;
} }
if( !fp ) { if (!fp)
{
int rc = gpg_error_from_syserror (); int rc = gpg_error_from_syserror ();
log_error (_("can't open signed data `%s'\n"), log_error (_("can't open signed data `%s'\n"),
print_fname_stdin (sl->d)); print_fname_stdin (sl->d));