summaryrefslogtreecommitdiff
path: root/tests/fs-tests/integrity
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-05-02 18:19:47 +0300
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-05-20 12:48:41 +0300
commitb722a1afe37eab14a5482c9e1efd5e6d625fa171 (patch)
treee60ffe1f364d50c21c66d5204004b25a67973450 /tests/fs-tests/integrity
parent43022f637813719817b4c966b36bb4453c75419c (diff)
fs-tests: integck: fix segfault
Commit 1394a46213e8180e1233ca6d4811e7c77d49b1e0 was a good idea, but it introduced a segfault - files can be unlinked and 'file->links' is NULL, it is bad idea to unconditionally dereference it with 'file->links->name'. This patch introduces a helper function which takes care of the situation with unlinked files, plus it adds few assertions. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'tests/fs-tests/integrity')
-rw-r--r--tests/fs-tests/integrity/integck.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c
index 9b98ef0..1b08acc 100644
--- a/tests/fs-tests/integrity/integck.c
+++ b/tests/fs-tests/integrity/integck.c
@@ -837,6 +837,8 @@ static int file_open(struct file_info *file)
int fd, flags = O_RDWR;
char *path;
+ assert(file->links);
+
path = dir_path(file->links->parent, file->links->name);
if (random_no(100) == 1)
flags |= O_SYNC;
@@ -851,6 +853,13 @@ static int file_open(struct file_info *file)
return 0;
}
+static const char *get_file_name(struct file_info *file)
+{
+ if (file->links)
+ return file->links->name;
+ return "(unlinked file, no names)";
+}
+
/*
* Write random 'size' bytes of random data to offset 'offset'. Seed the random
* gererator with 'seed'. Return amount of written data on success and -1 on
@@ -890,7 +899,7 @@ static ssize_t file_write_data(struct file_info *file, int fd, off_t offset,
}
pcv("failed to write %zu bytes to offset %llu of file %s",
block, (unsigned long long)(offset + actual),
- file->links->name);
+ get_file_name(file));
return -1;
}
remains -= written;
@@ -1089,7 +1098,8 @@ static int file_ftruncate(struct file_info *file, int fd, off_t new_length)
return 1;
} else
pcv("cannot truncate file %s to %llu",
- file->links->name, (unsigned long long)new_length);
+ get_file_name(file),
+ (unsigned long long)new_length);
return -1;
}
@@ -1139,6 +1149,7 @@ static int file_mmap_write(struct file_info *file)
len = 1 << 24;
/* Open it */
+ assert(file->links);
path = dir_path(file->links->parent, file->links->name);
fd = open(path, O_RDWR);
if (fd == -1) {
@@ -1256,12 +1267,12 @@ static int file_write(struct file_info *file, int fd)
if (random_no(100) >= 50) {
ret = fsync(fd);
if (ret)
- pcv("fsync failed for %s", file->links->name);
+ pcv("fsync failed for %s", get_file_name(file));
} else {
ret = fdatasync(fd);
if (ret)
pcv("fdatasync failed for %s",
- file->links->name);
+ get_file_name(file));
}
file->clean = 1;
}
@@ -1278,6 +1289,7 @@ static int file_write_file(struct file_info *file)
int fd, ret;
char *path;
+ assert(file->links);
path = dir_path(file->links->parent, file->links->name);
fd = open(path, O_RDWR);
if (fd == -1) {
@@ -1314,6 +1326,7 @@ static int file_truncate_file(struct file_info *file)
char *path;
int ret;
+ assert(file->links);
path = dir_path(file->links->parent, file->links->name);
fd = open(path, O_WRONLY);
if (fd == -1) {
@@ -1394,7 +1407,7 @@ static void save_file(int fd, struct file_info *file)
/* Open file to save contents to */
strcpy(name, "/tmp/");
- strcat(name, file->links->name);
+ strcat(name, get_file_name(file));
strcat(name, ".integ.sav.read");
normsg("Saving %sn", name);
w_fd = open(name, O_CREAT | O_WRONLY, 0777);
@@ -1414,7 +1427,7 @@ static void save_file(int fd, struct file_info *file)
/* Open file to save contents to */
strcpy(name, "/tmp/");
- strcat(name, file->links->name);
+ strcat(name, get_file_name(file));
strcat(name, ".integ.sav.written");
normsg("Saving %s", name);
w_fd = open(name, O_CREAT | O_WRONLY, 0777);
@@ -1512,7 +1525,8 @@ static void file_check(struct file_info *file, int fd)
open_and_close = 1;
if (open_and_close) {
/* Open file */
- path = dir_path(file->links->parent, file->links->name);
+ assert(file->links);
+ path = dir_path(file->links->parent, get_file_name(file));
fd = open(path, O_RDONLY);
CHECK(fd != -1);
}