summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-05-08 12:43:47 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-05-08 12:43:47 +0200
commit6937908478c7ffd19b255e0dc0d5c2e43fa0ec54 (patch)
tree713c1c06725aa8d3b88f14ed25eb6b4f09e382e7
parentc13c8a51c2dba941191c0ef3060a3dfffdfa47c2 (diff)
downloadc-files-6937908478c7ffd19b255e0dc0d5c2e43fa0ec54.tar.gz
find-bytes: fix case where key_len > 0
-rw-r--r--find-bytes.c43
1 files 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);