Merge pull request #622 from falemagn/pull-reqs/fix-buffer-issue-in-DoReceive

Update the buffer's index in DoReceive() any time the buffer's index is updated in DoPacket().
pull/632/head
John Safranek 2023-12-05 10:19:13 -08:00 committed by GitHub
commit 7892d65aaa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 16 additions and 8 deletions

View File

@ -7487,7 +7487,7 @@ static int DoChannelExtendedData(WOLFSSH* ssh,
} }
static int DoPacket(WOLFSSH* ssh) static int DoPacket(WOLFSSH* ssh, byte* bufferConsumed)
{ {
byte* buf = (byte*)ssh->inputBuffer.buffer; byte* buf = (byte*)ssh->inputBuffer.buffer;
word32 idx = ssh->inputBuffer.idx; word32 idx = ssh->inputBuffer.idx;
@ -7500,6 +7500,8 @@ static int DoPacket(WOLFSSH* ssh)
WLOG(WS_LOG_DEBUG, "DoPacket sequence number: %d", ssh->peerSeq); WLOG(WS_LOG_DEBUG, "DoPacket sequence number: %d", ssh->peerSeq);
*bufferConsumed = 0;
idx += UINT32_SZ; idx += UINT32_SZ;
padSz = buf[idx++]; padSz = buf[idx++];
@ -7727,6 +7729,7 @@ static int DoPacket(WOLFSSH* ssh)
idx += padSz; idx += padSz;
ssh->inputBuffer.idx = idx; ssh->inputBuffer.idx = idx;
ssh->peerSeq++; ssh->peerSeq++;
*bufferConsumed = 1;
return ret; return ret;
} }
@ -8115,6 +8118,7 @@ int DoReceive(WOLFSSH* ssh)
byte peerBlockSz = ssh->peerBlockSz; byte peerBlockSz = ssh->peerBlockSz;
byte peerMacSz = ssh->peerMacSz; byte peerMacSz = ssh->peerMacSz;
byte aeadMode = ssh->peerAeadMode; byte aeadMode = ssh->peerAeadMode;
byte bufferConsumed = 0;
switch (ssh->processReplyState) { switch (ssh->processReplyState) {
case PROCESS_INIT: case PROCESS_INIT:
@ -8221,15 +8225,13 @@ int DoReceive(WOLFSSH* ssh)
NO_BREAK; NO_BREAK;
case PROCESS_PACKET: case PROCESS_PACKET:
ret = DoPacket(ssh); ret = DoPacket(ssh, &bufferConsumed);
ssh->error = ret; ssh->error = ret;
if (ret < 0 && !(ret == WS_CHAN_RXD || ret == WS_EXTDATA || if (ret < 0 && !(ret == WS_CHAN_RXD || ret == WS_EXTDATA ||
ret == WS_CHANNEL_CLOSED || ret == WS_WANT_WRITE || ret == WS_CHANNEL_CLOSED || ret == WS_WANT_WRITE ||
ret == WS_REKEYING || ret == WS_WANT_READ)) { ret == WS_REKEYING || ret == WS_WANT_READ)) {
return WS_FATAL_ERROR; ret = WS_FATAL_ERROR;
} }
WLOG(WS_LOG_DEBUG, "PR3: peerMacSz = %u", peerMacSz);
ssh->inputBuffer.idx += peerMacSz;
break; break;
default: default:
@ -8237,9 +8239,15 @@ int DoReceive(WOLFSSH* ssh)
ssh->error = WS_INPUT_CASE_E; ssh->error = WS_INPUT_CASE_E;
return WS_FATAL_ERROR; return WS_FATAL_ERROR;
} }
if (bufferConsumed) {
WLOG(WS_LOG_DEBUG, "PR3: peerMacSz = %u", peerMacSz);
ssh->inputBuffer.idx += peerMacSz;
WLOG(WS_LOG_DEBUG, "PR4: Shrinking input buffer"); WLOG(WS_LOG_DEBUG, "PR4: Shrinking input buffer");
ShrinkBuffer(&ssh->inputBuffer, 1); ShrinkBuffer(&ssh->inputBuffer, 1);
ssh->processReplyState = PROCESS_INIT; ssh->processReplyState = PROCESS_INIT;
}
WLOG(WS_LOG_DEBUG, "PR5: txCount = %u, rxCount = %u", WLOG(WS_LOG_DEBUG, "PR5: txCount = %u, rxCount = %u",
ssh->txCount, ssh->rxCount); ssh->txCount, ssh->rxCount);