tcp: don't notify EPIPE/ENOTCONN when no connect or listen happened
Change-Id: I18bf8ceee7963729c5037e39fc1c23f243eba0bb Reviewed-on: https://review.haiku-os.org/c/haiku/+/9380 Tested-by: Commit checker robot <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
@@ -323,6 +323,7 @@ enum {
|
|||||||
FLAG_RECOVERY = 0x40,
|
FLAG_RECOVERY = 0x40,
|
||||||
FLAG_OPTION_SACK_PERMITTED = 0x80,
|
FLAG_OPTION_SACK_PERMITTED = 0x80,
|
||||||
FLAG_AUTO_RECEIVE_BUFFER_SIZE = 0x100,
|
FLAG_AUTO_RECEIVE_BUFFER_SIZE = 0x100,
|
||||||
|
FLAG_CAN_NOTIFY = 0x200
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -650,6 +651,7 @@ TCPEndpoint::Connect(const sockaddr* address)
|
|||||||
|
|
||||||
TRACE(" Connect(): starting 3-way handshake...");
|
TRACE(" Connect(): starting 3-way handshake...");
|
||||||
|
|
||||||
|
fFlags |= FLAG_CAN_NOTIFY;
|
||||||
fState = SYNCHRONIZE_SENT;
|
fState = SYNCHRONIZE_SENT;
|
||||||
T(State(this));
|
T(State(this));
|
||||||
|
|
||||||
@@ -783,6 +785,7 @@ TCPEndpoint::Listen(int count)
|
|||||||
|
|
||||||
gSocketModule->set_max_backlog(socket, count);
|
gSocketModule->set_max_backlog(socket, count);
|
||||||
|
|
||||||
|
fFlags |= FLAG_CAN_NOTIFY;
|
||||||
fState = LISTEN;
|
fState = LISTEN;
|
||||||
T(State(this));
|
T(State(this));
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -908,13 +911,13 @@ TCPEndpoint::SendAvailable()
|
|||||||
{
|
{
|
||||||
MutexLocker locker(fLock);
|
MutexLocker locker(fLock);
|
||||||
|
|
||||||
ssize_t available;
|
ssize_t available = 0;
|
||||||
|
|
||||||
if (is_writable(fState))
|
if (is_writable(fState))
|
||||||
available = fSendQueue.Free();
|
available = fSendQueue.Free();
|
||||||
else if (is_establishing(fState))
|
else if (is_establishing(fState))
|
||||||
available = 0;
|
available = 0;
|
||||||
else
|
else if ((fFlags & FLAG_CAN_NOTIFY) != 0)
|
||||||
available = EPIPE;
|
available = EPIPE;
|
||||||
|
|
||||||
TRACE("SendAvailable(): %" B_PRIdSSIZE, available);
|
TRACE("SendAvailable(): %" B_PRIdSSIZE, available);
|
||||||
@@ -1434,7 +1437,7 @@ TCPEndpoint::_AvailableData() const
|
|||||||
|
|
||||||
ssize_t availableData = fReceiveQueue.Available();
|
ssize_t availableData = fReceiveQueue.Available();
|
||||||
|
|
||||||
if (availableData == 0 && !_ShouldReceive())
|
if (availableData == 0 && !_ShouldReceive() && (fFlags & FLAG_CAN_NOTIFY) != 0)
|
||||||
return ENOTCONN;
|
return ENOTCONN;
|
||||||
if (availableData == 0 && (fState == FINISH_RECEIVED || fState == WAIT_FOR_FINISH_ACKNOWLEDGE))
|
if (availableData == 0 && (fState == FINISH_RECEIVED || fState == WAIT_FOR_FINISH_ACKNOWLEDGE))
|
||||||
return ESHUTDOWN;
|
return ESHUTDOWN;
|
||||||
|
|||||||
Reference in New Issue
Block a user