Add elf_can_read_next
diff --git a/ltrace-elf.c b/ltrace-elf.c
index b045d64..78b1245 100644
--- a/ltrace-elf.c
+++ b/ltrace-elf.c
@@ -204,23 +204,23 @@
&name_p, &data);
}
-static int
-need_data(Elf_Data *data, GElf_Xword offset, GElf_Xword size)
+int
+elf_can_read_next(Elf_Data *data, GElf_Xword offset, GElf_Xword size)
{
assert(data != NULL);
if (data->d_size < size || offset > data->d_size - size) {
debug(1, "Not enough data to read %"PRId64"-byte value"
" at offset %"PRId64".", size, offset);
- return -1;
+ return 0;
}
- return 0;
+ return 1;
}
#define DEF_READER(NAME, SIZE) \
int \
NAME(Elf_Data *data, GElf_Xword offset, uint##SIZE##_t *retp) \
{ \
- if (need_data(data, offset, SIZE / 8) < 0) \
+ if (!elf_can_read_next(data, offset, SIZE / 8)) \
return -1; \
\
if (data->d_buf == NULL) /* NODATA section */ { \
diff --git a/ltrace-elf.h b/ltrace-elf.h
index af97b0a..178258b 100644
--- a/ltrace-elf.h
+++ b/ltrace-elf.h
@@ -128,6 +128,9 @@
int elf_read_next_u64(Elf_Data *data, GElf_Xword *offset, uint64_t *retp);
int elf_read_next_uleb128(Elf_Data *data, GElf_Xword *offset, uint64_t *retp);
+/* Return whether there's AMOUNT more bytes after OFFSET in DATA. */
+int elf_can_read_next(Elf_Data *data, GElf_Xword offset, GElf_Xword amount);
+
#if __WORDSIZE == 32
#define PRI_ELF_ADDR PRIx32
#define GELF_ADDR_CAST(x) (void *)(uint32_t)(x)