Fix: print format type mismatch
[lttng-tools.git] / src / bin / lttng-sessiond / syscall.c
index 95d30d07459dc98d12dfb2ca680f1773cdac7c52..1fc68d2ca5d73319ebddb7f395106b2fc083ad57 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <common/bitfield.h>
 #include <common/common.h>
 #include <common/kernel-ctl/kernel-ctl.h>
@@ -35,7 +36,7 @@ static size_t syscall_table_nb_entry;
  * Populate the system call table using the kernel tracer.
  *
  * Return 0 on success and the syscall table is allocated. On error, a negative
- * value is returned and the syscall table is set to NULL.
+ * value is returned.
  */
 int syscall_init_table(void)
 {
@@ -72,7 +73,7 @@ int syscall_init_table(void)
        }
 
        while (fscanf(fp,
-                               "syscall { index = %lu; \
+                               "syscall { index = %zu; \
                                name = %" XSTR(SYSCALL_NAME_LEN) "[^;]; \
                                bitness = %u; };\n",
                                &index, name, &bitness) == 3) {
@@ -81,7 +82,15 @@ int syscall_init_table(void)
                        size_t new_nbmem;
 
                        /* Double memory size. */
-                       new_nbmem = index << 1;
+                       new_nbmem = max(index, nbmem << 1);
+                       if (new_nbmem < nbmem) {
+                               /* Overflow, stop everything, something went really wrong. */
+                               ERR("Syscall listing memory size overflow. Stopping");
+                               free(syscall_table);
+                               syscall_table = NULL;
+                               ret = -EINVAL;
+                               goto error;
+                       }
 
                        DBG("Reallocating syscall table from %zu to %zu entries", nbmem,
                                        new_nbmem);
@@ -396,11 +405,15 @@ ssize_t syscall_list_channel(struct ltt_kernel_channel *kchan,
                        events = new_events;
                }
 
+               rcu_read_lock();
                ksyscall = lookup_syscall(syscalls_ht, syscall_table[i].name);
                if (ksyscall) {
                        update_event_syscall_bitness(events, i, ksyscall->index);
+                       rcu_read_unlock();
                        continue;
                }
+               ksyscall = NULL;
+               rcu_read_unlock();
 
                ret = add_syscall_to_ht(syscalls_ht, i, count);
                if (ret < 0) {
@@ -420,7 +433,10 @@ ssize_t syscall_list_channel(struct ltt_kernel_channel *kchan,
        return count;
 
 error:
+       rcu_read_lock();
        destroy_syscall_ht(syscalls_ht);
+       rcu_read_unlock();
+
        free(events);
        return ret;
 }
This page took 0.026002 seconds and 4 git commands to generate.