diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-04-16 18:56:36 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-04-16 18:56:36 +0200 |
commit | 43a3d50e14902e746ee53b7cfb63fe190bd5387f (patch) | |
tree | a1656b41461ea7a7a0544fd67a34d8c3fb668322 /coreutils | |
parent | 88a838438819f7a5224a2ab3ea99219f9a666bf4 (diff) | |
download | busybox-43a3d50e14902e746ee53b7cfb63fe190bd5387f.tar.gz |
md5/sha1sum: better fix for small resource leak
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/md5_sha1_sum.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/coreutils/md5_sha1_sum.c b/coreutils/md5_sha1_sum.c index 8270d97e2..050d46701 100644 --- a/coreutils/md5_sha1_sum.c +++ b/coreutils/md5_sha1_sum.c @@ -100,22 +100,18 @@ static uint8_t *hash_file(const char *filename) md5_ctx_t md5; } context; uint8_t *hash_value = NULL; - RESERVE_CONFIG_UBUFFER(in_buf, 4096); void FAST_FUNC (*update)(void*, const void*, size_t); void FAST_FUNC (*final)(void*, void*); char hash_algo; src_fd = open_or_warn_stdin(filename); if (src_fd < 0) { - if (ENABLE_FEATURE_CLEAN_UP) { - RELEASE_CONFIG_BUFFER(in_buf); - } return NULL; } hash_algo = applet_name[3]; - /* figure specific hash algorithims */ + /* figure specific hash algorithms */ if (ENABLE_MD5SUM && hash_algo == HASH_MD5) { md5_begin(&context.md5); update = (void*)md5_hash; @@ -140,17 +136,18 @@ static uint8_t *hash_file(const char *filename) xfunc_die(); /* can't reach this */ } - while ((count = safe_read(src_fd, in_buf, 4096)) > 0) { - update(&context, in_buf, count); - } - - if (count == 0) { - final(&context, in_buf); - hash_value = hash_bin_to_hex(in_buf, hash_len); + { + RESERVE_CONFIG_UBUFFER(in_buf, 4096); + while ((count = safe_read(src_fd, in_buf, 4096)) > 0) { + update(&context, in_buf, count); + } + if (count == 0) { + final(&context, in_buf); + hash_value = hash_bin_to_hex(in_buf, hash_len); + } + RELEASE_CONFIG_BUFFER(in_buf); } - RELEASE_CONFIG_BUFFER(in_buf); - if (src_fd != STDIN_FILENO) { close(src_fd); } |