Correct regression introduced by previous commit.
safe_recv(..., len), when used on a blocking fd, will attempt to call recv and collect data until either EOF, a hard error, or len bytes are collected. The previous commit used safe_recv() in a blocking mode to read a single byte into a buffer that was larger than a byte. This would cause ndhc to stall as safe_recv() would try to fill that buffer when no more data would ever be sent. This issue would only happen if ndhc is supposed to run a script. Introduce and use safe_recv_once() that will correct this problem and fill the semantic gap for blocking fds. I add a new call because in some cases the above behavior might be required for a blocking fd, too. Note that the above issue is not a problem for nonblocking fds; the EAGAIN or EWOULDBLOCK path will return a short read.
This commit is contained in:
@@ -32,7 +32,7 @@ void request_scriptd_run(void)
|
||||
suicide("%s: (%s) write failed: %zd", client_config.interface,
|
||||
__func__, r);
|
||||
char buf[16];
|
||||
r = safe_recv(scriptdSock[0], buf, sizeof buf, 0);
|
||||
r = safe_recv_once(scriptdSock[0], buf, sizeof buf, 0);
|
||||
if (r == 0) {
|
||||
// Remote end hung up.
|
||||
exit(EXIT_SUCCESS);
|
||||
|
Reference in New Issue
Block a user