diff --git a/src/proto_uxst.c b/src/proto_uxst.c index 4c32f7eb0..2a5e4319d 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -187,6 +187,7 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle struct sockaddr_un addr; const char *msg = NULL; const char *path; + int maxpathlen; int ext, ready; socklen_t ready_len; int err; @@ -205,6 +206,8 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle listener->fd = uxst_find_compatible_fd(listener); path = ((struct sockaddr_un *)&listener->addr)->sun_path; + maxpathlen = MIN(MAXPATHLEN, sizeof(addr.sun_path)); + /* if the listener already has an fd assigned, then we were offered the * fd by an external process (most likely the parent), and we don't want * to create a new socket. However we still want to set a few flags on @@ -216,17 +219,17 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle goto fd_ready; if (path[0]) { - ret = snprintf(tempname, MAXPATHLEN, "%s.%d.tmp", path, pid); - if (ret < 0 || ret >= MAXPATHLEN) { + ret = snprintf(tempname, maxpathlen, "%s.%d.tmp", path, pid); + if (ret < 0 || ret >= maxpathlen) { err |= ERR_FATAL | ERR_ALERT; - msg = "name too long for UNIX socket"; + msg = "name too long for UNIX socket (limit usually 97)"; goto err_return; } - ret = snprintf(backname, MAXPATHLEN, "%s.%d.bak", path, pid); - if (ret < 0 || ret >= MAXPATHLEN) { + ret = snprintf(backname, maxpathlen, "%s.%d.bak", path, pid); + if (ret < 0 || ret >= maxpathlen) { err |= ERR_FATAL | ERR_ALERT; - msg = "name too long for UNIX socket"; + msg = "name too long for UNIX socket (limit usually 97)"; goto err_return; } diff --git a/src/standard.c b/src/standard.c index 442348c4a..3c4081ebb 100644 --- a/src/standard.c +++ b/src/standard.c @@ -938,7 +938,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int */ prefix_path_len = (pfx && !abstract) ? strlen(pfx) : 0; max_path_len = (sizeof(un->sun_path) - 1) - - (prefix_path_len ? prefix_path_len + 1 + 5 + 1 + 3 : 0); + (abstract ? 0 : prefix_path_len + 1 + 5 + 1 + 3); adr_len = strlen(str2); if (adr_len > max_path_len) {