diff options
| author | David Phillips <dbphillipsnz@gmail.com> | 2015-06-19 23:42:15 +1200 |
|---|---|---|
| committer | Markus Teich <markus.teich@stusta.mhn.de> | 2015-07-06 11:15:07 +0200 |
| commit | 0edbd2e0164a8c6cbad415e38083469041f29996 (patch) | |
| tree | 3f208ad6cbf0f43cba4b50d8d632d5f95624dc76 | |
| parent | 754195f8d75586e23d1cc69cad00710802e0cb5d (diff) | |
Slightly safer OOM killer disablement in linux
| -rw-r--r-- | slock.c | 13 |
1 files changed, 12 insertions, 1 deletions
| @@ -60,16 +60,27 @@ die(const char *errstr, ...) | |||
| 60 | 60 | ||
| 61 | #ifdef __linux__ | 61 | #ifdef __linux__ |
| 62 | #include <fcntl.h> | 62 | #include <fcntl.h> |
| 63 | #include <linux/oom.h> | ||
| 63 | 64 | ||
| 64 | static void | 65 | static void |
| 65 | dontkillme(void) | 66 | dontkillme(void) |
| 66 | { | 67 | { |
| 67 | int fd; | 68 | int fd; |
| 69 | int length; | ||
| 70 | char value[64]; | ||
| 68 | 71 | ||
| 69 | fd = open("/proc/self/oom_score_adj", O_WRONLY); | 72 | fd = open("/proc/self/oom_score_adj", O_WRONLY); |
| 70 | if (fd < 0 && errno == ENOENT) | 73 | if (fd < 0 && errno == ENOENT) |
| 71 | return; | 74 | return; |
| 72 | if (fd < 0 || write(fd, "-1000\n", 6) != 6 || close(fd) != 0) | 75 | |
| 76 | /* convert OOM_SCORE_ADJ_MIN to string for writing */ | ||
| 77 | length = snprintf(value, sizeof(value), "%d\n", OOM_SCORE_ADJ_MIN); | ||
| 78 | |||
| 79 | /* bail on truncation */ | ||
| 80 | if (length >= sizeof(value)) | ||
| 81 | die("buffer too small\n"); | ||
| 82 | |||
| 83 | if (fd < 0 || write(fd, value, length) != length || close(fd) != 0) | ||
| 73 | die("cannot disable the out-of-memory killer for this process\n"); | 84 | die("cannot disable the out-of-memory killer for this process\n"); |
| 74 | } | 85 | } |
| 75 | #endif | 86 | #endif |
