mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 19:55:06 +00:00
Kernel: connect() should fail with EISCONN for already-connected sockets.
Also make sure to reset the socket role if Socket::connect() fails.
This commit is contained in:
parent
4aa0ab4e08
commit
e48cbf3c8c
2 changed files with 6 additions and 1 deletions
|
@ -88,6 +88,7 @@ public:
|
||||||
|
|
||||||
void set_original_inode(Badge<VFS>, Retained<Inode>&& inode) { m_inode = move(inode); }
|
void set_original_inode(Badge<VFS>, Retained<Inode>&& inode) { m_inode = move(inode); }
|
||||||
|
|
||||||
|
SocketRole socket_role() const { return m_socket_role; }
|
||||||
void set_socket_role(SocketRole);
|
void set_socket_role(SocketRole);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -2502,11 +2502,15 @@ int Process::sys$connect(int sockfd, const sockaddr* address, socklen_t address_
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
if (!descriptor->is_socket())
|
if (!descriptor->is_socket())
|
||||||
return -ENOTSOCK;
|
return -ENOTSOCK;
|
||||||
|
if (descriptor->socket_role() == SocketRole::Connected)
|
||||||
|
return -EISCONN;
|
||||||
auto& socket = *descriptor->socket();
|
auto& socket = *descriptor->socket();
|
||||||
descriptor->set_socket_role(SocketRole::Connecting);
|
descriptor->set_socket_role(SocketRole::Connecting);
|
||||||
auto result = socket.connect(address, address_size);
|
auto result = socket.connect(address, address_size);
|
||||||
if (result.is_error())
|
if (result.is_error()) {
|
||||||
|
descriptor->set_socket_role(SocketRole::None);
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
descriptor->set_socket_role(SocketRole::Connected);
|
descriptor->set_socket_role(SocketRole::Connected);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue