consdiff: Reject ranges with non-numeric chars

Fixes bug #21964
This commit is contained in:
Sebastian Hahn 2017-04-18 13:43:55 +02:00 committed by Nick Mathewson
parent b081a7ed21
commit a16de7a7cf
2 changed files with 53 additions and 1 deletions

View File

@ -757,6 +757,9 @@ get_linenum(const char **s, int *num_out)
{
int ok;
char *next;
if (!TOR_ISDIGIT(**s)) {
return -1;
}
*num_out = (int) tor_parse_long(*s, 10, 0, INT32_MAX, &ok, &next);
if (ok && next) {
*s = next;

View File

@ -746,6 +746,55 @@ test_consdiff_apply_ed_diff(void *arg)
smartlist_clear(diff);
/* Ranges must be numeric only and cannot contain spaces. */
smartlist_add_linecpy(diff, area, "0, 4d");
mock_clean_saved_logs();
cons2 = apply_ed_diff(cons1, diff, 0);
tt_ptr_op(NULL, OP_EQ, cons2);
expect_single_log_msg_containing("an ed command was missing a range "
"end line number.");
smartlist_clear(diff);
/* '+' is not a number. */
smartlist_add_linecpy(diff, area, "+0,4d");
mock_clean_saved_logs();
cons2 = apply_ed_diff(cons1, diff, 0);
tt_ptr_op(NULL, OP_EQ, cons2);
expect_single_log_msg_containing("an ed command was missing a line number");
smartlist_clear(diff);
/* range duplication */
smartlist_add_linecpy(diff, area, "0,4d,5d");
mock_clean_saved_logs();
cons2 = apply_ed_diff(cons1, diff, 0);
tt_ptr_op(NULL, OP_EQ, cons2);
expect_single_log_msg_containing("an ed command longer than one char was "
"found");
smartlist_clear(diff);
/* space before command */
smartlist_add_linecpy(diff, area, "0,4 d");
mock_clean_saved_logs();
cons2 = apply_ed_diff(cons1, diff, 0);
tt_ptr_op(NULL, OP_EQ, cons2);
expect_single_log_msg_containing("an ed command longer than one char was "
"found");
smartlist_clear(diff);
/* space inside number */
smartlist_add_linecpy(diff, area, "0,4 5d");
mock_clean_saved_logs();
cons2 = apply_ed_diff(cons1, diff, 0);
tt_ptr_op(NULL, OP_EQ, cons2);
expect_single_log_msg_containing("an ed command longer than one char was "
"found");
smartlist_clear(diff);
/* Test appending text, 'a'. */
consensus_split_lines(diff, "3a\nU\nO\n.\n0a\nV\n.\n", area);
cons2 = apply_ed_diff(cons1, diff, 0);
@ -775,7 +824,7 @@ test_consdiff_apply_ed_diff(void *arg)
smartlist_free(cons2);
/* Test changing text, 'c'. */
consensus_split_lines(diff, "4c\nT\nX\n.\n1, 2c\nM\n.\n", area);
consensus_split_lines(diff, "4c\nT\nX\n.\n1,2c\nM\n.\n", area);
cons2 = apply_ed_diff(cons1, diff, 0);
tt_ptr_op(NULL, OP_NE, cons2);
tt_int_op(5, OP_EQ, smartlist_len(cons2));