fusermount: don't feed "escaped commas" into mount options

The old code permits the following behavior:

$ _FUSE_COMMFD=10000 priv_strace -etrace=mount -s200 fusermount -o 'foobar=\,allow_other' mount
mount("/dev/fuse", ".", "fuse", MS_NOSUID|MS_NODEV, "foobar=\\,allow_other,fd=3,rootmode=40000,user_id=1000,group_id=1000") = -1 EINVAL (Invalid argument)

However, backslashes do not have any special meaning for the kernel here.

As it happens, you can't abuse this because there is no FUSE mount option
that takes a string value that can contain backslashes; but this is very
brittle. Don't interpret "escape characters" in places where they don't
work.
This commit is contained in:
Jann Horn
2018-07-13 15:15:36 -07:00
committed by Nikolaus Rath
parent 34c62ee90c
commit 28bdae3d11
+4 -1
View File
@@ -29,6 +29,7 @@
#include <sys/socket.h>
#include <sys/utsname.h>
#include <sched.h>
#include <stdbool.h>
#define FUSE_COMMFD_ENV "_FUSE_COMMFD"
@@ -754,8 +755,10 @@ static int do_mount(const char *mnt, char **typep, mode_t rootmode,
unsigned len;
const char *fsname_str = "fsname=";
const char *subtype_str = "subtype=";
bool escape_ok = begins_with(s, fsname_str) ||
begins_with(s, subtype_str);
for (len = 0; s[len]; len++) {
if (s[len] == '\\' && s[len + 1])
if (escape_ok && s[len] == '\\' && s[len + 1])
len++;
else if (s[len] == ',')
break;