Dont over-read fd, use function pointer for hash function.
This commit is contained in:
parent
e857122c97
commit
78cd84da8a
@ -479,7 +479,7 @@ extern void xregcomp(regex_t *preg, const char *regex, int cflags);
|
|||||||
|
|
||||||
#define HASH_SHA1 1
|
#define HASH_SHA1 1
|
||||||
#define HASH_MD5 2
|
#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__ */
|
#endif /* __LIBCONFIG_H__ */
|
||||||
|
@ -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 */
|
/* SHA1 hash data in an array of bytes into hash buffer and call the */
|
||||||
/* hash_compile function as required. */
|
/* 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),
|
sha1_ctx_t *ctx = (sha1_ctx_t *) ctx_v;
|
||||||
freeb = SHA1_BLOCK_SIZE - pos;
|
uint32_t pos = (uint32_t) (ctx->count[0] & SHA1_MASK);
|
||||||
|
uint32_t freeb = SHA1_BLOCK_SIZE - pos;
|
||||||
const unsigned char *sp = data;
|
const unsigned char *sp = data;
|
||||||
|
|
||||||
if ((ctx->count[0] += len) < len)
|
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
|
/* Process the remaining bytes in the buffer and put result from CTX
|
||||||
* in first 16 bytes following RESBUF. The result is always in little
|
* 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
|
* 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)
|
uint8_t * hashval)
|
||||||
{
|
{
|
||||||
int result = EXIT_SUCCESS;
|
int result = EXIT_SUCCESS;
|
||||||
off_t hashed_count = 0;
|
// size_t hashed_count = 0;
|
||||||
unsigned int blocksize = 0;
|
size_t blocksize = 0;
|
||||||
|
size_t remaining = size;
|
||||||
unsigned char *buffer = NULL;
|
unsigned char *buffer = NULL;
|
||||||
|
void (*hash_fn_ptr)(const void *, size_t, void *) = NULL;
|
||||||
|
void *cx = NULL;
|
||||||
|
|
||||||
#ifdef CONFIG_SHA1SUM
|
#ifdef CONFIG_SHA1SUM
|
||||||
sha1_ctx_t sha1_cx;
|
sha1_ctx_t sha1_cx;
|
||||||
#endif
|
#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) {
|
if (hash_algo == HASH_SHA1) {
|
||||||
/* Ensure that BLOCKSIZE is a multiple of 64. */
|
/* Ensure that BLOCKSIZE is a multiple of 64. */
|
||||||
blocksize = 65536;
|
blocksize = 65536;
|
||||||
buffer = malloc(blocksize);
|
buffer = xmalloc(blocksize);
|
||||||
|
hash_fn_ptr = sha1_hash;
|
||||||
|
cx = &sha1_cx;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_MD5SUM
|
#ifdef CONFIG_MD5SUM
|
||||||
if (hash_algo == HASH_MD5) {
|
if (hash_algo == HASH_MD5) {
|
||||||
blocksize = 4096;
|
blocksize = 4096;
|
||||||
buffer = malloc(blocksize + 72);
|
buffer = xmalloc(blocksize + 72);
|
||||||
|
hash_fn_ptr = md5_hash;
|
||||||
|
cx = &md5_cx;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -801,33 +819,29 @@ extern int hash_fd(int src_fd, const off_t size, const uint8_t hash_algo,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Iterate over full file contents. */
|
/* Iterate over full file contents. */
|
||||||
do {
|
while ((remaining == (size_t) -1) || (remaining > 0)) {
|
||||||
const ssize_t count = bb_full_read(src_fd, buffer, blocksize);
|
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 == 0 means short read
|
||||||
* count == -1 means read error */
|
* count == -1 means read error */
|
||||||
result = count - 1;
|
result = read_got - 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
hashed_count += count;
|
if (remaining != (size_t) -1) {
|
||||||
|
remaining -= read_got;
|
||||||
|
}
|
||||||
|
|
||||||
/* Process buffer */
|
/* Process buffer */
|
||||||
#ifdef CONFIG_SHA1SUM
|
hash_fn_ptr(buffer, read_got, cx);
|
||||||
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));
|
|
||||||
|
|
||||||
/* Finalize and write the hash into our buffer. */
|
/* Finalize and write the hash into our buffer. */
|
||||||
#ifdef CONFIG_SHA1SUM
|
#ifdef CONFIG_SHA1SUM
|
||||||
|
Loading…
x
Reference in New Issue
Block a user