summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/basic/fileio.c10
-rw-r--r--src/basic/fileio.h1
-rw-r--r--src/fuzz/fuzz-bus-message.c6
-rw-r--r--src/fuzz/fuzz-env-file.c5
-rw-r--r--src/fuzz/fuzz-hostname-util.c5
-rw-r--r--src/fuzz/fuzz-json.c5
-rw-r--r--src/fuzz/fuzz-nspawn-oci.c5
-rw-r--r--src/fuzz/fuzz-nspawn-settings.c5
-rw-r--r--src/fuzz/fuzz-unit-file.c4
-rw-r--r--src/libsystemd/sd-bus/test-bus-marshal.c7
-rw-r--r--src/portable/portablectl.c4
-rw-r--r--src/shared/bootspec.c2
-rw-r--r--src/test/test-fileio.c8
-rw-r--r--src/test/test-json.c3
14 files changed, 40 insertions, 30 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c
index 99efc2410c..85a49b1f9e 100644
--- a/src/basic/fileio.c
+++ b/src/basic/fileio.c
@@ -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,
diff --git a/src/basic/fileio.h b/src/basic/fileio.h
index fe5c8277de..ffe900b486 100644
--- a/src/basic/fileio.h
+++ b/src/basic/fileio.h
@@ -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) {
diff --git a/src/fuzz/fuzz-bus-message.c b/src/fuzz/fuzz-bus-message.c
index 9842c62a6f..aca82edad9 100644
--- a/src/fuzz/fuzz-bus-message.c
+++ b/src/fuzz/fuzz-bus-message.c
@@ -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);
diff --git a/src/fuzz/fuzz-env-file.c b/src/fuzz/fuzz-env-file.c
index 3c8ffaa7b2..d945dfc02c 100644
--- a/src/fuzz/fuzz-env-file.c
+++ b/src/fuzz/fuzz-env-file.c
@@ -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.
diff --git a/src/fuzz/fuzz-hostname-util.c b/src/fuzz/fuzz-hostname-util.c
index deaf8112ba..2130a4a811 100644
--- a/src/fuzz/fuzz-hostname-util.c
+++ b/src/fuzz/fuzz-hostname-util.c
@@ -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.
diff --git a/src/fuzz/fuzz-json.c b/src/fuzz/fuzz-json.c
index 3aa9d089e6..ce7b69dbb9 100644
--- a/src/fuzz/fuzz-json.c
+++ b/src/fuzz/fuzz-json.c
@@ -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);
diff --git a/src/fuzz/fuzz-nspawn-oci.c b/src/fuzz/fuzz-nspawn-oci.c
index f7b59f13ba..004230eafe 100644
--- a/src/fuzz/fuzz-nspawn-oci.c
+++ b/src/fuzz/fuzz-nspawn-oci.c
@@ -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.
diff --git a/src/fuzz/fuzz-nspawn-settings.c b/src/fuzz/fuzz-nspawn-settings.c
index 6c81eb773a..aa0a8225b4 100644
--- a/src/fuzz/fuzz-nspawn-settings.c
+++ b/src/fuzz/fuzz-nspawn-settings.c
@@ -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.
diff --git a/src/fuzz/fuzz-unit-file.c b/src/fuzz/fuzz-unit-file.c
index 84b1ea66ec..d3993cf123 100644
--- a/src/fuzz/fuzz-unit-file.c
+++ b/src/fuzz/fuzz-unit-file.c
@@ -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, "");
diff --git a/src/libsystemd/sd-bus/test-bus-marshal.c b/src/libsystemd/sd-bus/test-bus-marshal.c
index 1e9810ce4f..ade16e532d 100644
--- a/src/libsystemd/sd-bus/test-bus-marshal.c
+++ b/src/libsystemd/sd-bus/test-bus-marshal.c
@@ -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));
diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c
index bb6cebdf16..2c59f04eb5 100644
--- a/src/portable/portablectl.c
+++ b/src/portable/portablectl.c
@@ -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");
diff --git a/src/shared/bootspec.c b/src/shared/bootspec.c
index 3bd14d7372..b2f8936038 100644
--- a/src/shared/bootspec.c
+++ b/src/shared/bootspec.c
@@ -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");
diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c
index 2ff5b9a69d..cd1db3dd62 100644
--- a/src/test/test-fileio.c
+++ b/src/test/test-fileio.c
@@ -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);
diff --git a/src/test/test-json.c b/src/test/test-json.c
index 9b8a2a9422..8bd6a7221c 100644
--- a/src/test/test-json.c
+++ b/src/test/test-json.c
@@ -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);