Fix: lttng: truncated addresses and offsets on 32-bit builds
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 23 Feb 2022 22:40:06 +0000 (17:40 -0500)
committerJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Fri, 25 Feb 2022 15:35:09 +0000 (10:35 -0500)
The lttng client parses hexadecimal addresses using, at some point,
strtoul(). Using this function effectively caps addresses and
offsets to MAX_UINT32 resulting in failures to enable kprobes
against a 64-bit kernel using a 32-bit client.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: If619e9e84413de5cd32d8c06f363152caaf5ac46

src/bin/lttng/commands/add_trigger.c
src/bin/lttng/commands/enable_events.c

index 4395c182b42db5f528dda42f65de46e48984304d..c1926b4d61d7bd7a145fd5a3c678c627abe35032 100644 (file)
@@ -355,7 +355,7 @@ static int parse_kernel_probe_opts(const char *source,
                        PERROR("Failed to copy kernel probe location symbol name.");
                        goto error;
                }
-               offset = strtoul(s_hex, NULL, 0);
+               offset = strtoull(s_hex, NULL, 0);
 
                *location = lttng_kernel_probe_location_symbol_create(
                                symbol_name, offset);
@@ -401,7 +401,7 @@ static int parse_kernel_probe_opts(const char *source,
                        goto error;
                }
 
-               address = strtoul(s_hex, NULL, 0);
+               address = strtoull(s_hex, NULL, 0);
                *location = lttng_kernel_probe_location_address_create(address);
                if (!*location) {
                        ERR("Failed to create symbol kernel probe location.");
index 388c5ac3627028a1c247fd1fd402513f29075054..30d28cb265b566ede70145f7760fa2c67276e6e4 100644 (file)
@@ -130,7 +130,7 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt)
                        ret = CMD_ERROR;
                        goto end;
                }
-               ev->attr.probe.offset = strtoul(s_hex, NULL, 0);
+               ev->attr.probe.offset = strtoull(s_hex, NULL, 0);
                DBG("probe offset %" PRIu64, ev->attr.probe.offset);
                ev->attr.probe.addr = 0;
                goto end;
@@ -164,7 +164,7 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt)
                        ret = CMD_ERROR;
                        goto end;
                }
-               ev->attr.probe.addr = strtoul(s_hex, NULL, 0);
+               ev->attr.probe.addr = strtoull(s_hex, NULL, 0);
                DBG("probe addr %" PRIu64, ev->attr.probe.addr);
                ev->attr.probe.offset = 0;
                memset(ev->attr.probe.symbol_name, 0, LTTNG_SYMBOL_NAME_LEN);
This page took 0.029383 seconds and 4 git commands to generate.