[tor-commits] [tor/master] Split strings at newline in tor_get_lines_from_handle().

nickm at torproject.org nickm at torproject.org
Mon Mar 27 13:02:53 UTC 2017


commit a28be68cf21353ca860dc4455b064155678ca2c0
Author: Alexander Færøy <ahf at torproject.org>
Date:   Fri Mar 17 04:18:31 2017 +0100

    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
---
 src/common/util.c    |  2 +-
 src/test/test_util.c | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/common/util.c b/src/common/util.c
index e800fa7..93befe9 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -5270,7 +5270,7 @@ tor_get_lines_from_handle, (int fd, enum stream_status *stream_status_out))
       goto done;
 
     if (!lines) lines = smartlist_new();
-    smartlist_add_strdup(lines, stdout_buf);
+    smartlist_split_string(lines, stdout_buf, "\n", 0, 0);
   }
 
  done:
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 3840130..203f9dd 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);





More information about the tor-commits mailing list