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.
This commit is contained in:
M Stoeckl 2019-01-19 10:31:55 -05:00 committed by emersion
parent afac6ced6e
commit 62260ab56e
1 changed files with 12 additions and 4 deletions

View File

@ -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;
}
}