aboutsummaryrefslogtreecommitdiffstats
path: root/executor/common_linux.h
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2023-01-03 12:34:55 +0100
committerGitHub <noreply@github.com>2023-01-03 12:34:55 +0100
commit1dac8c7a01e2bdd35cb04eb4901ddb157291ac2d (patch)
treee08c7d36d9d9c85b6cb0695a4fd8ea775b284e35 /executor/common_linux.h
parentf0036e181e274023235289be91e334cb7507eaa6 (diff)
executor: better prevent the panic on ext4 errors (#3604)
We already suppress them, but the current approach fails if syzkaller slightly corrupts the options string. Do the check more rigorously.
Diffstat (limited to 'executor/common_linux.h')
-rw-r--r--executor/common_linux.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/executor/common_linux.h b/executor/common_linux.h
index dd48b570c..64e3f8fb5 100644
--- a/executor/common_linux.h
+++ b/executor/common_linux.h
@@ -3044,7 +3044,15 @@ static long syz_mount_image(
} else if (strncmp(fs, "ext", 3) == 0) {
// For ext2/3/4 we have to have errors=continue because the image
// can contain errors=panic flag and can legally crash kernel.
- if (strstr(opts, "errors=panic") || strstr(opts, "errors=remount-ro") == 0)
+ bool has_remount_ro = false;
+ char* remount_ro_start = strstr(opts, "errors=remount-ro");
+ if (remount_ro_start != NULL) {
+ // syzkaller can sometimes break the options format, so we have to make sure this option can really be parsed.
+ char after = *(remount_ro_start + strlen("errors=remount-ro"));
+ char before = remount_ro_start == opts ? '\0' : *(remount_ro_start - 1);
+ has_remount_ro = ((before == '\0' || before == ',') && (after == '\0' || after == ','));
+ }
+ if (strstr(opts, "errors=panic") || !has_remount_ro)
strcat(opts, ",errors=continue");
} else if (strcmp(fs, "xfs") == 0) {
// For xfs we need nouuid because xfs has a global uuids table