summaryrefslogtreecommitdiff
path: root/src/shared/socket-netlink.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-09-09 23:49:51 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-09-10 00:46:44 +0200
commit08224f38acdf5e391dda43e4e004e4ddc5c00302 (patch)
tree3c7eb4bf60702d068395a6c67dff1d43c9dcf2fb /src/shared/socket-netlink.c
parenta73569f180dbb8690ae3b350b0609ac0f9705c55 (diff)
downloadsystemd-08224f38acdf5e391dda43e4e004e4ddc5c00302.tar.gz
Use sockaddr_un_set_path() in socket_address_parse()
Two functional changes: - "/" is now refused. The test is adjusted. - The trailing NUL is *not* included in the returned size for abstract size. The comments in sockaddr_un_set_path() indicate that this is the right thing to do, and the code in socket_address_parse() wasn't doing that.
Diffstat (limited to 'src/shared/socket-netlink.c')
-rw-r--r--src/shared/socket-netlink.c33
1 files changed, 7 insertions, 26 deletions
diff --git a/src/shared/socket-netlink.c b/src/shared/socket-netlink.c
index 76b68dfa1c..23970dbe55 100644
--- a/src/shared/socket-netlink.c
+++ b/src/shared/socket-netlink.c
@@ -62,37 +62,18 @@ int socket_address_parse(SocketAddress *a, const char *s) {
assert(a);
assert(s);
- if (*s == '/') {
+ if (IN_SET(*s, '/', '@')) {
/* AF_UNIX socket */
+ struct sockaddr_un un;
- size_t l = strlen(s);
- if (l >= sizeof(a->sockaddr.un.sun_path)) /* Note that we refuse non-NUL-terminated sockets when
- * parsing (the kernel itself is less strict here in what it
- * accepts) */
- return -EINVAL;
-
- *a = (SocketAddress) {
- .sockaddr.un.sun_family = AF_UNIX,
- .size = offsetof(struct sockaddr_un, sun_path) + l + 1,
- };
- memcpy(a->sockaddr.un.sun_path, s, l);
-
- } else if (*s == '@') {
- /* Abstract AF_UNIX socket */
-
- size_t l = strlen(s+1);
- if (l >= sizeof(a->sockaddr.un.sun_path) - 1) /* Note that we refuse non-NUL-terminated sockets here
- * when parsing, even though abstract namespace sockets
- * explicitly allow embedded NUL bytes and don't consider
- * them special. But it's simply annoying to debug such
- * sockets. */
- return -EINVAL;
+ r = sockaddr_un_set_path(&un, s);
+ if (r < 0)
+ return r;
*a = (SocketAddress) {
- .sockaddr.un.sun_family = AF_UNIX,
- .size = offsetof(struct sockaddr_un, sun_path) + 1 + l,
+ .sockaddr.un = un,
+ .size = r,
};
- memcpy(a->sockaddr.un.sun_path+1, s+1, l);
} else if (startswith(s, "vsock:")) {
/* AF_VSOCK socket in vsock:cid:port notation */