From: Ansis Atteka Date: Thu, 3 Jul 2014 20:41:02 +0000 (-0700) Subject: util: create a copy of program_name X-Git-Tag: v2.4.0~1839 X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;h=e0b48482c16b6eaa7f14d8c7e7c6275528881b9e;hp=5e73c322580c2ea1604d55c5318943135564e896;p=cascardo%2Fovs.git 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 --- diff --git a/lib/util.c b/lib/util.c index 01ba6bc04..4f9b07907 100644 --- a/lib/util.c +++ b/lib/util.c @@ -455,6 +455,8 @@ 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; @@ -462,9 +464,6 @@ set_program_name__(const char *argv0, const char *version, const char *date, SetErrorMode(GetErrorMode() | SEM_NOGPFAULTERRORBOX); _set_output_format(_TWO_DIGIT_EXPONENT); - 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(); @@ -472,7 +471,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);