]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Add fmemopen_unlocked() and use unlocked ops in fuzzers and some other tests 12217/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 4 Apr 2019 10:24:38 +0000 (12:24 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 12 Apr 2019 09:44:57 +0000 (11:44 +0200)
This might make things marginially faster. I didn't benchmark though.

14 files changed:
src/basic/fileio.c
src/basic/fileio.h
src/fuzz/fuzz-bus-message.c
src/fuzz/fuzz-env-file.c
src/fuzz/fuzz-hostname-util.c
src/fuzz/fuzz-json.c
src/fuzz/fuzz-nspawn-oci.c
src/fuzz/fuzz-nspawn-settings.c
src/fuzz/fuzz-unit-file.c
src/libsystemd/sd-bus/test-bus-marshal.c
src/portable/portablectl.c
src/shared/bootspec.c
src/test/test-fileio.c
src/test/test-json.c

index 99efc2410c9ddcb7ac7050faed2b0964830c47d2..85a49b1f9ee05d8a7f4fa95acfa323978b00473e 100644 (file)
@@ -65,6 +65,16 @@ FILE* open_memstream_unlocked(char **ptr, size_t *sizeloc) {
         return f;
 }
 
+FILE* fmemopen_unlocked(void *buf, size_t size, const char *mode) {
+        FILE *f = fmemopen(buf, size, mode);
+        if (!f)
+                return NULL;
+
+        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
+
+        return f;
+}
+
 int write_string_stream_ts(
                 FILE *f,
                 const char *line,
index fe5c8277de62bdadce9c5cf5af2132562df84df7..ffe900b486b3612dd67c94c70f0040e4874cbc76 100644 (file)
@@ -36,6 +36,7 @@ typedef enum {
 int fopen_unlocked(const char *path, const char *options, FILE **ret);
 int fdopen_unlocked(int fd, const char *options, FILE **ret);
 FILE* open_memstream_unlocked(char **ptr, size_t *sizeloc);
+FILE* fmemopen_unlocked(void *buf, size_t size, const char *mode);
 
 int write_string_stream_ts(FILE *f, const char *line, WriteStringFileFlags flags, struct timespec *ts);
 static inline int write_string_stream(FILE *f, const char *line, WriteStringFileFlags flags) {
index 9842c62a6f9d65e46c439909088abdf7abeca697..aca82edad9628b465fa0c61b077c34c39da69ad7 100644 (file)
@@ -1,13 +1,11 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include <errno.h>
-#include <stdio.h>
-
 #include "alloc-util.h"
 #include "bus-dump.h"
 #include "bus-message.h"
 #include "env-util.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "fuzz.h"
 
 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
@@ -36,7 +34,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         TAKE_PTR(buffer);
 
         if (getenv_bool("SYSTEMD_FUZZ_OUTPUT") <= 0)
-                assert_se(g = open_memstream(&out, &out_size));
+                assert_se(g = open_memstream_unlocked(&out, &out_size));
 
         bus_message_dump(m, g ?: stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
 
index 3c8ffaa7b235ba8bc8be08e3428af745d724c6f3..d945dfc02c5a7c01e73ecdb9b19a09d7e5deb386 100644 (file)
@@ -1,9 +1,10 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include <errno.h>
+#include <stdio.h>
 
 #include "alloc-util.h"
 #include "env-file.h"
+#include "fileio.h"
 #include "fd-util.h"
 #include "fuzz.h"
 #include "strv.h"
@@ -15,7 +16,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         if (size == 0 || size > 65535)
                 return 0;
 
-        f = fmemopen((char*) data, size, "re");
+        f = fmemopen_unlocked((char*) data, size, "re");
         assert_se(f);
 
         /* We don't want to fill the logs with messages about parse errors.
index deaf8112ba2186a72501a09a2b5dfb10c6e6face..2130a4a81170aea83cb1aab1e3436e2e8d7b23f2 100644 (file)
@@ -1,9 +1,8 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include <errno.h>
-
 #include "alloc-util.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "fuzz.h"
 #include "hostname-util.h"
 
@@ -14,7 +13,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         if (size == 0)
                 return 0;
 
-        f = fmemopen((char*) data, size, "re");
+        f = fmemopen_unlocked((char*) data, size, "re");
         assert_se(f);
 
         /* We don't want to fill the logs with messages about parse errors.
index 3aa9d089e687698d724d63cbfb3021b39ea71724..ce7b69dbb99f639600b625d3b359e3290503ea8a 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
 #include "alloc-util.h"
+#include "fileio.h"
 #include "fd-util.h"
 #include "fuzz.h"
 #include "json.h"
@@ -14,13 +15,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         if (size == 0)
                 return 0;
 
-        f = fmemopen((char*) data, size, "re");
+        f = fmemopen_unlocked((char*) data, size, "re");
         assert_se(f);
 
         if (json_parse_file(f, NULL, &v, NULL, NULL) < 0)
                 return 0;
 
-        g = open_memstream(&out, &out_size);
+        g = open_memstream_unlocked(&out, &out_size);
         assert_se(g);
 
         json_variant_dump(v, 0, g, NULL);
index f7b59f13ba87ba9167e1ae3cb2a638e421215bf3..004230eafe2a7c52ade002eb20bc7b54f9157e44 100644 (file)
@@ -1,9 +1,8 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include <errno.h>
-
 #include "alloc-util.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "fuzz.h"
 #include "nspawn-oci.h"
 
@@ -14,7 +13,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         if (size == 0)
                 return 0;
 
-        f = fmemopen((char*) data, size, "re");
+        f = fmemopen_unlocked((char*) data, size, "re");
         assert_se(f);
 
         /* We don't want to fill the logs with messages about parse errors.
index 6c81eb773a75e2facd405d8a956749ff8c9f052c..aa0a8225b47d7b8722b080554decbe2890743fff 100644 (file)
@@ -1,9 +1,8 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#include <errno.h>
-
 #include "alloc-util.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "fuzz.h"
 #include "nspawn-settings.h"
 
@@ -14,7 +13,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         if (size == 0)
                 return 0;
 
-        f = fmemopen((char*) data, size, "re");
+        f = fmemopen_unlocked((char*) data, size, "re");
         assert_se(f);
 
         /* We don't want to fill the logs with messages about parse errors.
index 84b1ea66ec4790fc7a8b71c6d4f6268d67178b88..d3993cf123f67c93f1a9f041e525a943c1c68295 100644 (file)
@@ -24,7 +24,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         if (size == 0)
                 return 0;
 
-        f = fmemopen((char*) data, size, "re");
+        f = fmemopen_unlocked((char*) data, size, "re");
         assert_se(f);
 
         if (read_line(f, LINE_MAX, &p) < 0)
@@ -75,7 +75,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
                             config_item_perf_lookup, load_fragment_gperf_lookup,
                             CONFIG_PARSE_ALLOW_INCLUDE, u);
 
-        g = open_memstream(&out, &out_size);
+        g = open_memstream_unlocked(&out, &out_size);
         assert_se(g);
 
         unit_dump(u, g, "");
index 1e9810ce4fb13b1ea14a52870552188530c7e7ea..ade16e532df3180bcf9c45911dc8f533e2743de9 100644 (file)
@@ -20,6 +20,7 @@
 #include "bus-util.h"
 #include "escape.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "log.h"
 #include "tests.h"
 #include "util.h"
@@ -189,7 +190,7 @@ int main(int argc, char *argv[]) {
 
         bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
 
-        ms = open_memstream(&first, &first_size);
+        ms = open_memstream_unlocked(&first, &first_size);
         bus_message_dump(m, ms, 0);
         fflush(ms);
         assert_se(!ferror(ms));
@@ -245,7 +246,7 @@ int main(int argc, char *argv[]) {
         bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
 
         fclose(ms);
-        ms = open_memstream(&second, &second_size);
+        ms = open_memstream_unlocked(&second, &second_size);
         bus_message_dump(m, ms, 0);
         fflush(ms);
         assert_se(!ferror(ms));
@@ -351,7 +352,7 @@ int main(int argc, char *argv[]) {
         assert_se(r >= 0);
 
         fclose(ms);
-        ms = open_memstream(&third, &third_size);
+        ms = open_memstream_unlocked(&third, &third_size);
         bus_message_dump(copy, ms, 0);
         fflush(ms);
         assert_se(!ferror(ms));
index bb6cebdf16d65e17e96431536bd1b7d47924c452..2c59f04eb5e700ffc2a0aa46d9a756fb933d9a06 100644 (file)
@@ -12,6 +12,7 @@
 #include "dirent-util.h"
 #include "env-file.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "format-table.h"
 #include "fs-util.h"
 #include "locale-util.h"
@@ -272,10 +273,9 @@ static int inspect_image(int argc, char *argv[], void *userdata) {
                 nl = true;
         } else {
                 _cleanup_free_ char *pretty_portable = NULL, *pretty_os = NULL;
-
                 _cleanup_fclose_ FILE *f;
 
-                f = fmemopen((void*) data, sz, "re");
+                f = fmemopen_unlocked((void*) data, sz, "re");
                 if (!f)
                         return log_error_errno(errno, "Failed to open /etc/os-release buffer: %m");
 
index 3bd14d7372324657aaf4bc064522690dbcd4a942..b2f8936038bf529cc5564d376140ee25903812e3 100644 (file)
@@ -298,7 +298,7 @@ static int boot_entry_load_unified(
         if (!k)
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Path is not below root: %s", path);
 
-        f = fmemopen((void*) osrelease, strlen(osrelease), "r");
+        f = fmemopen_unlocked((void*) osrelease, strlen(osrelease), "r");
         if (!f)
                 return log_error_errno(errno, "Failed to open os-release buffer: %m");
 
index 2ff5b9a69d5e5da3bd81578b42179e72f6863f13..cd1db3dd62cfaa6c3f431f910fc2407e936a3c50 100644 (file)
@@ -637,7 +637,7 @@ static void test_fgetc(void) {
         _cleanup_fclose_ FILE *f = NULL;
         char c;
 
-        f = fmemopen((void*) chars, sizeof(chars), "re");
+        f = fmemopen_unlocked((void*) chars, sizeof(chars), "re");
         assert_se(f);
 
         for (unsigned i = 0; i < sizeof(chars); i++) {
@@ -727,7 +727,7 @@ static void test_read_line_one_file(FILE *f) {
 static void test_read_line(void) {
         _cleanup_fclose_ FILE *f = NULL;
 
-        f = fmemopen((void*) buffer, sizeof(buffer), "re");
+        f = fmemopen_unlocked((void*) buffer, sizeof(buffer), "re");
         assert_se(f);
 
         test_read_line_one_file(f);
@@ -792,7 +792,7 @@ static void test_read_line4(void) {
                 _cleanup_fclose_ FILE *f = NULL;
                 _cleanup_free_ char *s = NULL;
 
-                assert_se(f = fmemopen((void*) eof_endings[i].string, eof_endings[i].length, "r"));
+                assert_se(f = fmemopen_unlocked((void*) eof_endings[i].string, eof_endings[i].length, "r"));
 
                 r = read_line(f, (size_t) -1, &s);
                 assert_se((size_t) r == eof_endings[i].length);
@@ -813,7 +813,7 @@ static void test_read_nul_string(void) {
         _cleanup_fclose_ FILE *f = NULL;
         _cleanup_free_ char *s = NULL;
 
-        assert_se(f = fmemopen((void*) test, sizeof(test)-1, "r"));
+        assert_se(f = fmemopen_unlocked((void*) test, sizeof(test)-1, "r"));
 
         assert_se(read_nul_string(f, LONG_LINE_MAX, &s) == 13 && streq_ptr(s, "string nr. 1"));
         s = mfree(s);
index 9b8a2a9422e1cc5a6808435866a0e799e54eb5d9..8bd6a7221cb1eb752d3642d3c6f554a37a70ff3a 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "json-internal.h"
 #include "json.h"
 #include "string-util.h"
@@ -358,7 +359,7 @@ static void test_source(void) {
                "%s"
                "--- original end ---\n", data);
 
-        assert_se(f = fmemopen((void*) data, strlen(data), "r"));
+        assert_se(f = fmemopen_unlocked((void*) data, strlen(data), "r"));
 
         assert_se(json_parse_file(f, "waldo", &v, NULL, NULL) >= 0);