commit 62260ab56e398aba81fef1a3b6d5f72d6aa6532d
parent afac6ced6e127d83503b39102eb8e0db6a9b1c13
Author: M Stoeckl <code@mstoeckl.com>
Date: Sat, 19 Jan 2019 10:31:55 -0500
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.
Diffstat:
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git 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;
}
}