From a443a321efb2f5435b9a352fe29be5bda5f5636b Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Thu, 19 Nov 2020 09:37:18 +0530 Subject: [PATCH] Fix #786: memccpy() detects buffer overlap on macOS --- src/nnn.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/nnn.c b/src/nnn.c index 8328718c..4be553ac 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -1016,6 +1016,8 @@ static inline bool getutil(char *util) /* * Updates out with "dir/name or "/name" * Returns the number of bytes copied including the terminating NULL byte + * + * Note: dir and out must be PATH_MAX in length to avoid macOS fault */ static size_t mkpath(const char *dir, const char *name, char *out) { @@ -4710,10 +4712,14 @@ static bool run_cmd_as_plugin(const char *file, char *runfile, uchar flags) static bool plctrl_init(void) { - snprintf(g_buf, CMD_LEN_MAX, "nnn-pipe.%d", getpid()); + size_t len; + /* g_tmpfpath is used to generate tmp file names */ g_tmpfpath[tmpfplen - 1] = '\0'; - mkpath(g_tmpfpath, g_buf, g_pipepath); + len = xstrsncpy(g_pipepath, g_tmpfpath, TMP_LEN_MAX); + g_pipepath[len - 1] = '/'; + len = xstrsncpy(g_pipepath + len, "nnn-pipe.", TMP_LEN_MAX - len) + len; + xstrsncpy(g_pipepath + len - 1, xitoa(getpid()), TMP_LEN_MAX - len); setenv(env_cfg[NNN_PIPE], g_pipepath, TRUE); return EXIT_SUCCESS;