summaryrefslogtreecommitdiff
path: root/aports/busybox/0001-rev-correct-output-for-long-input-lines.patch
blob: ba40a2f0a248041ac949136351d27f0dd2ee06ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
From 4357569fdc7bc482dea0ef0bff57a70e7f06523c Mon Sep 17 00:00:00 2001
From: Ron Yorston <rmy@pobox.com>
Date: Sat, 21 Aug 2021 09:36:27 +0100
Subject: rev: correct output for long input lines

The input buffer is initialised to a reasonable size and extended
if necessary.  When this happened the offset into the buffer wasn't
reset to zero so subsequent lines were appended to the long line.

Fix this and add some tests.

function                                             old     new   delta
rev_main                                             377     368      -9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-9)               Total: -9 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 testsuite/rev.tests | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 util-linux/rev.c    |  1 +
 2 files changed, 47 insertions(+)
 create mode 100755 testsuite/rev.tests

diff --git a/testsuite/rev.tests b/testsuite/rev.tests
new file mode 100755
index 000000000..dd65dcd3b
--- /dev/null
+++ b/testsuite/rev.tests
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Copyright 2021 by Ron Yorston
+# Licensed under GPLv2, see file LICENSE in this source tree.
+
+. ./testing.sh
+
+# testing "test name" "commands" "expected result" "file input" "stdin"
+
+testing "rev works" \
+	"rev input" \
+"\
+1 enil
+
+3 enil
+" \
+	"line 1\n\nline 3\n" \
+	""
+
+testing "rev file with missing newline" \
+	"rev input" \
+"\
+1 enil
+
+3 enil" \
+	"line 1\n\nline 3" \
+	""
+
+testing "rev file with NUL character" \
+	"rev input" \
+"\
+nil
+3 enil
+" \
+	"lin\000e 1\n\nline 3\n" \
+	""
+
+testing "rev file with long line" \
+	"rev input" \
+"\
++--------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------
+cba
+" \
+	"---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+--------------+\nabc\n" \
+	""
+
+exit $FAILCOUNT
diff --git a/util-linux/rev.c b/util-linux/rev.c
index d439b4da8..63b005c67 100644
--- a/util-linux/rev.c
+++ b/util-linux/rev.c
@@ -109,6 +109,7 @@ int rev_main(int argc UNUSED_PARAM, char **argv)
 			strrev(buf, strlen(buf));
 #endif
 			fputs_stdout(buf);
+			pos = 0;
 		}
 		fclose(fp);
 	} while (*argv);
-- 
cgit v1.2.3