Skip to content

Commit d7ed559

Browse files
committed
DoDisconnect/DoUnimplemented: validate payload
- Replace raw ato32() with GetUint32() to check len. - Return WS_BUFFER_E on short payload instead of reading past buffer end. Issue: F-413
1 parent 047a171 commit d7ed559

1 file changed

Lines changed: 48 additions & 49 deletions

File tree

src/internal.c

Lines changed: 48 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6667,18 +6667,17 @@ static int DoUnimplemented(WOLFSSH* ssh,
66676667
{
66686668
word32 seq;
66696669
word32 begin = *idx;
6670+
int ret;
66706671

66716672
WOLFSSH_UNUSED(ssh);
6672-
WOLFSSH_UNUSED(len);
6673-
6674-
ato32(buf + begin, &seq);
6675-
begin += UINT32_SZ;
66766673

6677-
WLOG(WS_LOG_DEBUG, "UNIMPLEMENTED: seq %u", seq);
6678-
6679-
*idx = begin;
6674+
ret = GetUint32(&seq, buf, len, &begin);
6675+
if (ret == WS_SUCCESS) {
6676+
*idx = begin;
6677+
WLOG(WS_LOG_DEBUG, "UNIMPLEMENTED: seq %u", seq);
6678+
}
66806679

6681-
return WS_SUCCESS;
6680+
return ret;
66826681
}
66836682

66846683

@@ -6687,54 +6686,54 @@ static int DoDisconnect(WOLFSSH* ssh, byte* buf, word32 len, word32* idx)
66876686
word32 reason;
66886687
const char* reasonStr = NULL;
66896688
word32 begin = *idx;
6689+
int ret;
66906690

6691-
WOLFSSH_UNUSED(len);
66926691
WOLFSSH_UNUSED(reasonStr);
66936692

6694-
ato32(buf + begin, &reason);
6695-
begin += UINT32_SZ;
6693+
ret = GetUint32(&reason, buf, len, &begin);
6694+
if (ret == WS_SUCCESS) {
6695+
*idx = begin;
66966696

66976697
#ifdef NO_WOLFSSH_STRINGS
6698-
WLOG(WS_LOG_DEBUG, "DISCONNECT: (%u)", reason);
6698+
WLOG(WS_LOG_DEBUG, "DISCONNECT: (%u)", reason);
66996699
#elif defined(DEBUG_WOLFSSH)
6700-
switch (reason) {
6701-
case WOLFSSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT:
6702-
reasonStr = "host not allowed to connect"; break;
6703-
case WOLFSSH_DISCONNECT_PROTOCOL_ERROR:
6704-
reasonStr = "protocol error"; break;
6705-
case WOLFSSH_DISCONNECT_KEY_EXCHANGE_FAILED:
6706-
reasonStr = "key exchange failed"; break;
6707-
case WOLFSSH_DISCONNECT_RESERVED:
6708-
reasonStr = "reserved"; break;
6709-
case WOLFSSH_DISCONNECT_MAC_ERROR:
6710-
reasonStr = "mac error"; break;
6711-
case WOLFSSH_DISCONNECT_COMPRESSION_ERROR:
6712-
reasonStr = "compression error"; break;
6713-
case WOLFSSH_DISCONNECT_SERVICE_NOT_AVAILABLE:
6714-
reasonStr = "service not available"; break;
6715-
case WOLFSSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED:
6716-
reasonStr = "protocol version not supported"; break;
6717-
case WOLFSSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE:
6718-
reasonStr = "host key not verifiable"; break;
6719-
case WOLFSSH_DISCONNECT_CONNECTION_LOST:
6720-
reasonStr = "connection lost"; break;
6721-
case WOLFSSH_DISCONNECT_BY_APPLICATION:
6722-
reasonStr = "disconnect by application"; break;
6723-
case WOLFSSH_DISCONNECT_TOO_MANY_CONNECTIONS:
6724-
reasonStr = "too many connections"; break;
6725-
case WOLFSSH_DISCONNECT_AUTH_CANCELLED_BY_USER:
6726-
reasonStr = "auth cancelled by user"; break;
6727-
case WOLFSSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE:
6728-
reasonStr = "no more auth methods available"; break;
6729-
case WOLFSSH_DISCONNECT_ILLEGAL_USER_NAME:
6730-
reasonStr = "illegal user name"; break;
6731-
default:
6732-
reasonStr = "unknown reason";
6733-
}
6734-
WLOG(WS_LOG_DEBUG, "DISCONNECT: (%u) %s", reason, reasonStr);
6700+
switch (reason) {
6701+
case WOLFSSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT:
6702+
reasonStr = "host not allowed to connect"; break;
6703+
case WOLFSSH_DISCONNECT_PROTOCOL_ERROR:
6704+
reasonStr = "protocol error"; break;
6705+
case WOLFSSH_DISCONNECT_KEY_EXCHANGE_FAILED:
6706+
reasonStr = "key exchange failed"; break;
6707+
case WOLFSSH_DISCONNECT_RESERVED:
6708+
reasonStr = "reserved"; break;
6709+
case WOLFSSH_DISCONNECT_MAC_ERROR:
6710+
reasonStr = "mac error"; break;
6711+
case WOLFSSH_DISCONNECT_COMPRESSION_ERROR:
6712+
reasonStr = "compression error"; break;
6713+
case WOLFSSH_DISCONNECT_SERVICE_NOT_AVAILABLE:
6714+
reasonStr = "service not available"; break;
6715+
case WOLFSSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED:
6716+
reasonStr = "protocol version not supported"; break;
6717+
case WOLFSSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE:
6718+
reasonStr = "host key not verifiable"; break;
6719+
case WOLFSSH_DISCONNECT_CONNECTION_LOST:
6720+
reasonStr = "connection lost"; break;
6721+
case WOLFSSH_DISCONNECT_BY_APPLICATION:
6722+
reasonStr = "disconnect by application"; break;
6723+
case WOLFSSH_DISCONNECT_TOO_MANY_CONNECTIONS:
6724+
reasonStr = "too many connections"; break;
6725+
case WOLFSSH_DISCONNECT_AUTH_CANCELLED_BY_USER:
6726+
reasonStr = "auth cancelled by user"; break;
6727+
case WOLFSSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE:
6728+
reasonStr = "no more auth methods available"; break;
6729+
case WOLFSSH_DISCONNECT_ILLEGAL_USER_NAME:
6730+
reasonStr = "illegal user name"; break;
6731+
default:
6732+
reasonStr = "unknown reason";
6733+
}
6734+
WLOG(WS_LOG_DEBUG, "DISCONNECT: (%u) %s", reason, reasonStr);
67356735
#endif
6736-
6737-
*idx = begin;
6736+
}
67386737

67396738
ssh->error = WS_DISCONNECT;
67406739
return WS_DISCONNECT;

0 commit comments

Comments
 (0)