From 64b732912c203bf2e95684c26241118f07c2c786 Mon Sep 17 00:00:00 2001 From: Ansis Atteka Date: Thu, 3 Jul 2014 13:41:02 -0700 Subject: [PATCH] util: create a copy of program_name Commit 8a9562 ("dpif-netdev: Add DPDK netdev.") reversed sequence in which set_program_name() and proctitle_init() functions are called. This introduced a regression where program_name and argv_start would point to exactly the same memory (previously both of these pointers were pointing to different memory locations because proctitle_init() would have beforehand created a copy of argv[0] for the succeeding set_program_name() call). This regression on my system caused ovs-vswitchd monitoring process to show up without process name: ... 00:00:00 : monitoring pid 26308 (healthy) Ps output was lacking process name because following code was using overlapping memory for source and target buffer:. proctitle_set(const char *format, ...) { ... n = snprintf(argv_start, argv_size, "%s: ", program_name); Overall C99 and POSIX standards state that behavior is undefined if source and target buffers overlap. Signed-Off-By: Ansis Atteka Acked-By: Ben Pfaff --- lib/util.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/util.c b/lib/util.c index 74dc88969..94f8792b3 100644 --- a/lib/util.c +++ b/lib/util.c @@ -454,15 +454,14 @@ void set_program_name__(const char *argv0, const char *version, const char *date, const char *time) { + free(program_name); + #ifdef _WIN32 char *basename; size_t max_len = strlen(argv0) + 1; SetErrorMode(GetErrorMode() | SEM_NOGPFAULTERRORBOX); - if (program_name) { - free(program_name); - } basename = xmalloc(max_len); _splitpath_s(argv0, NULL, 0, NULL, 0, basename, max_len, NULL, 0); assert_single_threaded(); @@ -470,7 +469,7 @@ set_program_name__(const char *argv0, const char *version, const char *date, #else const char *slash = strrchr(argv0, '/'); assert_single_threaded(); - program_name = slash ? slash + 1 : argv0; + program_name = xstrdup(slash ? slash + 1 : argv0); #endif free(program_version); -- 2.20.1