aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/csource/generated.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-01-12 16:13:16 +0100
committerAleksandr Nogikh <nogikh@google.com>2024-01-12 15:40:35 +0000
commit551587c192ecb4df26fcdab775ed145ee69c07d4 (patch)
treec3371daf91899391c00066fc7d8f652acf601879 /pkg/csource/generated.go
parentf6fa7c2845ca01940da7571219da2203c579068d (diff)
executor: don't hold a loop device fd
When BLK_DEV_WRITE_MOUNTED is enabled, the kernel treats the loopfd reference as a writer and does not let us issue mount() calls over the same block device.
Diffstat (limited to 'pkg/csource/generated.go')
-rw-r--r--pkg/csource/generated.go29
1 files changed, 24 insertions, 5 deletions
diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go
index dbb18a811..7d817e290 100644
--- a/pkg/csource/generated.go
+++ b/pkg/csource/generated.go
@@ -7100,6 +7100,7 @@ static int setup_loop_device(unsigned char* data, unsigned long size, const char
loopfd = open(loopname, O_RDWR);
if (loopfd == -1) {
err = errno;
+ debug("setup_loop_device: open failed: %d\n", errno);
goto error_close_memfd;
}
if (ioctl(loopfd, LOOP_SET_FD, memfd)) {
@@ -7127,6 +7128,24 @@ error:
errno = err;
return -1;
}
+
+#if SYZ_EXECUTOR || __NR_syz_mount_image
+
+static void reset_loop_device(const char* loopname)
+{
+ int loopfd = open(loopname, O_RDWR);
+ if (loopfd == -1) {
+ debug("reset_loop_device: open failed: %d\n", errno);
+ return;
+ }
+ if (ioctl(loopfd, LOOP_CLR_FD, 0)) {
+ debug("reset_loop_device: LOOP_CLR_FD failed: %d\n", errno);
+ }
+ close(loopfd);
+}
+
+#endif
+
#endif
#if SYZ_EXECUTOR || __NR_syz_read_part_table
@@ -7188,7 +7207,7 @@ static long syz_mount_image(
volatile long image)
{
unsigned char* data = (unsigned char*)image;
- int res = -1, err = 0, loopfd = -1, need_loop_device = !!size;
+ int res = -1, err = 0, need_loop_device = !!size;
char* mount_opts = (char*)optsarg;
char* target = (char*)dir;
char* fs = (char*)fsarg;
@@ -7196,10 +7215,12 @@ static long syz_mount_image(
char loopname[64];
if (need_loop_device) {
+ int loopfd;
memset(loopname, 0, sizeof(loopname));
snprintf(loopname, sizeof(loopname), "/dev/loop%llu", procid);
if (setup_loop_device(data, size, loopname, &loopfd) == -1)
return -1;
+ close(loopfd);
source = loopname;
}
@@ -7250,10 +7271,8 @@ static long syz_mount_image(
}
error_clear_loop:
- if (need_loop_device) {
- ioctl(loopfd, LOOP_CLR_FD, 0);
- close(loopfd);
- }
+ if (need_loop_device)
+ reset_loop_device(loopname);
errno = err;
return res;
}