From e8f07c636c9943a0e2a48113bb8135a6c4f5ebd7 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Fri, 22 Apr 2011 10:56:59 -0400 Subject: [PATCH 1/1] Fix segfault for ltt-sessiond pathname The getenv sessiond path could return NULL so the strdup failed at this point. Also added the "not running" indication when listing pids that are not found in /proc. Signed-off-by: David Goulet --- lttng/lttng.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lttng/lttng.c b/lttng/lttng.c index f4fab034f..c7ff4edde 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -122,22 +122,24 @@ error: */ static int process_opt_list_apps(void) { - int i, ret; + int i, ret, count; pid_t *pids; FILE *fp; char path[24]; /* Can't go bigger than /proc/65535/cmdline */ char cmdline[PATH_MAX]; - ret = lttng_ust_list_apps(&pids); - if (ret < 0) { + count = lttng_ust_list_apps(&pids); + if (count < 0) { + ret = count; goto error; } MSG("LTTng UST traceable application [name (pid)]:"); - for (i=0; i < ret; i++) { + for (i=0; i < count; i++) { snprintf(path, sizeof(path), "/proc/%d/cmdline", pids[i]); fp = fopen(path, "r"); if (fp == NULL) { + MSG("\t(not running) (%d)", pids[i]); continue; } ret = fread(cmdline, 1, sizeof(cmdline), fp); @@ -219,7 +221,13 @@ static int check_ltt_sessiond(void) pathname = opt_sessiond_path; } else { /* Try LTTNG_SESSIOND_PATH env variable */ - pathname = strdup(getenv(LTTNG_SESSIOND_PATH_ENV)); + pathname = getenv(LTTNG_SESSIOND_PATH_ENV); + if (pathname != NULL) { + /* strdup here in order to make the free() + * not fail later on. + */ + pathname = strdup(pathname); + } } /* Let's rock and roll */ -- 2.34.1