fscanf on an empty file returns directly without assigning value to 'index' leading to assigning the value of an uninitialized variable to syscall_table_nb_entry. This can result in memory allocation problems when listing syscalls on 'lttng list --kernel --syscall'[1][2].
Fixes #1091 [1] https://bugs.lttng.org/issues/1091 [2] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1671063/ Signed-off-by: Jonathan Rajotte <[email protected]> --- src/bin/lttng-sessiond/syscall.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/bin/lttng-sessiond/syscall.c b/src/bin/lttng-sessiond/syscall.c index 6ee38bd..c21e4d8 100644 --- a/src/bin/lttng-sessiond/syscall.c +++ b/src/bin/lttng-sessiond/syscall.c @@ -16,6 +16,8 @@ */ #define _LGPL_SOURCE +#include <stdbool.h> + #include <common/bitfield.h> #include <common/common.h> #include <common/kernel-ctl/kernel-ctl.h> @@ -43,7 +45,8 @@ int syscall_init_table(void) size_t nbmem; FILE *fp; /* Syscall data from the kernel. */ - size_t index; + size_t index = 0; + bool at_least_one_syscall = false; uint32_t bitness; char name[SYSCALL_NAME_LEN]; @@ -76,7 +79,8 @@ int syscall_init_table(void) name = %" XSTR(SYSCALL_NAME_LEN) "[^;]; \ bitness = %u; };\n", &index, name, &bitness) == 3) { - if (index >= nbmem ) { + at_least_one_syscall = true; + if (index >= nbmem) { struct syscall *new_list; size_t new_nbmem; @@ -123,7 +127,10 @@ int syscall_init_table(void) */ } - syscall_table_nb_entry = index; + /* Index start at 0. */ + if (at_least_one_syscall) { + syscall_table_nb_entry = index + 1; + } ret = 0; -- 2.7.4 _______________________________________________ lttng-dev mailing list [email protected] https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
