diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-04-26 12:47:48 +0300 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-04-29 21:19:58 +0300 |
commit | ac3700e3ee7f8cb8429c78afa4f11cfb5cc8cfc5 (patch) | |
tree | 58bec72d3b954edd6046f563c97dc44ca0a73ab4 /tests/fs-tests | |
parent | 8d723c74983953a5b2fe64164893e3aee84c9d78 (diff) |
fs-tests: integck: limit the recursion depth
I observes segfaults in integck test, and unfortunately I do not have the core
file to investigate the problem. But I see one possibility for the test to
segfault - it has unbounded recursion. Limit the maximum recursion depth.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'tests/fs-tests')
-rw-r--r-- | tests/fs-tests/integrity/integck.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index 1dd424e..a35b7ae 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -2094,11 +2094,20 @@ static int operate_on_file(struct file_info *file) return 0; } +/* + * The operate on entry function is recursive because it calls + * 'operate_on_dir()' which calls 'operate_on_entry()' again. This variable is + * used to limit the recursion depth. + */ +static int recursion_depth; + /* Randomly select something to do with a directory entry */ static int operate_on_entry(struct dir_entry_info *entry) { int ret = 0; + recursion_depth += 1; + /* 1 time in 1000 rename */ if (random_no(1000) == 0) ret = rename_entry(entry); @@ -2111,7 +2120,7 @@ static int operate_on_entry(struct dir_entry_info *entry) /* If shrinking, 1 time in 50, remove a directory */ if (shrink && random_no(50) == 0) ret = dir_remove(entry->dir); - else + else if (recursion_depth < 20) ret = operate_on_dir(entry->dir); } else if (entry->type == 'f') { /* If shrinking, 1 time in 10, remove a file */ @@ -2124,6 +2133,8 @@ static int operate_on_entry(struct dir_entry_info *entry) else ret = operate_on_file(entry->file); } + + recursion_depth -= 1; return ret; } |