summaryrefslogtreecommitdiff
path: root/tests/fs-tests
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-04-26 12:47:48 +0300
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-04-29 21:19:58 +0300
commitac3700e3ee7f8cb8429c78afa4f11cfb5cc8cfc5 (patch)
tree58bec72d3b954edd6046f563c97dc44ca0a73ab4 /tests/fs-tests
parent8d723c74983953a5b2fe64164893e3aee84c9d78 (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.c13
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;
}