Kernel: Handle SHUT_RDWR in Socket::shutdown

We were previously assuming that the how value was a bitfield, but that
is not the case, so we must explicitly check for SHUT_RDWR when
deciding on the read and write shutdowns.
This commit is contained in:
Idan Horowitz 2022-07-09 22:29:50 +03:00 committed by Andreas Kling
parent a6f237a247
commit 020c898290
Notes: sideshowbarker 2024-07-17 09:33:07 +09:00

View file

@ -256,12 +256,14 @@ ErrorOr<void> Socket::shutdown(int how)
return set_so_error(ENOTCONN);
if (m_role == Role::Listener)
return set_so_error(ENOTCONN);
if (!m_shut_down_for_writing && (how & SHUT_WR))
if (!m_shut_down_for_writing && (how == SHUT_WR || how == SHUT_RDWR)) {
shut_down_for_writing();
if (!m_shut_down_for_reading && (how & SHUT_RD))
m_shut_down_for_writing = true;
}
if (!m_shut_down_for_reading && (how == SHUT_RD || how == SHUT_RDWR)) {
shut_down_for_reading();
m_shut_down_for_reading |= (how & SHUT_RD) != 0;
m_shut_down_for_writing |= (how & SHUT_WR) != 0;
m_shut_down_for_reading = true;
}
return {};
}