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