Skip to content

Commit 88674f0

Browse files
petr-vmware-comacmel
authored andcommitted
gobuffer: Do not crash on object without any public symbols
pahole -J .tmp_linux.btf during Linux build process always crashes on my system. Problem is that when gobuffer is initialized via gobuffer__init(), it is in state where 'index' (AKA its size) is set to 1, but 'entries' is NULL. State corrects itself if 'gobuffer__add()' is invoked, as that will allocate buffer (even if added len == 0). But if __add() is never invoked because only anonymous symbols are present, one ends up with gobuffer that crashes gobuffer__copy. Instead of allocating single-byte buffer always I opted for checking if gobuffer entries is NULL before use in copy and compress - gobuffer__init() would need prototype change to report malloc failures, and it seems unnecessary to allocate memory always - even if file does not have any symbols after all. (gdb) bt #0 __memmove_sse2_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:287 #1 0x00007f2f2c1ec2ee in btf_elf__encode (btfe=0x5654e31e2e30, flags=flags@entry=0 '\000') at libbtf.c:750 #2 0x00007f2f2c1e9af0 in btf_encoder__encode () at btf_encoder.c:164 #3 0x00005654e2407599 in main (argc=3, argv=0x7ffcd8783f18) at pahole.c:1344 (gdb) frame 1 #1 0x00007f2f2c1ec2ee in btf_elf__encode (btfe=0x5654e31e2e30, flags=flags@entry=0 '\000') at libbtf.c:750 750 gobuffer__copy(btfe->strings, btf_elf__nohdr_data(btfe) + hdr->str_off); (gdb) print btfe->strings $1 = (struct gobuffer *) 0x5654e31db2c8 (gdb) print *btfe->strings $2 = {entries = 0x0, nr_entries = 0, index = 1, allocated_size = 0} (gdb) print btfe->types $3 = {entries = 0x5654e31e2ef0 "", nr_entries = 1, index = 16, allocated_size = 8192} (gdb) x /16bx btfe->types.entries 0x5654e31e2ef0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x5654e31e2ef8: 0x04 0x00 0x00 0x00 0x20 0x00 0x00 0x00 Signed-off-by: Petr Vandrovec <[email protected]> Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent cb17f94 commit 88674f0

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

gobuffer.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,12 @@ int gobuffer__add(struct gobuffer *gb, const void *s, unsigned int len)
9191

9292
void gobuffer__copy(const struct gobuffer *gb, void *dest)
9393
{
94-
memcpy(dest, gb->entries, gobuffer__size(gb));
94+
if (gb->entries) {
95+
memcpy(dest, gb->entries, gobuffer__size(gb));
96+
} else {
97+
/* gobuffer__size will be 0 or 1. */
98+
memcpy(dest, "", gobuffer__size(gb));
99+
}
95100
}
96101

97102
const void *gobuffer__compress(struct gobuffer *gb, unsigned int *size)
@@ -101,7 +106,7 @@ const void *gobuffer__compress(struct gobuffer *gb, unsigned int *size)
101106
.zfree = Z_NULL,
102107
.opaque = Z_NULL,
103108
.avail_in = gobuffer__size(gb),
104-
.next_in = (Bytef *)gobuffer__entries(gb),
109+
.next_in = (Bytef *)(gobuffer__entries(gb) ? : ""),
105110
};
106111
void *bf = NULL;
107112
unsigned int bf_size = 0;

0 commit comments

Comments
 (0)