X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmd5.c;h=8114795d739ef5726622e8a1fbf6f787d78ff3f7;hb=bcde2e612f91be65bfe986c92b2e3c7aca50db0f;hp=61ae19da355c85fe703f07fd66243545764cd5db;hpb=1156115d4ed429628f292ef9a0d597ffc3dac31e;p=gnulib.git diff --git a/lib/md5.c b/lib/md5.c index 61ae19da3..8114795d7 100644 --- a/lib/md5.c +++ b/lib/md5.c @@ -24,6 +24,15 @@ #include +#if STDC_HEADERS +# include +# include +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + #include "md5.h" #ifdef WORDS_BIGENDIAN @@ -69,7 +78,7 @@ md5_read_ctx (ctx, resbuf) /* Compute MD5 message digest for bytes read from STREAM. The resulting message digest number will be written into the 16 bytes beginning at RESBLOCK. */ -void * +int md5_stream (stream, resblock) FILE *stream; void *resblock; @@ -104,6 +113,8 @@ md5_stream (stream, resblock) sum += n; } while (sum < BLOCKSIZE && n != 0); + if (n == 0 && ferror (stream)) + return 1; /* RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the number of bytes. Do a double word @@ -135,13 +146,15 @@ md5_stream (stream, resblock) /* Put the 64-bit file length in *bits* at the end of the buffer. */ *(md5_uint32 *) &buffer[sum + pad] = SWAP (len[0] << 3); - *(md5_uint32 *) &buffer[sum + pad + 4] = SWAP ((len[1] << 3) | (len[0] >> 29)); + *(md5_uint32 *) &buffer[sum + pad + 4] = SWAP ((len[1] << 3) + | (len[0] >> 29)); /* Process last bytes. */ md5_process_block (buffer, sum + pad + 8, &ctx); /* Construct result in desired memory. */ - return md5_read_ctx (&ctx, resblock); + md5_read_ctx (&ctx, resblock); + return 0; } /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The @@ -178,8 +191,8 @@ md5_buffer (buffer, len, resblock) pad = rest >= 56 ? 64 + 56 - rest : 56 - rest; /* Put length of buffer in *bits* in last eight bytes. */ - *(md5_uint32 *) &restbuf[rest + pad] = SWAP (len << 3); - *(md5_uint32 *) &restbuf[rest + pad + 4] = SWAP (len >> 29); + *(md5_uint32 *) &restbuf[rest + pad] = (md5_uint32) SWAP (len << 3); + *(md5_uint32 *) &restbuf[rest + pad + 4] = (md5_uint32) SWAP (len >> 29); /* Process last bytes. */ md5_process_block (restbuf, rest + pad + 8, &ctx);