summaryrefslogtreecommitdiff
path: root/src/basic/sysctl-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-09-15 09:20:49 +0200
committerLennart Poettering <lennart@poettering.net>2021-09-15 16:32:40 +0200
commitf9755203b972966d545bba7f3d257cf4c6a4f8a0 (patch)
tree28ea2e5c9ed5ad770d3f3da438e38b3477d27398 /src/basic/sysctl-util.c
parent6aebfec3a5b56f3f210a4b06bfb806089cbf95b7 (diff)
downloadsystemd-f9755203b972966d545bba7f3d257cf4c6a4f8a0.tar.gz
sysctl-util: modernize sysctl_read() a bit
Let's add similar path validation to sysctl_read() as we already have in sysctl_write(). Let's also drop the trailing newline from the returned string, like sysctl_read_ip_property() already does it. (I checked all users of this, they don't care)
Diffstat (limited to 'src/basic/sysctl-util.c')
-rw-r--r--src/basic/sysctl-util.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/basic/sysctl-util.c b/src/basic/sysctl-util.c
index a19f3e2649..9c81001e69 100644
--- a/src/basic/sysctl-util.c
+++ b/src/basic/sysctl-util.c
@@ -98,12 +98,23 @@ int sysctl_write_ip_property(int af, const char *ifname, const char *property, c
int sysctl_read(const char *property, char **ret) {
char *p;
+ int r;
assert(property);
- assert(ret);
p = strjoina("/proc/sys/", property);
- return read_full_virtual_file(p, ret, NULL);
+
+ path_simplify(p);
+ if (!path_is_normalized(p)) /* Filter out attempts to write to /proc/sys/../../…, just in case */
+ return -EINVAL;
+
+ r = read_full_virtual_file(p, ret, NULL);
+ if (r < 0)
+ return r;
+ if (ret)
+ delete_trailing_chars(*ret, NEWLINE);
+
+ return r;
}
int sysctl_read_ip_property(int af, const char *ifname, const char *property, char **ret) {