diff options
author | Alexander Færøy <ahf@torproject.org> | 2017-03-17 04:18:31 +0100 |
---|---|---|
committer | Alexander Færøy <ahf@0x90.dk> | 2017-03-17 04:27:12 +0100 |
commit | a28be68cf21353ca860dc4455b064155678ca2c0 (patch) | |
tree | 1821bd458a797ecf04420e0e4d40e80b515f9f5d /src/test/test_util.c | |
parent | 7505f452c865ef9ca5be35647032f93bfb392762 (diff) | |
download | tor-a28be68cf21353ca860dc4455b064155678ca2c0.tar.gz tor-a28be68cf21353ca860dc4455b064155678ca2c0.zip |
Split strings at newline in tor_get_lines_from_handle().
This patch fixes a regression described in bug #21757 that first
appeared after commit 6e78ede73f which was an attempt to fix bug #21654.
When switching from buffered I/O to direct file descriptor I/O our
output strings from get_string_from_pipe() might contain newline
characters (\n). In this patch we modify tor_get_lines_from_handle() to
ensure that the function splits the newly read string at the newline
character and thus might return multiple lines from a single call to
get_string_from_pipe().
Additionally, we add a test case to test_util_string_from_pipe() to
ensure that get_string_from_pipe() correctly returns multiple lines in a
single call.
See: https://bugs.torproject.org/21757
See: https://bugs.torproject.org/21654
Diffstat (limited to 'src/test/test_util.c')
-rw-r--r-- | src/test/test_util.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/test/test_util.c b/src/test/test_util.c index 38401305ef..203f9dd1c4 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -4029,6 +4029,16 @@ test_util_string_from_pipe(void *ptr) tt_mem_op(buf, OP_EQ, "B\0\xff\xff", sizeof(buf)); errno = 0; + /* Send in multiple lines. */ + retlen = write(test_pipe[1], "A\nB", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "A\nB"); + errno = 0; + /* Send in a line and close */ retlen = write(test_pipe[1], "AB", 2); tt_int_op(retlen, OP_EQ, 2); |