Mercurial
annotate mrjunejune/latex_renderer.c @ 247:70f2a3dafc1c
[build] Bundle offline Tectonic runtime
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 03 Aug 2026 20:20:06 -0700 |
| parents | b8aa08503378 |
| children | b8b6e726964a |
| rev | line source |
|---|---|
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
1 #include "mrjunejune/latex_renderer.h" |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 #ifdef __linux__ |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 #include <dirent.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 #include <errno.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 #include <fcntl.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 #include <linux/audit.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 #include <linux/filter.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 #include <linux/landlock.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
11 #include <linux/seccomp.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 #include <limits.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 #include <poll.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 #include <signal.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 #include <stdbool.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 #include <stddef.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 #include <stdio.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
18 #include <stdlib.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
19 #include <string.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
20 #include <sys/prctl.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 #include <sys/resource.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 #include <sys/stat.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 #include <sys/syscall.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 #include <sys/types.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 #include <sys/wait.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 #include <time.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 #include <unistd.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 #ifndef LANDLOCK_ACCESS_FS_REFER |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 #define LANDLOCK_ACCESS_FS_REFER (1ULL << 13) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 #endif |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
32 #ifndef LANDLOCK_ACCESS_FS_TRUNCATE |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 #define LANDLOCK_ACCESS_FS_TRUNCATE (1ULL << 14) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 #endif |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
36 #if defined(__x86_64__) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
37 #define LATEX_AUDIT_ARCH AUDIT_ARCH_X86_64 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 #elif defined(__aarch64__) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 #define LATEX_AUDIT_ARCH AUDIT_ARCH_AARCH64 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 #else |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 #define LATEX_AUDIT_ARCH 0 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 #endif |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 #define LATEX_DIAGNOSTICS_MAX_BYTES (16 * 1024) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 #define LATEX_CPU_TIMEOUT_SECONDS 5 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 #define LATEX_WALL_TIMEOUT_SECONDS 8 |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
47 #define TECTONIC_BUNDLE_URL "https://data1.fullyjustified.net/tlextras-2022.0r0.tar" |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
48 #define TECTONIC_CACHE_PATH "third_party/tectonic/runtime/cache" |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
49 #define TECTONIC_COMPILER_PATH "third_party/tectonic/runtime/bin/tectonic" |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
50 #define TECTONIC_FONTCONFIG_SYSROOT_PATH "third_party/tectonic/runtime/sysroot" |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
51 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
52 static char *duplicate_message(const char *message) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
53 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 size_t length = strlen(message); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 char *copy = malloc(length + 1); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 if (copy) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 memcpy(copy, message, length + 1); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 return copy; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 static Latex_Render_Result result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 Latex_Render_Status status, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 const char *message) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
65 return (Latex_Render_Result){ |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
66 .status = status, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
67 .diagnostics = duplicate_message(message), |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
68 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
69 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
70 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
71 static bool write_all(int fd, const uint8_t *data, size_t size) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
72 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
73 while (size > 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
74 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
75 ssize_t written = write(fd, data, size); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
76 if (written < 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
77 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
78 if (errno == EINTR) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
79 continue; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
80 return false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
81 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
82 data += written; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
83 size -= (size_t)written; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
84 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
85 return true; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
86 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
87 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
88 static int remove_tree(const char *path, unsigned depth) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
89 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
90 if (depth > 16) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
91 return -1; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
92 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
93 struct stat status; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
94 if (lstat(path, &status) != 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 return errno == ENOENT ? 0 : -1; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
96 if (!S_ISDIR(status.st_mode)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
97 return unlink(path); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
98 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
99 DIR *directory = opendir(path); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 if (!directory) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
101 return -1; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
102 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
103 int result = 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 struct dirent *entry; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 while ((entry = readdir(directory)) != NULL) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 if (strcmp(entry->d_name, ".") == 0 || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 strcmp(entry->d_name, "..") == 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 continue; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 char child[1024]; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 int length = snprintf( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 child, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 sizeof(child), |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 "%s/%s", |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 path, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 entry->d_name); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 if (length < 0 || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 (size_t)length >= sizeof(child) || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 remove_tree(child, depth + 1) != 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 result = -1; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 break; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
124 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
125 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
126 closedir(directory); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
127 return result == 0 ? rmdir(path) : result; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
128 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
129 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
130 static bool set_limit(int resource, rlim_t value) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
131 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
132 struct rlimit limit = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
133 .rlim_cur = value, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
134 .rlim_max = value, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
135 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
136 return setrlimit(resource, &limit) == 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
137 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
138 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
139 static bool add_landlock_path_rule( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
140 int ruleset_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
141 const char *path, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
142 uint64_t access, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
143 bool required) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
144 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
145 int path_fd = open(path, O_PATH | O_CLOEXEC); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
146 if (path_fd < 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
147 return !required && errno == ENOENT; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
148 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
149 struct stat status; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
150 bool ok = fstat(path_fd, &status) == 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
151 if (ok && !S_ISDIR(status.st_mode)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
152 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
153 access &= LANDLOCK_ACCESS_FS_EXECUTE | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
154 LANDLOCK_ACCESS_FS_READ_FILE | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
155 LANDLOCK_ACCESS_FS_WRITE_FILE; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
156 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
157 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
158 struct landlock_path_beneath_attr rule = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
159 .allowed_access = access, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
160 .parent_fd = path_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 ok = syscall( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
164 SYS_landlock_add_rule, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
165 ruleset_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
166 LANDLOCK_RULE_PATH_BENEATH, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
167 &rule, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
168 0) == 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
169 close(path_fd); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
170 return ok; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
171 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
172 |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
173 static bool add_landlock_tree_rules( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
174 int ruleset_fd, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
175 const char *path, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
176 uint64_t access, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
177 unsigned depth) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
178 { |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
179 if (depth > 32 || |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
180 !add_landlock_path_rule(ruleset_fd, path, access, true)) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
181 return false; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
182 |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
183 struct stat status; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
184 if (lstat(path, &status) != 0) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
185 return false; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
186 if (!S_ISDIR(status.st_mode)) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
187 return true; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
188 |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
189 DIR *directory = opendir(path); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
190 if (!directory) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
191 return false; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
192 bool ok = true; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
193 struct dirent *entry; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
194 while (ok && (entry = readdir(directory)) != NULL) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
195 { |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
196 if (strcmp(entry->d_name, ".") == 0 || |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
197 strcmp(entry->d_name, "..") == 0) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
198 continue; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
199 char child[PATH_MAX]; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
200 int length = snprintf( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
201 child, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
202 sizeof(child), |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
203 "%s/%s", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
204 path, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
205 entry->d_name); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
206 ok = length >= 0 && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
207 (size_t)length < sizeof(child) && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
208 add_landlock_tree_rules( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
209 ruleset_fd, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
210 child, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
211 access, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
212 depth + 1); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
213 } |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
214 closedir(directory); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
215 return ok; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
216 } |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
217 |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
218 static bool apply_filesystem_sandbox( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
219 const char *job_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
220 const char *compiler, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
221 const char *cache_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
222 const char *fontconfig_sysroot) |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
223 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
224 int abi = syscall( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
225 SYS_landlock_create_ruleset, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
226 NULL, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
227 0, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
228 LANDLOCK_CREATE_RULESET_VERSION); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
229 if (abi < 1) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
230 return false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
231 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
232 uint64_t read_access = |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
233 LANDLOCK_ACCESS_FS_EXECUTE | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
234 LANDLOCK_ACCESS_FS_READ_FILE | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
235 LANDLOCK_ACCESS_FS_READ_DIR; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
236 uint64_t write_access = |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
237 LANDLOCK_ACCESS_FS_WRITE_FILE | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
238 LANDLOCK_ACCESS_FS_REMOVE_DIR | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
239 LANDLOCK_ACCESS_FS_REMOVE_FILE | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
240 LANDLOCK_ACCESS_FS_MAKE_CHAR | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
241 LANDLOCK_ACCESS_FS_MAKE_DIR | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
242 LANDLOCK_ACCESS_FS_MAKE_REG | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
243 LANDLOCK_ACCESS_FS_MAKE_SOCK | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
244 LANDLOCK_ACCESS_FS_MAKE_FIFO | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
245 LANDLOCK_ACCESS_FS_MAKE_BLOCK | |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
246 LANDLOCK_ACCESS_FS_MAKE_SYM; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
247 if (abi >= 2) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
248 write_access |= LANDLOCK_ACCESS_FS_REFER; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
249 if (abi >= 3) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
250 write_access |= LANDLOCK_ACCESS_FS_TRUNCATE; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
251 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
252 struct landlock_ruleset_attr ruleset = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
253 .handled_access_fs = read_access | write_access, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
254 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
255 int ruleset_fd = syscall( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
256 SYS_landlock_create_ruleset, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
257 &ruleset, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
258 sizeof(ruleset), |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
259 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
260 if (ruleset_fd < 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
261 return false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
262 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
263 bool ok = true; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
264 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
265 ok = add_landlock_path_rule( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
266 ruleset_fd, |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
267 compiler, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
268 LANDLOCK_ACCESS_FS_EXECUTE | LANDLOCK_ACCESS_FS_READ_FILE, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
269 true); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
270 if (ok) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
271 ok = add_landlock_tree_rules( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
272 ruleset_fd, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
273 cache_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
274 read_access | LANDLOCK_ACCESS_FS_MAKE_DIR, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
275 0); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
276 if (ok) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
277 ok = add_landlock_tree_rules( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
278 ruleset_fd, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
279 fontconfig_sysroot, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
280 read_access, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
281 0); |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
282 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
283 ok = add_landlock_path_rule( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
284 ruleset_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
285 "/dev/null", |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
286 LANDLOCK_ACCESS_FS_READ_FILE | LANDLOCK_ACCESS_FS_WRITE_FILE, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
287 true); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
288 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
289 ok = add_landlock_path_rule( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
290 ruleset_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
291 "/dev/urandom", |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
292 LANDLOCK_ACCESS_FS_READ_FILE, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
293 false); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
294 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
295 ok = add_landlock_path_rule( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
296 ruleset_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
297 job_directory, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
298 read_access | write_access, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
299 true); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
300 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
301 ok = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
302 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
303 ok = syscall( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
304 SYS_landlock_restrict_self, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
305 ruleset_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
306 0) == 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
307 close(ruleset_fd); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
308 return ok; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
309 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
310 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
311 static bool apply_network_sandbox(void) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
312 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
313 if (LATEX_AUDIT_ARCH == 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
314 return false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
315 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
316 struct sock_filter filters[64]; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
317 size_t count = 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
318 #define ADD_FILTER(value) filters[count++] = (struct sock_filter)value |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
319 #define DENY_SYSCALL(number) \ |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
320 do { \ |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
321 ADD_FILTER(BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, number, 0, 1)); \ |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
322 ADD_FILTER(BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | EPERM)); \ |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
323 } while (0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
324 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
325 ADD_FILTER(BPF_STMT( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
326 BPF_LD | BPF_W | BPF_ABS, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
327 offsetof(struct seccomp_data, arch))); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
328 ADD_FILTER(BPF_JUMP( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
329 BPF_JMP | BPF_JEQ | BPF_K, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
330 LATEX_AUDIT_ARCH, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
331 1, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
332 0)); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
333 ADD_FILTER(BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_KILL_PROCESS)); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
334 ADD_FILTER(BPF_STMT( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
335 BPF_LD | BPF_W | BPF_ABS, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
336 offsetof(struct seccomp_data, nr))); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
337 DENY_SYSCALL(__NR_socket); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
338 DENY_SYSCALL(__NR_socketpair); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
339 DENY_SYSCALL(__NR_connect); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
340 DENY_SYSCALL(__NR_accept); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
341 DENY_SYSCALL(__NR_accept4); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
342 DENY_SYSCALL(__NR_bind); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
343 DENY_SYSCALL(__NR_listen); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
344 DENY_SYSCALL(__NR_sendto); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
345 DENY_SYSCALL(__NR_recvfrom); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
346 DENY_SYSCALL(__NR_sendmsg); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
347 DENY_SYSCALL(__NR_recvmsg); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
348 ADD_FILTER(BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW)); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
349 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
350 struct sock_fprog program = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
351 .len = (unsigned short)count, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
352 .filter = filters, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
353 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
354 #undef DENY_SYSCALL |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
355 #undef ADD_FILTER |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
356 return prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &program) == 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
357 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
358 |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
359 static void configure_child_environment( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
360 const char *job_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
361 const char *cache_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
362 const char *fontconfig_sysroot) |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
363 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
364 clearenv(); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
365 setenv("HOME", job_directory, 1); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
366 setenv("TMPDIR", job_directory, 1); |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
367 setenv("XDG_CACHE_HOME", job_directory, 1); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
368 char tectonic_cache[PATH_MAX]; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
369 snprintf( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
370 tectonic_cache, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
371 sizeof(tectonic_cache), |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
372 "%s/tectonic", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
373 cache_directory); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
374 setenv("TECTONIC_CACHE_DIR", tectonic_cache, 1); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
375 setenv("FONTCONFIG_FILE", "fonts.conf", 1); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
376 setenv("FONTCONFIG_PATH", "/etc/fonts", 1); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
377 setenv("FONTCONFIG_SYSROOT", fontconfig_sysroot, 1); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
378 setenv("TECTONIC_UNTRUSTED_MODE", "1", 1); |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
379 setenv("SOURCE_DATE_EPOCH", "0", 1); |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
380 setenv("TZ", "UTC", 1); |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
381 setenv("LANG", "C.UTF-8", 1); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
382 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
383 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
384 static void close_inherited_descriptors(void) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
385 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
386 #ifdef SYS_close_range |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
387 if (syscall(SYS_close_range, 3U, UINT_MAX, 0) == 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
388 return; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
389 #endif |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
390 struct rlimit limit; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
391 rlim_t maximum = 65536; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
392 if (getrlimit(RLIMIT_NOFILE, &limit) == 0 && |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
393 limit.rlim_cur != RLIM_INFINITY && |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
394 limit.rlim_cur < maximum) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
395 maximum = limit.rlim_cur; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
396 for (int fd = 3; fd < (int)maximum; fd++) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
397 close(fd); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
398 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
399 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
400 static void run_compiler_child( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
401 const char *compiler, |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
402 const char *cache_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
403 const char *fontconfig_sysroot, |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
404 const char *job_directory, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
405 int output_fd) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
406 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
407 if (dup2(output_fd, STDOUT_FILENO) < 0 || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
408 dup2(output_fd, STDERR_FILENO) < 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
409 _exit(120); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
410 if (output_fd != STDOUT_FILENO && output_fd != STDERR_FILENO) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
411 close(output_fd); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
412 close_inherited_descriptors(); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
413 if (setpgid(0, 0) != 0 || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
414 prctl(PR_SET_PDEATHSIG, SIGKILL) != 0 || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
415 getppid() == 1) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
416 _exit(119); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
417 if (chdir(job_directory) != 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
418 _exit(121); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
419 |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
420 configure_child_environment( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
421 job_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
422 cache_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
423 fontconfig_sysroot); |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
424 if (!set_limit(RLIMIT_CPU, LATEX_CPU_TIMEOUT_SECONDS) || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
425 !set_limit(RLIMIT_AS, 768 * 1024 * 1024) || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
426 !set_limit(RLIMIT_FSIZE, LATEX_PDF_MAX_BYTES) || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
427 !set_limit(RLIMIT_NOFILE, 64) || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
428 !set_limit(RLIMIT_NPROC, 1)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
429 _exit(122); |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
430 if (!apply_filesystem_sandbox( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
431 job_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
432 compiler, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
433 cache_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
434 fontconfig_sysroot) || |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
435 !apply_network_sandbox()) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
436 _exit(123); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
437 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
438 char *const arguments[] = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
439 (char *)compiler, |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
440 "--untrusted", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
441 "--only-cached", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
442 "--chatter", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
443 "minimal", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
444 "--color", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
445 "never", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
446 "--reruns", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
447 "1", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
448 "--outdir", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
449 ".", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
450 "--bundle", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
451 TECTONIC_BUNDLE_URL, |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
452 "document.tex", |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
453 NULL, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
454 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
455 execv(compiler, arguments); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
456 _exit(errno == ENOENT ? 127 : 126); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
457 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
458 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
459 static double elapsed_seconds( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
460 const struct timespec *start, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
461 const struct timespec *now) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
462 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
463 return (double)(now->tv_sec - start->tv_sec) + |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
464 (double)(now->tv_nsec - start->tv_nsec) / 1000000000.0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
465 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
466 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
467 static int wait_for_compiler( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
468 pid_t child, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
469 int output_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
470 char *diagnostics, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
471 size_t diagnostics_size, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
472 bool *timed_out) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
473 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
474 int flags = fcntl(output_fd, F_GETFL, 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
475 if (flags >= 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
476 fcntl(output_fd, F_SETFL, flags | O_NONBLOCK); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
477 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
478 size_t used = 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
479 int child_status = 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
480 bool child_done = false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
481 struct timespec start; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
482 clock_gettime(CLOCK_MONOTONIC, &start); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
483 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
484 while (!child_done) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
485 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
486 char buffer[2048]; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
487 ssize_t count; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
488 while ((count = read(output_fd, buffer, sizeof(buffer))) > 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
489 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
490 size_t available = diagnostics_size - used - 1; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
491 size_t copy_size = (size_t)count < available ? (size_t)count : available; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
492 if (copy_size > 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
493 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
494 memcpy(diagnostics + used, buffer, copy_size); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
495 used += copy_size; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
496 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
497 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
498 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
499 pid_t waited = waitpid(child, &child_status, WNOHANG); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
500 if (waited == child) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
501 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
502 child_done = true; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
503 break; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
504 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
505 if (waited < 0 && errno != EINTR) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
506 break; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
507 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
508 struct timespec now; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
509 clock_gettime(CLOCK_MONOTONIC, &now); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
510 if (elapsed_seconds(&start, &now) >= LATEX_WALL_TIMEOUT_SECONDS) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
511 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
512 *timed_out = true; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
513 kill(-child, SIGKILL); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
514 while (waitpid(child, &child_status, 0) < 0 && errno == EINTR) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
515 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
516 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
517 child_done = true; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
518 break; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
519 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
520 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
521 struct pollfd poll_fd = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
522 .fd = output_fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
523 .events = POLLIN, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
524 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
525 poll(&poll_fd, 1, 50); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
526 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
527 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
528 char buffer[2048]; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
529 ssize_t count; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
530 while ((count = read(output_fd, buffer, sizeof(buffer))) > 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
531 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
532 size_t available = diagnostics_size - used - 1; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
533 size_t copy_size = (size_t)count < available ? (size_t)count : available; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
534 if (copy_size > 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
535 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
536 memcpy(diagnostics + used, buffer, copy_size); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
537 used += copy_size; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
538 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
539 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
540 diagnostics[used] = '\0'; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
541 kill(-child, SIGKILL); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
542 return child_status; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
543 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
544 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
545 static bool read_pdf( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
546 const char *path, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
547 uint8_t **data, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
548 size_t *size) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
549 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
550 int fd = open(path, O_RDONLY | O_CLOEXEC | O_NOFOLLOW); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
551 if (fd < 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
552 return false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
553 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
554 struct stat status; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
555 bool ok = fstat(fd, &status) == 0 && |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
556 S_ISREG(status.st_mode) && |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
557 status.st_size > 4 && |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
558 status.st_size <= LATEX_PDF_MAX_BYTES; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
559 uint8_t *content = NULL; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
560 if (ok) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
561 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
562 content = malloc((size_t)status.st_size); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
563 ok = content != NULL; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
564 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
565 size_t offset = 0; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
566 while (ok && offset < (size_t)status.st_size) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
567 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
568 ssize_t count = read( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
569 fd, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
570 content + offset, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
571 (size_t)status.st_size - offset); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
572 if (count < 0 && errno == EINTR) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
573 continue; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
574 if (count <= 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
575 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
576 ok = false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
577 break; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
578 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
579 offset += (size_t)count; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
580 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
581 close(fd); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
582 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
583 if (!ok || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
584 memcmp(content, "%PDF-", 5) != 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
585 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
586 free(content); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
587 return false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
588 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
589 *data = content; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
590 *size = offset; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
591 return true; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
592 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
593 |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
594 static bool resolve_runtime_path( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
595 const char *relative_path, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
596 char resolved[PATH_MAX]) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
597 { |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
598 if (realpath(relative_path, resolved)) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
599 return true; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
600 |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
601 const char *runfiles = getenv("RUNFILES_DIR"); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
602 const char *workspace = getenv("TEST_WORKSPACE"); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
603 char candidate[PATH_MAX]; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
604 if (runfiles && workspace) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
605 { |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
606 int length = snprintf( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
607 candidate, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
608 sizeof(candidate), |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
609 "%s/%s/%s", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
610 runfiles, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
611 workspace, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
612 relative_path); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
613 if (length >= 0 && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
614 (size_t)length < sizeof(candidate) && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
615 realpath(candidate, resolved)) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
616 return true; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
617 } |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
618 |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
619 char executable[PATH_MAX]; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
620 ssize_t executable_length = readlink( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
621 "/proc/self/exe", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
622 executable, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
623 sizeof(executable) - 1); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
624 if (executable_length <= 0) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
625 return false; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
626 executable[executable_length] = '\0'; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
627 |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
628 char *last_slash = strrchr(executable, '/'); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
629 if (last_slash) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
630 { |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
631 *last_slash = '\0'; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
632 int length = snprintf( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
633 candidate, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
634 sizeof(candidate), |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
635 "%s/%s", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
636 executable, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
637 relative_path); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
638 if (length >= 0 && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
639 (size_t)length < sizeof(candidate) && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
640 realpath(candidate, resolved)) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
641 return true; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
642 } |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
643 |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
644 char *package = strstr(executable, "/mrjunejune/"); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
645 if (!package) |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
646 return false; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
647 *package = '\0'; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
648 int length = snprintf( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
649 candidate, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
650 sizeof(candidate), |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
651 "%s/%s", |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
652 executable, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
653 relative_path); |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
654 return length >= 0 && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
655 (size_t)length < sizeof(candidate) && |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
656 realpath(candidate, resolved) != NULL; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
657 } |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
658 |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
659 Latex_Render_Result Latex_Render(const uint8_t *source, size_t source_size) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
660 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
661 if (!source || source_size == 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
662 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
663 LATEX_RENDER_INVALID_INPUT, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
664 "LaTeX source is required."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
665 if (source_size > LATEX_SOURCE_MAX_BYTES) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
666 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
667 LATEX_RENDER_INVALID_INPUT, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
668 "LaTeX source exceeds the 64 KiB limit."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
669 if (memchr(source, '\0', source_size)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
670 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
671 LATEX_RENDER_INVALID_INPUT, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
672 "LaTeX source cannot contain NUL bytes."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
673 |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
674 char compiler[PATH_MAX]; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
675 char cache_directory[PATH_MAX]; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
676 char fontconfig_sysroot[PATH_MAX]; |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
677 if (!resolve_runtime_path(TECTONIC_COMPILER_PATH, compiler) || |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
678 !resolve_runtime_path(TECTONIC_CACHE_PATH, cache_directory) || |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
679 !resolve_runtime_path( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
680 TECTONIC_FONTCONFIG_SYSROOT_PATH, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
681 fontconfig_sysroot) || |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
682 access(compiler, X_OK) != 0) |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
683 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
684 LATEX_RENDER_COMPILER_UNAVAILABLE, |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
685 "The Bazel Tectonic runtime is unavailable."); |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
686 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
687 char job_directory[] = "/tmp/mrjunejune-latex-XXXXXX"; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
688 if (!mkdtemp(job_directory)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
689 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
690 LATEX_RENDER_INTERNAL_ERROR, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
691 "Unable to create the LaTeX workspace."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
692 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
693 char source_path[512]; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
694 snprintf( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
695 source_path, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
696 sizeof(source_path), |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
697 "%s/document.tex", |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
698 job_directory); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
699 int source_fd = open( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
700 source_path, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
701 O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC | O_NOFOLLOW, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
702 0600); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
703 if (source_fd < 0 || !write_all(source_fd, source, source_size)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
704 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
705 if (source_fd >= 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
706 close(source_fd); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
707 remove_tree(job_directory, 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
708 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
709 LATEX_RENDER_INTERNAL_ERROR, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
710 "Unable to write the LaTeX source."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
711 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
712 close(source_fd); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
713 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
714 int output_pipe[2]; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
715 if (pipe2(output_pipe, O_CLOEXEC) != 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
716 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
717 remove_tree(job_directory, 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
718 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
719 LATEX_RENDER_INTERNAL_ERROR, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
720 "Unable to capture compiler output."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
721 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
722 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
723 pid_t child = fork(); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
724 if (child < 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
725 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
726 close(output_pipe[0]); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
727 close(output_pipe[1]); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
728 remove_tree(job_directory, 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
729 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
730 LATEX_RENDER_INTERNAL_ERROR, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
731 "Unable to start the LaTeX compiler."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
732 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
733 if (child == 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
734 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
735 close(output_pipe[0]); |
|
247
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
736 run_compiler_child( |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
737 compiler, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
738 cache_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
739 fontconfig_sysroot, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
740 job_directory, |
|
70f2a3dafc1c
[build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
741 output_pipe[1]); |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
742 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
743 setpgid(child, child); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
744 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
745 close(output_pipe[1]); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
746 char *diagnostics = calloc(1, LATEX_DIAGNOSTICS_MAX_BYTES + 1); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
747 if (!diagnostics) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
748 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
749 kill(-child, SIGKILL); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
750 waitpid(child, NULL, 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
751 close(output_pipe[0]); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
752 remove_tree(job_directory, 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
753 return result_with_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
754 LATEX_RENDER_INTERNAL_ERROR, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
755 "Unable to allocate compiler diagnostics."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
756 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
757 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
758 bool timed_out = false; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
759 int child_status = wait_for_compiler( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
760 child, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
761 output_pipe[0], |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
762 diagnostics, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
763 LATEX_DIAGNOSTICS_MAX_BYTES + 1, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
764 &timed_out); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
765 close(output_pipe[0]); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
766 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
767 Latex_Render_Result result = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
768 .status = LATEX_RENDER_INTERNAL_ERROR, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
769 .diagnostics = diagnostics, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
770 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
771 if (timed_out) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
772 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
773 result.status = LATEX_RENDER_TIMEOUT; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
774 free(result.diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
775 result.diagnostics = duplicate_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
776 "Compilation exceeded the 8 second limit."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
777 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
778 else if (WIFEXITED(child_status) && WEXITSTATUS(child_status) == 127) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
779 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
780 result.status = LATEX_RENDER_COMPILER_UNAVAILABLE; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
781 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
782 else if (WIFEXITED(child_status) && WEXITSTATUS(child_status) == 123) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
783 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
784 result.status = LATEX_RENDER_SANDBOX_ERROR; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
785 free(result.diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
786 result.diagnostics = duplicate_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
787 "The server could not apply the LaTeX security sandbox."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
788 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
789 else if (WIFSIGNALED(child_status) && |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
790 (WTERMSIG(child_status) == SIGXCPU || |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
791 WTERMSIG(child_status) == SIGKILL)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
792 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
793 result.status = LATEX_RENDER_TIMEOUT; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
794 free(result.diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
795 result.diagnostics = duplicate_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
796 "Compilation exceeded its CPU or memory limit."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
797 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
798 else if (!WIFEXITED(child_status) || WEXITSTATUS(child_status) != 0) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
799 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
800 result.status = LATEX_RENDER_COMPILE_ERROR; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
801 if (!result.diagnostics[0]) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
802 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
803 free(result.diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
804 result.diagnostics = duplicate_message("LaTeX compilation failed."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
805 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
806 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
807 else |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
808 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
809 char pdf_path[512]; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
810 snprintf(pdf_path, sizeof(pdf_path), "%s/document.pdf", job_directory); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
811 if (read_pdf(pdf_path, &result.pdf_data, &result.pdf_size)) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
812 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
813 result.status = LATEX_RENDER_OK; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
814 free(result.diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
815 result.diagnostics = NULL; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
816 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
817 else |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
818 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
819 result.status = LATEX_RENDER_INTERNAL_ERROR; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
820 free(result.diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
821 result.diagnostics = duplicate_message( |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
822 "The compiler did not produce a valid PDF."); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
823 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
824 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
825 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
826 remove_tree(job_directory, 0); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
827 return result; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
828 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
829 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
830 void Latex_Render_Result_Destroy(Latex_Render_Result *result) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
831 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
832 if (!result) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
833 return; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
834 free(result->pdf_data); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
835 free(result->diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
836 memset(result, 0, sizeof(*result)); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
837 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
838 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
839 #else |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
840 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
841 #include <stdlib.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
842 #include <string.h> |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
843 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
844 Latex_Render_Result Latex_Render(const uint8_t *source, size_t source_size) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
845 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
846 (void)source; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
847 (void)source_size; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
848 const char *message = |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
849 "The LaTeX security sandbox is only available on Linux."; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
850 Latex_Render_Result result = { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
851 .status = LATEX_RENDER_SANDBOX_ERROR, |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
852 .diagnostics = malloc(strlen(message) + 1), |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
853 }; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
854 if (result.diagnostics) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
855 strcpy(result.diagnostics, message); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
856 return result; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
857 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
858 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
859 void Latex_Render_Result_Destroy(Latex_Render_Result *result) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
860 { |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
861 if (!result) |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
862 return; |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
863 free(result->pdf_data); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
864 free(result->diagnostics); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
865 memset(result, 0, sizeof(*result)); |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
866 } |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
867 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
868 #endif |