net/local: Return -EINVAL if the address length passed to local_bind is too small

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao 2022-12-18 14:55:44 +08:00 committed by Petro Karashchenko
parent 6f15b32e34
commit aea8f8175a
3 changed files with 17 additions and 25 deletions

View File

@ -52,11 +52,14 @@ int psock_local_bind(FAR struct socket *psock,
FAR struct local_conn_s *conn; FAR struct local_conn_s *conn;
FAR const struct sockaddr_un *unaddr = FAR const struct sockaddr_un *unaddr =
(FAR const struct sockaddr_un *)addr; (FAR const struct sockaddr_un *)addr;
int namelen;
DEBUGASSERT(psock != NULL && psock->s_conn != NULL && DEBUGASSERT(psock != NULL && psock->s_conn != NULL &&
unaddr != NULL && unaddr->sun_family == AF_LOCAL && unaddr != NULL && unaddr->sun_family == AF_LOCAL);
addrlen >= sizeof(sa_family_t));
if (addrlen <= sizeof(sa_family_t) + 1)
{
return -EINVAL;
}
conn = (FAR struct local_conn_s *)psock->s_conn; conn = (FAR struct local_conn_s *)psock->s_conn;
@ -68,16 +71,7 @@ int psock_local_bind(FAR struct socket *psock,
* of the address description. * of the address description.
*/ */
if (addrlen == sizeof(sa_family_t)) if (unaddr->sun_path[0] == '\0')
{
/* No sun_path... This is an un-named Unix domain socket */
conn->lc_type = LOCAL_TYPE_UNNAMED;
}
else
{
namelen = strnlen(unaddr->sun_path, UNIX_PATH_MAX - 1);
if (namelen <= 0)
{ {
/* Zero-length sun_path... This is an abstract Unix domain socket */ /* Zero-length sun_path... This is an abstract Unix domain socket */
@ -95,7 +89,6 @@ int psock_local_bind(FAR struct socket *psock,
strlcpy(conn->lc_path, unaddr->sun_path, sizeof(conn->lc_path)); strlcpy(conn->lc_path, unaddr->sun_path, sizeof(conn->lc_path));
conn->lc_instance_id = -1; conn->lc_instance_id = -1;
} }
}
conn->lc_state = LOCAL_STATE_BOUND; conn->lc_state = LOCAL_STATE_BOUND;
return OK; return OK;

View File

@ -175,7 +175,7 @@ int local_getaddr(FAR struct local_conn_s *conn, FAR struct sockaddr *addr,
int totlen; int totlen;
int pathlen; int pathlen;
DEBUGASSERT(conn && addr && addrlen && *addrlen >= sizeof(sa_family_t)); DEBUGASSERT(conn && addr && addrlen);
/* Get the length of the path (minus the NUL terminator) and the length /* Get the length of the path (minus the NUL terminator) and the length
* of the whole Unix domain address. * of the whole Unix domain address.

View File

@ -354,8 +354,7 @@ static int local_getsockname(FAR struct socket *psock,
FAR struct local_conn_s *conn; FAR struct local_conn_s *conn;
DEBUGASSERT(psock != NULL && psock->s_conn != NULL && DEBUGASSERT(psock != NULL && psock->s_conn != NULL &&
unaddr != NULL && addrlen != NULL && unaddr != NULL && addrlen != NULL);
*addrlen >= sizeof(sa_family_t));
if (*addrlen < sizeof(sa_family_t)) if (*addrlen < sizeof(sa_family_t))
{ {