From 6937908478c7ffd19b255e0dc0d5c2e43fa0ec54 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Thu, 8 May 2014 12:43:47 +0200 Subject: find-bytes: fix case where key_len > 0 --- find-bytes.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/find-bytes.c b/find-bytes.c index b81aebc..6e5af9c 100644 --- a/find-bytes.c +++ b/find-bytes.c @@ -52,36 +52,43 @@ void find_key(FILE *fp, char *key, size_t key_len) { perror("malloc"); abort(); } - size_t fill_size = buf_size; - if (key_len > 1) fill_size -= key_len - 1; + size_t fill_size = buf_size - key_len + 1; size_t position = 0; size_t new_bytes; int as_hex = !!getenv("HEX"); + /*----------------+------------------------------* + * prev data size | new data * + * key_len - 1 | size is max fill_size * + *----------------+------------------------------*/ + char *new_data_p = buf + key_len - 1; + /* initially, data is valid starting at the point where it gets filled */ + char *buf_start = new_data_p; do { - /*----------------+------------------------------* - * prev data size | new data * - * key_len - 1 | size is max fill_size * - *----------------+------------------------------*/ - new_bytes = read(fd, buf + key_len - 1, fill_size); - /* initially, the beginning is uninitialized */ - char *new_data_p = buf; - char *end_p = buf + new_bytes; - if (position) { - end_p += key_len; - } else { - new_data_p += key_len - 1; + new_bytes = read(fd, new_data_p, fill_size); + if ((ssize_t) new_bytes == -1) { + perror("read"); + break; } - char *next_p = new_data_p; + + char *next_p = buf_start; + char *end_p = new_data_p + new_bytes; while (next_p && end_p >= next_p + key_len) { next_p = memmem(next_p, end_p - next_p, key, key_len); if (next_p) { - size_t offset = (next_p - new_data_p) + position; + size_t offset = (next_p - buf_start) + position; printf(as_hex ? "%zx\n" : "%zi\n", offset); next_p += key_len; } } - /* copy trailing buffer chars to the beginning */ - if (key_len > 1) memcpy(buf, buf + fill_size, key_len - 1); + /* copy trailing buffer chars to the beginning, just before new data */ + if (key_len > 1) { + size_t keep_size = key_len - 1; + if (keep_size > new_bytes) { + keep_size = new_bytes; + } + buf_start = new_data_p - keep_size; + memmove(buf_start, end_p - keep_size, keep_size); + } position += new_bytes; } while (new_bytes == fill_size); free(buf); -- cgit v1.2.1