From ac3700e3ee7f8cb8429c78afa4f11cfb5cc8cfc5 Mon Sep 17 00:00:00 2001 From: Artem Bityutskiy Date: Tue, 26 Apr 2011 12:47:48 +0300 Subject: 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 --- tests/fs-tests/integrity/integck.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'tests') 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; } -- cgit v1.2.3