summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-04-04 11:02:11 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-04-12 11:44:56 +0200
commit41f6e627d7cfdf1ea50d5adbd7e118589dbcf8db (patch)
tree979f9a42211a4abbad46950b6e069d3f109f68de
parentfdeea3f4f1c0f78f1014582135d047265098fb82 (diff)
downloadsystemd-41f6e627d7cfdf1ea50d5adbd7e118589dbcf8db.tar.gz
Make fopen_temporary and fopen_temporary_label unlocked
This is partially a refactoring, but also makes many more places use unlocked operations implicitly, i.e. all users of fopen_temporary(). AFAICT, the uses are always for short-lived files which are not shared externally, and are just used within the same context. Locking is not necessary.
-rw-r--r--coccinelle/fopen-unlocked.cocci14
-rw-r--r--src/basic/cgroup-util.c1
-rw-r--r--src/basic/env-file.c3
-rw-r--r--src/basic/fileio.c11
-rw-r--r--src/basic/mountpoint-util.c1
-rw-r--r--src/basic/process-util.c1
-rw-r--r--src/basic/tmpfile-util.c7
-rw-r--r--src/core/dbus-service.c1
-rw-r--r--src/fstab-generator/fstab-generator.c1
-rw-r--r--src/libsystemd-network/sd-dhcp-lease.c2
-rw-r--r--src/locale/keymap-util.c2
-rw-r--r--src/login/logind-seat.c2
-rw-r--r--src/login/logind-session.c2
-rw-r--r--src/login/logind-user.c2
-rw-r--r--src/machine/machine.c2
-rw-r--r--src/network/networkd-link.c2
-rw-r--r--src/network/networkd-manager.c2
-rw-r--r--src/resolve/resolved-link.c2
-rw-r--r--src/resolve/resolved-resolv-conf.c3
-rw-r--r--src/shared/generator.c14
-rw-r--r--src/shared/mount-util.c1
21 files changed, 31 insertions, 45 deletions
diff --git a/coccinelle/fopen-unlocked.cocci b/coccinelle/fopen-unlocked.cocci
index 93b993dd55..e6f2bc5681 100644
--- a/coccinelle/fopen-unlocked.cocci
+++ b/coccinelle/fopen-unlocked.cocci
@@ -35,3 +35,17 @@ expression f, path, options;
+ return -ESRCH;
+ if (r < 0)
+ return r;
+@@
+expression f, path, p;
+@@
+ r = fopen_temporary(path, &f, &p);
+ if (r < 0)
+ return ...;
+- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
+@@
+expression f, g, path, p;
+@@
+ r = fopen_temporary_label(path, g, &f, &p);
+ if (r < 0)
+ return ...;
+- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c
index 11b4e3fce1..210089688b 100644
--- a/src/basic/cgroup-util.c
+++ b/src/basic/cgroup-util.c
@@ -6,7 +6,6 @@
#include <limits.h>
#include <signal.h>
#include <stddef.h>
-#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
diff --git a/src/basic/env-file.c b/src/basic/env-file.c
index a1f1308a54..83767b0a24 100644
--- a/src/basic/env-file.c
+++ b/src/basic/env-file.c
@@ -1,7 +1,5 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
-#include <stdio_ext.h>
-
#include "alloc-util.h"
#include "env-file.h"
#include "env-util.h"
@@ -545,7 +543,6 @@ int write_env_file(const char *fname, char **l) {
if (r < 0)
return r;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod_umask(fileno(f), 0644);
STRV_FOREACH(i, l)
diff --git a/src/basic/fileio.c b/src/basic/fileio.c
index 4599440b45..2318f407b8 100644
--- a/src/basic/fileio.c
+++ b/src/basic/fileio.c
@@ -108,7 +108,6 @@ static int write_string_file_atomic(
if (r < 0)
return r;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod_umask(fileno(f), 0644);
r = write_string_stream_ts(f, line, flags, ts);
@@ -154,11 +153,9 @@ int write_string_file_ts(
assert(!ts);
if (flags & WRITE_STRING_FILE_CREATE) {
- f = fopen(fn, "we");
- if (!f) {
- r = -errno;
+ r = fopen_unlocked(fn, "we", &f);
+ if (r < 0)
goto fail;
- }
} else {
int fd;
@@ -176,9 +173,9 @@ int write_string_file_ts(
safe_close(fd);
goto fail;
}
- }
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
+ (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
+ }
if (flags & WRITE_STRING_FILE_DISABLE_BUFFER)
setvbuf(f, NULL, _IONBF, 0);
diff --git a/src/basic/mountpoint-util.c b/src/basic/mountpoint-util.c
index 48494320fd..5ac9293167 100644
--- a/src/basic/mountpoint-util.c
+++ b/src/basic/mountpoint-util.c
@@ -2,7 +2,6 @@
#include <errno.h>
#include <fcntl.h>
-#include <stdio_ext.h>
#include <sys/mount.h>
#include "alloc-util.h"
diff --git a/src/basic/process-util.c b/src/basic/process-util.c
index 568f400d97..3dc3534e1a 100644
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -8,7 +8,6 @@
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
-#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
diff --git a/src/basic/tmpfile-util.c b/src/basic/tmpfile-util.c
index bc92d6a6de..260443a1d6 100644
--- a/src/basic/tmpfile-util.c
+++ b/src/basic/tmpfile-util.c
@@ -1,5 +1,7 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
+#include <stdio.h>
+#include <stdio_ext.h>
#include <sys/mman.h>
#include "alloc-util.h"
@@ -37,6 +39,9 @@ int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
return -errno;
}
+ /* This assumes that returned FILE object is short-lived and used within the same single-threaded
+ * context and never shared externally, hence locking is not necessary. */
+
f = fdopen(fd, "w");
if (!f) {
unlink_noerrno(t);
@@ -45,6 +50,8 @@ int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
return -errno;
}
+ (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
+
*_f = f;
*_temp_path = t;
diff --git a/src/core/dbus-service.c b/src/core/dbus-service.c
index 0f563a6625..4e6709c42e 100644
--- a/src/core/dbus-service.c
+++ b/src/core/dbus-service.c
@@ -1,6 +1,5 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
-#include <stdio_ext.h>
#include <fcntl.h>
#include "alloc-util.h"
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index d35f2f993e..28ae48d551 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -5,7 +5,6 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
-#include <stdio_ext.h>
#include "alloc-util.h"
#include "fd-util.h"
diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c
index a16314a9d3..c089b4278b 100644
--- a/src/libsystemd-network/sd-dhcp-lease.c
+++ b/src/libsystemd-network/sd-dhcp-lease.c
@@ -6,7 +6,6 @@
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
-#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
@@ -832,7 +831,6 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
if (r < 0)
goto fail;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fprintf(f,
diff --git a/src/locale/keymap-util.c b/src/locale/keymap-util.c
index b8bd181c16..e238e5a124 100644
--- a/src/locale/keymap-util.c
+++ b/src/locale/keymap-util.c
@@ -1,7 +1,6 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include <errno.h>
-#include <stdio_ext.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -423,7 +422,6 @@ int x11_write_data(Context *c) {
if (r < 0)
return r;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fputs("# Written by systemd-localed(8), read by systemd-localed and Xorg. It's\n"
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index b4904c37d5..f5ffb68238 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -2,7 +2,6 @@
#include <errno.h>
#include <fcntl.h>
-#include <stdio_ext.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
@@ -97,7 +96,6 @@ int seat_save(Seat *s) {
if (r < 0)
goto fail;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fprintf(f,
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 3d3bc8ab1c..f1efeb0e01 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -5,7 +5,6 @@
#include <linux/kd.h>
#include <linux/vt.h>
#include <signal.h>
-#include <stdio_ext.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
@@ -214,7 +213,6 @@ int session_save(Session *s) {
if (r < 0)
goto fail;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fprintf(f,
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index 045b6f0e17..8356a9089a 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -3,7 +3,6 @@
#include <errno.h>
#include <string.h>
#include <unistd.h>
-#include <stdio_ext.h>
#include "alloc-util.h"
#include "bus-common-errors.h"
@@ -162,7 +161,6 @@ static int user_save_internal(User *u) {
if (r < 0)
goto fail;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fprintf(f,
diff --git a/src/machine/machine.c b/src/machine/machine.c
index 84454ddd86..b916d038d7 100644
--- a/src/machine/machine.c
+++ b/src/machine/machine.c
@@ -3,7 +3,6 @@
#include <errno.h>
#include <string.h>
#include <unistd.h>
-#include <stdio_ext.h>
#include <sys/stat.h>
#include "sd-messages.h"
@@ -126,7 +125,6 @@ int machine_save(Machine *m) {
if (r < 0)
goto fail;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fprintf(f,
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 3e334c8d29..4846b13a8b 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -4,7 +4,6 @@
#include <linux/if.h>
#include <linux/can/netlink.h>
#include <unistd.h>
-#include <stdio_ext.h>
#include "alloc-util.h"
#include "bus-util.h"
@@ -4034,7 +4033,6 @@ int link_save(Link *link) {
if (r < 0)
goto fail;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fprintf(f,
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index 9075b0a14b..677f66a478 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -3,7 +3,6 @@
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/fib_rules.h>
-#include <stdio_ext.h>
#include <unistd.h>
#include "sd-daemon.h"
@@ -1189,7 +1188,6 @@ static int manager_save(Manager *m) {
if (r < 0)
return r;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fprintf(f,
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
index 50f9309f10..f65ce64d17 100644
--- a/src/resolve/resolved-link.c
+++ b/src/resolve/resolved-link.c
@@ -2,7 +2,6 @@
#include <net/if.h>
#include <linux/if.h>
-#include <stdio_ext.h>
#include <unistd.h>
#include "sd-network.h"
@@ -1178,7 +1177,6 @@ int link_save_user(Link *l) {
if (r < 0)
goto fail;
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f), 0644);
fputs("# This is private data. Do not parse.\n", f);
diff --git a/src/resolve/resolved-resolv-conf.c b/src/resolve/resolved-resolv-conf.c
index 0435791ea0..dfc9a948e3 100644
--- a/src/resolve/resolved-resolv-conf.c
+++ b/src/resolve/resolved-resolv-conf.c
@@ -1,7 +1,6 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include <resolv.h>
-#include <stdio_ext.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
@@ -359,14 +358,12 @@ int manager_write_resolv_conf(Manager *m) {
if (r < 0)
return log_warning_errno(r, "Failed to open private resolv.conf file for writing: %m");
- (void) __fsetlocking(f_uplink, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f_uplink), 0644);
r = fopen_temporary_label(PRIVATE_STUB_RESOLV_CONF, PRIVATE_STUB_RESOLV_CONF, &f_stub, &temp_path_stub);
if (r < 0)
return log_warning_errno(r, "Failed to open private stub-resolv.conf file for writing: %m");
- (void) __fsetlocking(f_stub, FSETLOCKING_BYCALLER);
(void) fchmod(fileno(f_stub), 0644);
r = write_uplink_resolv_conf_contents(f_uplink, dns, domains);
diff --git a/src/shared/generator.c b/src/shared/generator.c
index ed7f037e91..403c2a6737 100644
--- a/src/shared/generator.c
+++ b/src/shared/generator.c
@@ -1,7 +1,6 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include <errno.h>
-#include <stdio_ext.h>
#include <unistd.h>
#include "alloc-util.h"
@@ -30,23 +29,22 @@ int generator_open_unit_file(
const char *unit;
FILE *f;
+ int r;
unit = strjoina(dest, "/", name);
- f = fopen(unit, "wxe");
- if (!f) {
- if (source && errno == EEXIST)
- return log_error_errno(errno,
+ r = fopen_unlocked(unit, "wxe", &f);
+ if (r < 0) {
+ if (source && r == -EEXIST)
+ return log_error_errno(r,
"Failed to create unit file %s, as it already exists. Duplicate entry in %s?",
unit, source);
else
- return log_error_errno(errno,
+ return log_error_errno(r,
"Failed to create unit file %s: %m",
unit);
}
- (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
-
fprintf(f,
"# Automatically generated by %s\n\n",
program_invocation_short_name);
diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c
index 1b50716731..680c4522ad 100644
--- a/src/shared/mount-util.c
+++ b/src/shared/mount-util.c
@@ -1,7 +1,6 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include <errno.h>
-#include <stdio_ext.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mount.h>