summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-04-16 16:56:36 (GMT)
committer Denys Vlasenko <vda.linux@googlemail.com>2011-04-16 16:56:36 (GMT)
commit43a3d50e14902e746ee53b7cfb63fe190bd5387f (patch)
treea1656b41461ea7a7a0544fd67a34d8c3fb668322
parent88a838438819f7a5224a2ab3ea99219f9a666bf4 (diff)
downloadbusybox-43a3d50e14902e746ee53b7cfb63fe190bd5387f.tar.gz
busybox-43a3d50e14902e746ee53b7cfb63fe190bd5387f.tar.bz2
md5/sha1sum: better fix for small resource leak
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--coreutils/md5_sha1_sum.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/coreutils/md5_sha1_sum.c b/coreutils/md5_sha1_sum.c
index 8270d97..050d467 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);
}