diff options
author | Stefan Sperling <ssperling@sysmocom.de> | 2018-09-20 17:21:05 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-09-26 07:25:53 +0000 |
commit | 6afb3f50317e694e7482bbd774243dc130e3f936 (patch) | |
tree | 65574a00ea7a9cd3a0b2434ec0cd37cb7734b96e | |
parent | eda6fe42a5ad33d27e305c1a9b1304ac1f1cc247 (diff) |
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.
Commit 896ff6d erroneously assumed otherwise.
This commit almost reverts 896ff6d: It only leaves the added
osmo_strlcpy() overflow check in place.
Change-Id: I6c4ac6b0a0eef4842beae4107f6f09f6cd29172a
Fixes: 896ff6db161465d506bb9bb5bee2cdeef220dd2e
Related: OS#2673
-rw-r--r-- | src/socket.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/src/socket.c b/src/socket.c index 6f56efb5..a85edb73 100644 --- a/src/socket.c +++ b/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); |