test.c: Avoid passing -1 to FD_* family of functions.

This avoids buffer overflow errors when running tests that capture
output from child processes.

This also corrects a copypasta in an off-nominal error message.

Change-Id: Ib482847a3515364f14c7e7a0c0a4213851ddb10d
This commit is contained in:
Sean Bright
2023-02-27 19:35:11 -05:00
committed by Friendly Automation
parent 73103bdcd5
commit 2e78d1083e

View File

@@ -363,7 +363,7 @@ int ast_test_capture_command(struct ast_test_capture *capture, const char *file,
} }
if (pipe(fd2) == -1) { if (pipe(fd2) == -1) {
ast_log(LOG_ERROR, "Couldn't open stdout pipe: %s\n", strerror(errno)); ast_log(LOG_ERROR, "Couldn't open stderr pipe: %s\n", strerror(errno));
goto cleanup; goto cleanup;
} }
@@ -472,7 +472,10 @@ int ast_test_capture_command(struct ast_test_capture *capture, const char *file,
*/ */
n = select(nfds, &readfds, &writefds, NULL, NULL); n = select(nfds, &readfds, &writefds, NULL, NULL);
if (FD_ISSET(fd0[1], &writefds)) { /* A version of FD_ISSET() that is tolerant of -1 file descriptors */
#define SAFE_FD_ISSET(fd, setptr) ((fd) != -1 && FD_ISSET((fd), setptr))
if (SAFE_FD_ISSET(fd0[1], &writefds)) {
n = write(fd0[1], data, datalen); n = write(fd0[1], data, datalen);
if (n > 0) { if (n > 0) {
data += n; data += n;
@@ -485,7 +488,7 @@ int ast_test_capture_command(struct ast_test_capture *capture, const char *file,
} }
} }
if (FD_ISSET(fd1[0], &readfds)) { if (SAFE_FD_ISSET(fd1[0], &readfds)) {
n = read(fd1[0], buf, sizeof(buf)); n = read(fd1[0], buf, sizeof(buf));
if (n > 0) { if (n > 0) {
fwrite(buf, sizeof(char), n, out); fwrite(buf, sizeof(char), n, out);
@@ -494,7 +497,7 @@ int ast_test_capture_command(struct ast_test_capture *capture, const char *file,
} }
} }
if (FD_ISSET(fd2[0], &readfds)) { if (SAFE_FD_ISSET(fd2[0], &readfds)) {
n = read(fd2[0], buf, sizeof(buf)); n = read(fd2[0], buf, sizeof(buf));
if (n > 0) { if (n > 0) {
fwrite(buf, sizeof(char), n, err); fwrite(buf, sizeof(char), n, err);
@@ -502,6 +505,8 @@ int ast_test_capture_command(struct ast_test_capture *capture, const char *file,
zclose(fd2[0]); zclose(fd2[0]);
} }
} }
#undef SAFE_FD_ISSET
} }
status = 1; status = 1;