mirror of https://gerrit.osmocom.org/libosmocore
ensure unix socket paths are NUL-terminated for bind/connect
The unix(7) man page recommends that sun_path is NUL-terminated when struct sockaddr_un is passed to a bind() or connect() call. Non-NUL-terminated paths only need to be dealt with at the receiving end of a UNIX domain socket. Commit896ff6d
erroneously assumed otherwise. This commit almost reverts 896ff6d: It only leaves the added osmo_strlcpy() overflow check in place. Change-Id: I6c4ac6b0a0eef4842beae4107f6f09f6cd29172a Fixes:896ff6db16
Related: OS#2673
This commit is contained in:
parent
eda6fe42a5
commit
6afb3f5031
12
src/socket.c
12
src/socket.c
|
@ -605,29 +605,27 @@ int osmo_sock_unix_init(uint16_t type, uint8_t proto,
|
|||
struct sockaddr_un local;
|
||||
int sfd, rc, on = 1;
|
||||
unsigned int namelen;
|
||||
const size_t socket_path_len = strlen(socket_path);
|
||||
|
||||
if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) ==
|
||||
(OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT))
|
||||
return -EINVAL;
|
||||
|
||||
local.sun_family = AF_UNIX;
|
||||
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)) {
|
||||
/* When an AF_UNIX socket is bound, sun_path should be NUL-terminated. See unix(7) man page. */
|
||||
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__)
|
||||
local.sun_len = socket_path_len;
|
||||
local.sun_len = strlen(local.sun_path);
|
||||
#endif
|
||||
#if defined(BSD44SOCKETS) || defined(SUN_LEN)
|
||||
namelen = SUN_LEN(&local);
|
||||
#else
|
||||
namelen = socket_path_len + offsetof(struct sockaddr_un, sun_path);
|
||||
namelen = strlen(local.sun_path) +
|
||||
offsetof(struct sockaddr_un, sun_path);
|
||||
#endif
|
||||
|
||||
sfd = socket(AF_UNIX, type, proto);
|
||||
|
|
Loading…
Reference in New Issue