mirror of https://github.com/wolfSSL/wolfssh.git
remove possible double free and fix non blocking echoserver
parent
19a4ce6403
commit
61a41b5b7b
|
@ -127,6 +127,20 @@ static int ssh_worker(thread_ctx_t* threadCtx) {
|
|||
buf = tmpBuf;
|
||||
|
||||
if (!stop) {
|
||||
if (threadCtx->nonBlock) {
|
||||
SOCKET_T sockfd;
|
||||
int select_ret = 0;
|
||||
|
||||
sockfd = (SOCKET_T)wolfSSH_get_fd(threadCtx->ssh);
|
||||
|
||||
select_ret = tcp_select(sockfd, 1);
|
||||
if (select_ret != WS_SELECT_RECV_READY &&
|
||||
select_ret != WS_SELECT_ERROR_READY &&
|
||||
select_ret != WS_SELECT_TIMEOUT) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rxSz = wolfSSH_stream_read(threadCtx->ssh,
|
||||
buf + backlogSz,
|
||||
EXAMPLE_BUFFER_SZ);
|
||||
|
@ -161,16 +175,26 @@ static int ssh_worker(thread_ctx_t* threadCtx) {
|
|||
}
|
||||
txSum += txSz;
|
||||
}
|
||||
else if (txSz != WS_REKEYING)
|
||||
stop = 1;
|
||||
else if (txSz != WS_REKEYING) {
|
||||
int error = wolfSSH_get_error(threadCtx->ssh);
|
||||
if (error != WS_WANT_WRITE) {
|
||||
stop = 1;
|
||||
}
|
||||
else {
|
||||
txSz = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (txSum < backlogSz)
|
||||
memmove(buf, buf + txSum, backlogSz - txSum);
|
||||
backlogSz -= txSum;
|
||||
}
|
||||
else
|
||||
stop = 1;
|
||||
else {
|
||||
int error = wolfSSH_get_error(threadCtx->ssh);
|
||||
if (error != WS_WANT_READ)
|
||||
stop = 1;
|
||||
}
|
||||
}
|
||||
} while (!stop);
|
||||
|
||||
|
|
|
@ -1421,14 +1421,12 @@ int wolfSSH_SFTP_RecvOpen(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
|
|||
|
||||
ato32(data + idx, &sz); idx += UINT32_SZ;
|
||||
if (sz + idx > maxSz) {
|
||||
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
return WS_BUFFER_E;
|
||||
}
|
||||
|
||||
/* plus one to make sure is null terminated */
|
||||
dir = (char*)WMALLOC(sz + 1, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
if (dir == NULL) {
|
||||
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
return WS_MEMORY_E;
|
||||
}
|
||||
WMEMCPY(dir, data + idx, sz);
|
||||
|
@ -1666,20 +1664,16 @@ int wolfSSH_SFTP_RecvOpenDir(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
|
|||
ato32(data + idx, &sz);
|
||||
idx += UINT32_SZ;
|
||||
if (sz + idx > maxSz) {
|
||||
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
return WS_BUFFER_E;
|
||||
}
|
||||
|
||||
/* plus one to make sure is null terminated */
|
||||
dirName = (char*)WMALLOC(sz + 1, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
if (dirName == NULL) {
|
||||
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
return WS_MEMORY_E;
|
||||
}
|
||||
WMEMCPY(dirName, data + idx, sz);
|
||||
dirName[sz] = '\0';
|
||||
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
|
||||
clean_path(dirName);
|
||||
|
||||
/* get directory handle */
|
||||
|
@ -2519,7 +2513,6 @@ int wolfSSH_SFTP_RecvRemove(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
|
|||
}
|
||||
name = (char*)WMALLOC(sz + 1, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
if (name == NULL) {
|
||||
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
return WS_MEMORY_E;
|
||||
}
|
||||
WMEMCPY(name, data + idx, sz);
|
||||
|
@ -3039,7 +3032,6 @@ int wolfSSH_SFTP_RecvFSTAT(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
|
|||
|
||||
ato32(data + idx, &handleSz); idx += UINT32_SZ;
|
||||
if (handleSz + idx > maxSz) {
|
||||
WFREE(data, ssh->ctx->heap, DYNTYPE_BUFFER);
|
||||
return WS_BUFFER_E;
|
||||
}
|
||||
handle = data + idx;
|
||||
|
|
Loading…
Reference in New Issue