Dont over-read fd, use function pointer for hash function.

This commit is contained in:
Glenn L McGrath 2003-11-20 21:30:58 +00:00
parent e857122c97
commit 78cd84da8a
2 changed files with 43 additions and 29 deletions

View File

@ -479,7 +479,7 @@ extern void xregcomp(regex_t *preg, const char *regex, int cflags);
#define HASH_SHA1 1
#define HASH_MD5 2
extern int hash_fd(int fd, const off_t size, const uint8_t hash_algo, uint8_t *hashval);
extern int hash_fd(int fd, const size_t size, const uint8_t hash_algo, uint8_t *hashval);
#endif /* __LIBCONFIG_H__ */

View File

@ -166,10 +166,11 @@ static void sha1_begin(sha1_ctx_t *ctx)
/* SHA1 hash data in an array of bytes into hash buffer and call the */
/* hash_compile function as required. */
static void sha1_hash(const unsigned char data[], unsigned int len, sha1_ctx_t *ctx)
static void sha1_hash(const void *data, size_t len, void *ctx_v)
{
uint32_t pos = (uint32_t) (ctx->count[0] & SHA1_MASK),
freeb = SHA1_BLOCK_SIZE - pos;
sha1_ctx_t *ctx = (sha1_ctx_t *) ctx_v;
uint32_t pos = (uint32_t) (ctx->count[0] & SHA1_MASK);
uint32_t freeb = SHA1_BLOCK_SIZE - pos;
const unsigned char *sp = data;
if ((ctx->count[0] += len) < len)
@ -706,6 +707,15 @@ static void md5_hash_bytes(const void *buffer, size_t len, md5_ctx_t *ctx)
}
}
static void md5_hash(const void *buffer, size_t length, void *md5_ctx)
{
if (length % 64 == 0) {
md5_hash_block(buffer, length, md5_ctx);
} else {
md5_hash_bytes(buffer, length, md5_ctx);
}
}
/* Process the remaining bytes in the buffer and put result from CTX
* in first 16 bytes following RESBUF. The result is always in little
* endian byte order, so that a byte-wise output yields to the wanted
@ -760,13 +770,17 @@ static void *md5_end(void *resbuf, md5_ctx_t *ctx)
extern int hash_fd(int src_fd, const off_t size, const uint8_t hash_algo,
extern int hash_fd(int src_fd, const size_t size, const uint8_t hash_algo,
uint8_t * hashval)
{
int result = EXIT_SUCCESS;
off_t hashed_count = 0;
unsigned int blocksize = 0;
// size_t hashed_count = 0;
size_t blocksize = 0;
size_t remaining = size;
unsigned char *buffer = NULL;
void (*hash_fn_ptr)(const void *, size_t, void *) = NULL;
void *cx = NULL;
#ifdef CONFIG_SHA1SUM
sha1_ctx_t sha1_cx;
#endif
@ -779,13 +793,17 @@ extern int hash_fd(int src_fd, const off_t size, const uint8_t hash_algo,
if (hash_algo == HASH_SHA1) {
/* Ensure that BLOCKSIZE is a multiple of 64. */
blocksize = 65536;
buffer = malloc(blocksize);
buffer = xmalloc(blocksize);
hash_fn_ptr = sha1_hash;
cx = &sha1_cx;
}
#endif
#ifdef CONFIG_MD5SUM
if (hash_algo == HASH_MD5) {
blocksize = 4096;
buffer = malloc(blocksize + 72);
buffer = xmalloc(blocksize + 72);
hash_fn_ptr = md5_hash;
cx = &md5_cx;
}
#endif
@ -801,33 +819,29 @@ extern int hash_fd(int src_fd, const off_t size, const uint8_t hash_algo,
}
#endif
/* Iterate over full file contents. */
do {
const ssize_t count = bb_full_read(src_fd, buffer, blocksize);
while ((remaining == (size_t) -1) || (remaining > 0)) {
size_t read_try;
ssize_t read_got;
if (count < 1) {
if (remaining > blocksize) {
read_try = blocksize;
} else {
read_try = remaining;
}
read_got = bb_full_read(src_fd, buffer, read_try);
if (read_got < 1) {
/* count == 0 means short read
* count == -1 means read error */
result = count - 1;
result = read_got - 1;
break;
}
hashed_count += count;
if (remaining != (size_t) -1) {
remaining -= read_got;
}
/* Process buffer */
#ifdef CONFIG_SHA1SUM
if (hash_algo == HASH_SHA1) {
sha1_hash(buffer, count, &sha1_cx);
}
#endif
#ifdef CONFIG_MD5SUM
if (hash_algo == HASH_MD5) {
if (count % 64 == 0) {
md5_hash_block(buffer, count, &md5_cx);
} else {
md5_hash_bytes(buffer, count, &md5_cx);
}
}
#endif
} while ((size == (off_t) - 1) || (hashed_count < size));
hash_fn_ptr(buffer, read_got, cx);
}
/* Finalize and write the hash into our buffer. */
#ifdef CONFIG_SHA1SUM