[git commit] bc: fix "echo -n '#foo' | bc" not eating last 'o'

Denys Vlasenko vda.linux at googlemail.com
Tue Dec 18 13:39:33 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=55f3cab7e9f61c1e9fc342f2d245d6b055a08b84
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
zdc_parse_expr                                       656     653      -3
bc_lex_lineComment                                    39      36      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-6)               Total: -6 bytes
   text	   data	    bss	    dec	    hex	filename
 981424	    485	   7296	 989205	  f1815	busybox_old
 981418	    485	   7296	 989199	  f180f	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 miscutils/bc.c     | 10 +++++++---
 testsuite/bc.tests |  5 +++++
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/miscutils/bc.c b/miscutils/bc.c
index a5fcaf3bc..eaa28a94a 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -2655,9 +2655,13 @@ static FAST_FUNC void bc_result_free(void *result)
 
 static void bc_lex_lineComment(BcLex *l)
 {
+	// Try: echo -n '#foo' | bc
+	size_t i;
 	l->t.t = BC_LEX_WHITESPACE;
-	while (l->i < l->len && l->buf[l->i++] != '\n');
-	--l->i;
+	i = l->i;
+	while (i < l->len && l->buf[i] != '\n')
+		i++;
+	l->i = i;
 }
 
 static void bc_lex_whitespace(BcLex *l)
@@ -2889,8 +2893,8 @@ static BC_STATUS zbc_lex_next(BcLex *l)
 	// Comments are also BC_LEX_WHITESPACE tokens and eaten here.
 	s = BC_STATUS_SUCCESS;
 	do {
-		l->t.t = BC_LEX_EOF;
 		if (l->i == l->len) {
+			l->t.t = BC_LEX_EOF;
 			if (!G.input_fp)
 				RETURN_STATUS(BC_STATUS_SUCCESS);
 			if (!bc_lex_more_input(l)) {
diff --git a/testsuite/bc.tests b/testsuite/bc.tests
index e0a45a8bd..e303cf6ae 100755
--- a/testsuite/bc.tests
+++ b/testsuite/bc.tests
@@ -16,6 +16,11 @@ testing "bc comment 2: /*/ is not a closed comment" \
 	"4\n" \
 	"" "1 /*/ + 2 */ + 3"
 
+testing "bc comment 3: unterminated #comment" \
+	"bc" \
+	"" \
+	"" "#foo"  # no trailing newline
+
 testing "bc backslash 1" \
 	"bc" \
 	"3\n" \


More information about the busybox-cvs mailing list