diff options
author | Alexander Færøy <ahf@torproject.org> | 2018-12-20 13:04:49 +0100 |
---|---|---|
committer | Alexander Færøy <ahf@torproject.org> | 2018-12-20 13:04:49 +0100 |
commit | f58e597d42c204e25101143f9618d55aef666edc (patch) | |
tree | 7d9291c27f4b02f42cc181b48d4d26b65a4b0bc9 /src/lib/process | |
parent | 36e24782f87c25d13b4c918c66cd4affaab8df79 (diff) | |
download | tor-f58e597d42c204e25101143f9618d55aef666edc.tar.gz tor-f58e597d42c204e25101143f9618d55aef666edc.zip |
Handle ERROR_BROKEN_PIPE in completion routines.
Handle `ERROR_BROKEN_PIPE` from ReadFileEx() and WriteFileEx() in
process_win32_stdin_write_done() and
process_win32_handle_read_completion() instead of in the early handler.
This most importantmly makes sure that `reached_eof` is set to true when
these errors appears.
See: https://bugs.torproject.org/28179
Diffstat (limited to 'src/lib/process')
-rw-r--r-- | src/lib/process/process_win32.c | 37 |
1 files changed, 6 insertions, 31 deletions
diff --git a/src/lib/process/process_win32.c b/src/lib/process/process_win32.c index 358765f790..3b4373f425 100644 --- a/src/lib/process/process_win32.c +++ b/src/lib/process/process_win32.c @@ -765,15 +765,6 @@ process_win32_stdout_read_done(DWORD error_code, tor_assert(overlapped); tor_assert(overlapped->hEvent); - /* This happens when we have asked ReadFileEx() to read some data, but we - * then decided to call CloseHandle() on the HANDLE. This can happen if - * someone runs process_free() in the exit_callback of process_t, which means - * we cannot call process_get_win32_process() here. */ - if (error_code == ERROR_BROKEN_PIPE) { - log_debug(LD_PROCESS, "Process reported broken pipe on standard out"); - return; - } - /* Extract our process_t from the hEvent member of OVERLAPPED. */ process_t *process = (process_t *)overlapped->hEvent; process_win32_t *win32_process = process_get_win32_process(process); @@ -797,15 +788,6 @@ process_win32_stderr_read_done(DWORD error_code, tor_assert(overlapped); tor_assert(overlapped->hEvent); - /* This happens when we have asked ReadFileEx() to read some data, but we - * then decided to call CloseHandle() on the HANDLE. This can happen if - * someone runs process_free() in the exit_callback of process_t, which means - * we cannot call process_get_win32_process() here. */ - if (error_code == ERROR_BROKEN_PIPE) { - log_debug(LD_PROCESS, "Process reported broken pipe on standard error"); - return; - } - /* Extract our process_t from the hEvent member of OVERLAPPED. */ process_t *process = (process_t *)overlapped->hEvent; process_win32_t *win32_process = process_get_win32_process(process); @@ -831,15 +813,6 @@ process_win32_stdin_write_done(DWORD error_code, (void)byte_count; - /* This happens when we have asked WriteFileEx() to write some data, but we - * then decided to call CloseHandle() on the HANDLE. This can happen if - * someone runs process_free() in the exit_callback of process_t, which means - * we cannot call process_get_win32_process() here. */ - if (error_code == ERROR_BROKEN_PIPE) { - log_debug(LD_PROCESS, "Process reported broken pipe on standard input"); - return; - } - process_t *process = (process_t *)overlapped->hEvent; process_win32_t *win32_process = process_get_win32_process(process); @@ -860,7 +833,8 @@ process_win32_stdin_write_done(DWORD error_code, /* Schedule the next write. */ process_notify_event_stdin(process); - } else if (error_code == ERROR_HANDLE_EOF) { + } else if (error_code == ERROR_HANDLE_EOF || + error_code == ERROR_BROKEN_PIPE) { /* Our WriteFileEx() call was succesful, but we reached the end of our * file. We mark our handle as having reached EOF and returns. */ tor_assert(byte_count == 0); @@ -983,9 +957,10 @@ process_win32_handle_read_completion(process_win32_handle_t *handle, /* Tell our caller to schedule the next read. */ return true; - } else if (error_code == ERROR_HANDLE_EOF) { - /* Our ReadFileEx() call was succesful, but we reached the end of our file. - * We mark our handle as having reached EOF and returns. */ + } else if (error_code == ERROR_HANDLE_EOF || + error_code == ERROR_BROKEN_PIPE) { + /* Our ReadFileEx() finished, but we reached the end of our file. We mark + * our handle as having reached EOF and returns. */ tor_assert(byte_count == 0); handle->reached_eof = true; |