X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmd2.c;h=62654f84a6c5b60aa68830c9ccbd154f6c1d4794;hb=32d1664e8e930d8fa6a29db4caac4d21623e42c8;hp=cb4c63b2b7d8a86dafff3c6b5514ff4e13cff925;hpb=dcad82d8011a5afaabed8389d523a99c56909af5;p=gnulib.git diff --git a/lib/md2.c b/lib/md2.c index cb4c63b2b..62654f84a 100644 --- a/lib/md2.c +++ b/lib/md2.c @@ -1,7 +1,7 @@ /* Functions to compute MD2 message digest of files or memory blocks. according to the definition of MD2 in RFC 1319 from April 1992. - Copyright (C) 1995,1996,1997,1999,2000,2001,2002,2003,2005,2006,2008 - Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2005, 2006, + 2008, 2009, 2010 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -24,6 +24,7 @@ #include "md2.h" +#include #include #include @@ -33,7 +34,7 @@ # include "unlocked-io.h" #endif -#define BLOCKSIZE 4096 +#define BLOCKSIZE 32768 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif @@ -94,9 +95,12 @@ int md2_stream (FILE *stream, void *resblock) { struct md2_ctx ctx; - char buffer[BLOCKSIZE + 72]; size_t sum; + char *buffer = malloc (BLOCKSIZE + 72); + if (!buffer) + return 1; + /* Initialize the computation context. */ md2_init_ctx (&ctx); @@ -111,30 +115,33 @@ md2_stream (FILE *stream, void *resblock) /* Read block. Take care for partial reads. */ while (1) - { - n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); - - sum += n; - - if (sum == BLOCKSIZE) - break; - - if (n == 0) - { - /* Check for the error flag IFF N == 0, so that we don't - exit the loop after a partial read due to e.g., EAGAIN - or EWOULDBLOCK. */ - if (ferror (stream)) - return 1; - goto process_partial_block; - } - - /* We've read at least one byte, so ignore errors. But always - check for EOF, since feof may be true even though N > 0. - Otherwise, we could end up calling fread after EOF. */ - if (feof (stream)) - goto process_partial_block; - } + { + n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); + + sum += n; + + if (sum == BLOCKSIZE) + break; + + if (n == 0) + { + /* Check for the error flag IFF N == 0, so that we don't + exit the loop after a partial read due to e.g., EAGAIN + or EWOULDBLOCK. */ + if (ferror (stream)) + { + free (buffer); + return 1; + } + goto process_partial_block; + } + + /* We've read at least one byte, so ignore errors. But always + check for EOF, since feof may be true even though N > 0. + Otherwise, we could end up calling fread after EOF. */ + if (feof (stream)) + goto process_partial_block; + } /* Process buffer with BLOCKSIZE bytes. Note that BLOCKSIZE % 64 == 0 @@ -150,6 +157,7 @@ process_partial_block:; /* Construct result in desired memory. */ md2_finish_ctx (&ctx, resblock); + free (buffer); return 0; } @@ -188,11 +196,11 @@ md2_process_bytes (const void *buffer, size_t len, struct md2_ctx *ctx) /* is 16 bytes full? */ if (ctx->curlen == 16) - { - md2_compress (ctx); - md2_update_chksum (ctx); - ctx->curlen = 0; - } + { + md2_compress (ctx); + md2_update_chksum (ctx); + ctx->curlen = 0; + } } } @@ -252,9 +260,9 @@ md2_compress (struct md2_ctx *ctx) for (j = 0; j < 18; j++) { for (k = 0; k < 48; k++) - { - t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]); - } + { + t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]); + } t = (t + (unsigned char) j) & 255; } }