mirror of https://gerrit.osmocom.org/libosmocore
Properly deal with sockaddr_un socket path length limitations.
In osmo_sock_unix_init(), add support for non-NUL-terminated unix socket paths and return an error if the supplied socket path exceeds the maximum socket path length supported by the operating system. Change-Id: I19d935e5e3dd7928e6e153c6f5ad7044de726016 Related: OS#2673
This commit is contained in:
parent
3953f41bbd
commit
896ff6db16
15
src/socket.c
15
src/socket.c
|
@ -605,22 +605,29 @@ int osmo_sock_unix_init(uint16_t type, uint8_t proto,
|
||||||
struct sockaddr_un local;
|
struct sockaddr_un local;
|
||||||
int sfd, rc, on = 1;
|
int sfd, rc, on = 1;
|
||||||
unsigned int namelen;
|
unsigned int namelen;
|
||||||
|
const size_t socket_path_len = strlen(socket_path);
|
||||||
|
|
||||||
if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) ==
|
if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) ==
|
||||||
(OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT))
|
(OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
local.sun_family = AF_UNIX;
|
local.sun_family = AF_UNIX;
|
||||||
osmo_strlcpy(local.sun_path, socket_path, sizeof(local.sun_path));
|
if (socket_path_len == sizeof(local.sun_path)) {
|
||||||
|
/* Handle corner-case where sun_path is not NUL-terminated. See the unix(7) man page. */
|
||||||
|
memcpy(local.sun_path, socket_path, sizeof(local.sun_path));
|
||||||
|
} else if (osmo_strlcpy(local.sun_path, socket_path, sizeof(local.sun_path)) >= sizeof(local.sun_path)) {
|
||||||
|
LOGP(DLGLOBAL, LOGL_ERROR, "Socket path exceeds maximum length of %zd bytes: %s\n",
|
||||||
|
sizeof(local.sun_path), socket_path);
|
||||||
|
return -ENOSPC;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(BSD44SOCKETS) || defined(__UNIXWARE__)
|
#if defined(BSD44SOCKETS) || defined(__UNIXWARE__)
|
||||||
local.sun_len = strlen(local.sun_path);
|
local.sun_len = socket_path_len;
|
||||||
#endif
|
#endif
|
||||||
#if defined(BSD44SOCKETS) || defined(SUN_LEN)
|
#if defined(BSD44SOCKETS) || defined(SUN_LEN)
|
||||||
namelen = SUN_LEN(&local);
|
namelen = SUN_LEN(&local);
|
||||||
#else
|
#else
|
||||||
namelen = strlen(local.sun_path) +
|
namelen = socket_path_len + offsetof(struct sockaddr_un, sun_path);
|
||||||
offsetof(struct sockaddr_un, sun_path);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sfd = socket(AF_UNIX, type, proto);
|
sfd = socket(AF_UNIX, type, proto);
|
||||||
|
|
Loading…
Reference in New Issue