diff options
-rw-r--r-- | opt.c | 12 | ||||
-rwxr-xr-x | tests.sh | 5 | ||||
-rw-r--r-- | tests/test_depth_overflow.out | 19 |
3 files changed, 32 insertions, 4 deletions
@@ -120,14 +120,18 @@ static void debug_opt(const struct opt_state *state, const char *format, ...) { } /** Update the inferred mindepth. */ -static void update_mindepth(struct opt_facts *facts, int mindepth) { +static void update_mindepth(struct opt_facts *facts, long long mindepth) { if (mindepth > facts->mindepth) { - facts->mindepth = mindepth; + if (mindepth > INT_MAX) { + facts->maxdepth = -1; + } else { + facts->mindepth = mindepth; + } } } /** Update the inferred maxdepth. */ -static void update_maxdepth(struct opt_facts *facts, int maxdepth) { +static void update_maxdepth(struct opt_facts *facts, long long maxdepth) { if (maxdepth < facts->maxdepth) { facts->maxdepth = maxdepth; } @@ -147,7 +151,7 @@ static void infer_depth_facts(struct opt_state *state, const struct expr *expr) break; case CMP_GREATER: - if (expr->idata == INT_MAX) { + if (expr->idata == LONG_LONG_MAX) { // Avoid overflow state->facts_when_true.maxdepth = -1; } else { @@ -259,6 +259,7 @@ bsd_tests=( test_depth_depth_n test_depth_depth_n_plus test_depth_depth_n_minus + test_depth_overflow test_gid_name test_uid_name test_mnewer @@ -1148,6 +1149,10 @@ function test_depth_depth_n_minus() { bfs_diff basic -depth -depth -2 } +function test_depth_overflow() { + bfs_diff basic -depth -4294967296 +} + function test_gid_name() { bfs_diff basic -gid "$(id -gn)" } diff --git a/tests/test_depth_overflow.out b/tests/test_depth_overflow.out new file mode 100644 index 0000000..bb3cd8d --- /dev/null +++ b/tests/test_depth_overflow.out @@ -0,0 +1,19 @@ +basic +basic/a +basic/b +basic/c +basic/e +basic/g +basic/i +basic/j +basic/k +basic/l +basic/c/d +basic/e/f +basic/g/h +basic/j/foo +basic/k/foo +basic/l/foo +basic/k/foo/bar +basic/l/foo/bar +basic/l/foo/bar/baz |