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.
This commit is contained in:
parent
a73569f180
commit
08224f38ac
|
@ -62,37 +62,18 @@ int socket_address_parse(SocketAddress *a, const char *s) {
|
||||||
assert(a);
|
assert(a);
|
||||||
assert(s);
|
assert(s);
|
||||||
|
|
||||||
if (*s == '/') {
|
if (IN_SET(*s, '/', '@')) {
|
||||||
/* AF_UNIX socket */
|
/* AF_UNIX socket */
|
||||||
|
struct sockaddr_un un;
|
||||||
|
|
||||||
size_t l = strlen(s);
|
r = sockaddr_un_set_path(&un, s);
|
||||||
if (l >= sizeof(a->sockaddr.un.sun_path)) /* Note that we refuse non-NUL-terminated sockets when
|
if (r < 0)
|
||||||
* parsing (the kernel itself is less strict here in what it
|
return r;
|
||||||
* accepts) */
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
*a = (SocketAddress) {
|
*a = (SocketAddress) {
|
||||||
.sockaddr.un.sun_family = AF_UNIX,
|
.sockaddr.un = un,
|
||||||
.size = offsetof(struct sockaddr_un, sun_path) + l + 1,
|
.size = r,
|
||||||
};
|
};
|
||||||
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;
|
|
||||||
|
|
||||||
*a = (SocketAddress) {
|
|
||||||
.sockaddr.un.sun_family = AF_UNIX,
|
|
||||||
.size = offsetof(struct sockaddr_un, sun_path) + 1 + l,
|
|
||||||
};
|
|
||||||
memcpy(a->sockaddr.un.sun_path+1, s+1, l);
|
|
||||||
|
|
||||||
} else if (startswith(s, "vsock:")) {
|
} else if (startswith(s, "vsock:")) {
|
||||||
/* AF_VSOCK socket in vsock:cid:port notation */
|
/* AF_VSOCK socket in vsock:cid:port notation */
|
||||||
|
|
|
@ -76,7 +76,7 @@ static void test_socket_address_parse(void) {
|
||||||
test_socket_address_parse_one("[::1]:1234%xxxxasdf", -ENODEV, 0, NULL);
|
test_socket_address_parse_one("[::1]:1234%xxxxasdf", -ENODEV, 0, NULL);
|
||||||
test_socket_address_parse_one("192.168.1.254:8888", 0, AF_INET, NULL);
|
test_socket_address_parse_one("192.168.1.254:8888", 0, AF_INET, NULL);
|
||||||
test_socket_address_parse_one("/foo/bar", 0, AF_UNIX, NULL);
|
test_socket_address_parse_one("/foo/bar", 0, AF_UNIX, NULL);
|
||||||
test_socket_address_parse_one("/", 0, AF_UNIX, NULL);
|
test_socket_address_parse_one("/", -EINVAL, 0, NULL);
|
||||||
test_socket_address_parse_one("@abstract", 0, AF_UNIX, NULL);
|
test_socket_address_parse_one("@abstract", 0, AF_UNIX, NULL);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue