From d305405d0bb52350206062d1f746b2d5ccf2f9cb Mon Sep 17 00:00:00 2001 From: Furkan Sahin Date: Sat, 19 Jan 2019 10:31:55 -0500 Subject: Fix backup methods in get_socketpath for IPC client Previously, the success of `getline` was tested by checking if the buffer it allocates is nonempty and has a nonzero first byte. As `getline` does not explicitly zero out its memory buffer, this may fail (e.g., with AddressSanitizer). Instead, we check that at least one character was returned on standard output. Also, trailing newlines (if present) are now removed. --- common/ipc-client.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/common/ipc-client.c b/common/ipc-client.c index 1e88e71f..79ed3555 100644 --- a/common/ipc-client.c +++ b/common/ipc-client.c @@ -22,9 +22,13 @@ char *get_socketpath(void) { size_t line_size = 0; FILE *fp = popen("sway --get-socketpath 2>/dev/null", "r"); if (fp) { - getline(&line, &line_size, fp); + ssize_t nret = getline(&line, &line_size, fp); pclose(fp); - if (line && *line) { + if (nret > 0) { + // remove trailing newline, if there is one + if (line[nret - 1] == '\n') { + line[nret - 1] = '\0'; + } return line; } } @@ -35,9 +39,13 @@ char *get_socketpath(void) { } fp = popen("i3 --get-socketpath 2>/dev/null", "r"); if (fp) { - getline(&line, &line_size, fp); + ssize_t nret = getline(&line, &line_size, fp); pclose(fp); - if (line && *line) { + if (nret > 0) { + // remove trailing newline, if there is one + if (line[nret - 1] == '\n') { + line[nret - 1] = '\0'; + } return line; } } -- cgit v1.2.3