Better error message in case session name is too long

This commit is contained in:
Marc André Tanner 2014-12-22 13:30:15 +01:00
parent 3cfa99a031
commit 0a94807d60
1 changed files with 11 additions and 3 deletions

View File

@ -249,19 +249,27 @@ static bool set_socket_name(struct sockaddr_un *sockaddr, const char *name) {
size_t maxlen = sizeof(sockaddr->sun_path); size_t maxlen = sizeof(sockaddr->sun_path);
if (name[0] == '/') { if (name[0] == '/') {
strncpy(sockaddr->sun_path, name, maxlen); strncpy(sockaddr->sun_path, name, maxlen);
if (sockaddr->sun_path[maxlen-1]) if (sockaddr->sun_path[maxlen-1]) {
errno = ENAMETOOLONG;
return false; return false;
}
} else if (name[0] == '.' && (name[1] == '.' || name[1] == '/')) { } else if (name[0] == '.' && (name[1] == '.' || name[1] == '/')) {
char buf[maxlen], *cwd = getcwd(buf, sizeof buf); char buf[maxlen], *cwd = getcwd(buf, sizeof buf);
if (!cwd) if (!cwd)
return false; return false;
int len = snprintf(sockaddr->sun_path, maxlen, "%s/%s", cwd, name); int len = snprintf(sockaddr->sun_path, maxlen, "%s/%s", cwd, name);
if (len < 0 || (size_t)len >= maxlen) if (len < 0)
return false; return false;
if ((size_t)len >= maxlen) {
errno = ENAMETOOLONG;
return false;
}
} else { } else {
int dir_len = create_socket_dir(sockaddr); int dir_len = create_socket_dir(sockaddr);
if (dir_len == -1 || dir_len + strlen(name) + strlen(server.host) >= maxlen) if (dir_len == -1 || dir_len + strlen(name) + strlen(server.host) >= maxlen) {
errno = ENAMETOOLONG;
return false; return false;
}
strncat(sockaddr->sun_path, name, maxlen - strlen(sockaddr->sun_path) - 1); strncat(sockaddr->sun_path, name, maxlen - strlen(sockaddr->sun_path) - 1);
strncat(sockaddr->sun_path, server.host, maxlen - strlen(sockaddr->sun_path) - 1); strncat(sockaddr->sun_path, server.host, maxlen - strlen(sockaddr->sun_path) - 1);
} }