trigger: reduce indentation level in trigger_event()
[project/procd.git] / jail / fs.c
index 714fa87..c4cdcc9 100644 (file)
--- a/jail/fs.c
+++ b/jail/fs.c
@@ -79,6 +79,29 @@ void mount_list_init(void) {
        avl_init(&mounts, avl_strcmp, false, NULL);
 }
 
+static int add_script_interp(const char *path, const char *map, int size)
+{
+       int start = 2;
+       while (start < size && map[start] != '/') {
+               start++;
+       }
+       if (start >= size) {
+               ERROR("bad script interp (%s)\n", path);
+               return -1;
+       }
+       int stop = start + 1;
+       while (stop < size && map[stop] > 0x20 && map[stop] <= 0x7e) {
+               stop++;
+       }
+       if (stop >= size || (stop-start) > PATH_MAX) {
+               ERROR("bad script interp (%s)\n", path);
+               return -1;
+       }
+       char buf[PATH_MAX];
+       strncpy(buf, map+start, stop-start);
+       return add_path_and_deps(buf, 1, -1, 0);
+}
+
 int add_path_and_deps(const char *path, int readonly, int error, int lib)
 {
        assert(path != NULL);
@@ -93,7 +116,7 @@ int add_path_and_deps(const char *path, int readonly, int error, int lib)
        if (path[0] == '/') {
                if (avl_find(&mounts, path))
                        return 0;
-               fd = open(path, O_RDONLY);
+               fd = open(path, O_RDONLY|O_CLOEXEC);
                if (fd == -1)
                        return error;
                add_mount(path, readonly, error);
@@ -135,6 +158,11 @@ int add_path_and_deps(const char *path, int readonly, int error, int lib)
                goto out;
        }
 
+       if (map[0] == '#' && map[1] == '!') {
+               ret = add_script_interp(path, map, s.st_size);
+               goto out;
+       }
+
        if (map[0] == ELFMAG0 && map[1] == ELFMAG1 && map[2] == ELFMAG2 && map[3] == ELFMAG3) {
                ret = elf_load_deps(path, map);
                goto out;