|
@@ -407,11 +407,10 @@ static int create_socket_uri (struct shim_handle * hdl)
|
|
|
int shim_do_bind (int sockfd, struct sockaddr * addr, socklen_t addrlen)
|
|
|
{
|
|
|
struct shim_handle * hdl = get_fd_handle(sockfd, NULL, NULL);
|
|
|
+ int ret = -EINVAL;
|
|
|
if (!hdl)
|
|
|
return -EBADF;
|
|
|
|
|
|
- int ret = -EINVAL;
|
|
|
-
|
|
|
if (hdl->type != TYPE_SOCK) {
|
|
|
put_handle(hdl);
|
|
|
return -ENOTSOCK;
|
|
@@ -427,16 +426,17 @@ int shim_do_bind (int sockfd, struct sockaddr * addr, socklen_t addrlen)
|
|
|
}
|
|
|
|
|
|
if (sock->domain == AF_UNIX) {
|
|
|
- if (addrlen != sizeof(struct sockaddr_un))
|
|
|
+ if (addrlen != sizeof(struct sockaddr_un))
|
|
|
goto out;
|
|
|
|
|
|
struct sockaddr_un * saddr = (struct sockaddr_un *) addr;
|
|
|
char * spath = saddr->sun_path;
|
|
|
struct shim_dentry * dent = NULL;
|
|
|
|
|
|
- if ((ret = path_lookupat(NULL, spath, LOOKUP_CREATE, &dent)) < 0)
|
|
|
+ if ((ret = path_lookupat(NULL, spath, LOOKUP_CREATE, &dent)) < 0)
|
|
|
goto out;
|
|
|
|
|
|
+
|
|
|
if (dent->state & DENTRY_VALID &&
|
|
|
!(dent->state & DENTRY_NEGATIVE)) {
|
|
|
ret = -EADDRINUSE;
|
|
@@ -449,18 +449,21 @@ int shim_do_bind (int sockfd, struct sockaddr * addr, socklen_t addrlen)
|
|
|
sock->addr.un.pipeid = data->pipeid;
|
|
|
sock->addr.un.data = data;
|
|
|
sock->addr.un.dentry = dent;
|
|
|
+
|
|
|
} else if (sock->domain == AF_INET || sock->domain == AF_INET6) {
|
|
|
- if (addrlen != ((sock->domain == AF_INET) ? sizeof(struct sockaddr_in) :
|
|
|
- sizeof(struct sockaddr_in6)))
|
|
|
- goto out;
|
|
|
|
|
|
- inet_save_addr(sock->domain, &sock->addr.in.bind, addr);
|
|
|
- inet_rebase_port(false, sock->domain, &sock->addr.in.bind, true);
|
|
|
- }
|
|
|
+ if (addrlen != ((sock->domain == AF_INET) ? sizeof(struct sockaddr_in) :
|
|
|
+ sizeof(struct sockaddr_in6))) {
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ inet_save_addr(sock->domain, &sock->addr.in.bind, addr);
|
|
|
+ inet_rebase_port(false, sock->domain, &sock->addr.in.bind, true);
|
|
|
+ }
|
|
|
|
|
|
sock->sock_state = SOCK_BOUND;
|
|
|
|
|
|
- if ((ret = create_socket_uri(hdl)) < 0)
|
|
|
+ if ((ret = create_socket_uri(hdl)) < 0)
|
|
|
goto out;
|
|
|
|
|
|
PAL_HANDLE pal_hdl = DkStreamOpen(qstrgetstr(&hdl->uri),
|
|
@@ -468,8 +471,8 @@ int shim_do_bind (int sockfd, struct sockaddr * addr, socklen_t addrlen)
|
|
|
hdl->flags & O_NONBLOCK);
|
|
|
|
|
|
if (!pal_hdl) {
|
|
|
- debug("bind: invalid handle returned\n");
|
|
|
ret = (PAL_NATIVE_ERRNO == PAL_ERROR_STREAMEXIST) ? -EADDRINUSE : -PAL_ERRNO;
|
|
|
+ debug("bind: invalid handle returned\n");
|
|
|
goto out;
|
|
|
}
|
|
|
|