radv: add a secure_compile_open_fifo_fds() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 13 Nov 2019 03:51:48 +0000 (14:51 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Sun, 24 Nov 2019 23:10:14 +0000 (10:10 +1100)
This will be used to create a communication pipe between the user
facing device and a freshly forked (per pipeline compile) slim copy
of that device.

We can't use pipe() here because the fork will not be a direct fork
of the user facing process. Instead we use a previously forked
copy of the process that was forked at device creation in order to
reduce the resources required for the fork and avoid performance
issues.

Fixes: cff53da3748d ("radv: enable secure compile support")
src/amd/vulkan/radv_device.c

index dbdaa442c83b1fa9c9f106b728f72d43816f3cad..20ebc2924de6a676b1e01f274db885fc810b1a77 100644 (file)
@@ -2209,6 +2209,49 @@ static bool radv_close_all_fds(const int *keep_fds, int keep_fd_count)
        return true;
 }
 
+static bool secure_compile_open_fifo_fds(struct radv_secure_compile_state *sc,
+                                        int *fd_server, int *fd_client,
+                                        unsigned process, bool make_fifo)
+{
+       bool result = false;
+       char *fifo_server_path = NULL;
+       char *fifo_client_path = NULL;
+
+       if (asprintf(&fifo_server_path, "/tmp/radv_server_%s_%u", sc->uid, process) == -1)
+               goto open_fifo_exit;
+
+       if (asprintf(&fifo_client_path, "/tmp/radv_client_%s_%u", sc->uid, process) == -1)
+               goto open_fifo_exit;
+
+       if (make_fifo) {
+               int file1 = mkfifo(fifo_server_path, 0666);
+               if(file1 < 0)
+                       goto open_fifo_exit;
+
+               int file2 = mkfifo(fifo_client_path, 0666);
+               if(file2 < 0)
+                       goto open_fifo_exit;
+       }
+
+       *fd_server = open(fifo_server_path, O_RDWR);
+       if(*fd_server < 1)
+               goto open_fifo_exit;
+
+       *fd_client = open(fifo_client_path, O_RDWR);
+       if(*fd_client < 1) {
+               close(*fd_server);
+               goto open_fifo_exit;
+       }
+
+       result = true;
+
+open_fifo_exit:
+       free(fifo_server_path);
+       free(fifo_client_path);
+
+       return result;
+}
+
 static void run_secure_compile_device(struct radv_device *device, unsigned process,
                                      int fd_secure_input, int fd_secure_output)
 {