diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/firejail/appimage.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/firejail/appimage.c b/src/firejail/appimage.c index 01a78c324..6a9ca1679 100644 --- a/src/firejail/appimage.c +++ b/src/firejail/appimage.c | |||
@@ -31,34 +31,39 @@ | |||
31 | static char *devloop = NULL; // device file | 31 | static char *devloop = NULL; // device file |
32 | static char *mntdir = NULL; // mount point in /tmp directory | 32 | static char *mntdir = NULL; // mount point in /tmp directory |
33 | 33 | ||
34 | void appimage_set(const char *appimage_path) { | 34 | void appimage_set(const char *appimage) { |
35 | assert(appimage_path); | 35 | assert(appimage); |
36 | assert(devloop == NULL); // don't call this twice! | 36 | assert(devloop == NULL); // don't call this twice! |
37 | EUID_ASSERT(); | 37 | EUID_ASSERT(); |
38 | 38 | ||
39 | #ifdef LOOP_CTL_GET_FREE // test for older kernels; this definition is found in /usr/include/linux/loop.h | 39 | #ifdef LOOP_CTL_GET_FREE // test for older kernels; this definition is found in /usr/include/linux/loop.h |
40 | // check appimage_path | 40 | // check appimage file |
41 | if (access(appimage_path, R_OK) == -1) { | 41 | invalid_filename(appimage); |
42 | if (access(appimage, R_OK) == -1) { | ||
42 | fprintf(stderr, "Error: cannot access AppImage file\n"); | 43 | fprintf(stderr, "Error: cannot access AppImage file\n"); |
43 | exit(1); | 44 | exit(1); |
44 | } | 45 | } |
45 | 46 | ||
46 | // get appimage type and ELF size | 47 | // get appimage type and ELF size |
47 | // a value of 0 means we are dealing with a type1 appimage | 48 | // a value of 0 means we are dealing with a type1 appimage |
48 | long unsigned int size = appimage2_size(appimage_path); | 49 | long unsigned int size = appimage2_size(appimage); |
49 | if (arg_debug) | 50 | if (arg_debug) |
50 | printf("AppImage ELF size %lu\n", size); | 51 | printf("AppImage ELF size %lu\n", size); |
51 | 52 | ||
52 | // open as user to prevent race condition | 53 | // open appimage file |
53 | int ffd = open(appimage_path, O_RDONLY|O_CLOEXEC); | 54 | int ffd = open(appimage, O_RDONLY|O_CLOEXEC); |
54 | if (ffd == -1) { | 55 | if (ffd == -1) { |
55 | fprintf(stderr, "Error: /dev/loop-control interface is not supported by your kernel\n"); | 56 | fprintf(stderr, "Error: cannot open AppImage file\n"); |
56 | exit(1); | 57 | exit(1); |
57 | } | 58 | } |
58 | 59 | ||
59 | // find or allocate a free loop device to use | 60 | // find or allocate a free loop device to use |
60 | EUID_ROOT(); | 61 | EUID_ROOT(); |
61 | int cfd = open("/dev/loop-control", O_RDWR); | 62 | int cfd = open("/dev/loop-control", O_RDWR); |
63 | if (cfd == -1) { | ||
64 | fprintf(stderr, "Error: /dev/loop-control interface is not supported by your kernel\n"); | ||
65 | exit(1); | ||
66 | } | ||
62 | int devnr = ioctl(cfd, LOOP_CTL_GET_FREE); | 67 | int devnr = ioctl(cfd, LOOP_CTL_GET_FREE); |
63 | if (devnr == -1) { | 68 | if (devnr == -1) { |
64 | fprintf(stderr, "Error: cannot allocate a new loopback device\n"); | 69 | fprintf(stderr, "Error: cannot allocate a new loopback device\n"); |
@@ -113,7 +118,7 @@ void appimage_set(const char *appimage_path) { | |||
113 | EUID_USER(); | 118 | EUID_USER(); |
114 | 119 | ||
115 | // set environment | 120 | // set environment |
116 | if (appimage_path && setenv("APPIMAGE", appimage_path, 1) < 0) | 121 | if (appimage && setenv("APPIMAGE", appimage, 1) < 0) |
117 | errExit("setenv"); | 122 | errExit("setenv"); |
118 | if (mntdir && setenv("APPDIR", mntdir, 1) < 0) | 123 | if (mntdir && setenv("APPDIR", mntdir, 1) < 0) |
119 | errExit("setenv"); | 124 | errExit("setenv"); |