Merge pull request #165 from ejohnstown/memory

Memory
pull/166/head
JacobBarthelmeh 2019-05-10 11:05:50 -06:00 committed by GitHub
commit 384a00000f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 97 additions and 3 deletions

View File

@ -393,12 +393,19 @@ THREAD_RETURN WOLFSSH_THREAD client_test(void* args)
char** argv = ((func_args*)args)->argv; char** argv = ((func_args*)args)->argv;
((func_args*)args)->return_code = 0; ((func_args*)args)->return_code = 0;
while ((ch = mygetopt(argc, argv, "?NP:h:p:u:xc:Rt")) != -1) { while ((ch = mygetopt(argc, argv, "?NP:h:p:u:xc:Rtz")) != -1) {
switch (ch) { switch (ch) {
case 'h': case 'h':
host = myoptarg; host = myoptarg;
break; break;
case 'z':
#ifdef WOLFSSH_SHOW_SIZES
wolfSSH_ShowSizes();
exit(EXIT_SUCCESS);
#endif
break;
case 'p': case 'p':
port = (word16)atoi(myoptarg); port = (word16)atoi(myoptarg);
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API) #if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)

View File

@ -1521,3 +1521,26 @@ void wolfSSH_CheckReceivePending(WOLFSSH* ssh)
WIOCTL(wolfSSH_get_fd(ssh), FIONREAD, &bytes); WIOCTL(wolfSSH_get_fd(ssh), FIONREAD, &bytes);
} }
} }
#ifdef WOLFSSH_SHOW_SIZES
void wolfSSH_ShowSizes(void)
{
fprintf(stderr, "wolfSSH struct sizes:\n");
fprintf(stderr, " sizeof(struct %s) = %u\n", "WOLFSSH_CTX",
(word32)sizeof(struct WOLFSSH_CTX));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WOLFSSH",
(word32)sizeof(struct WOLFSSH));
fprintf(stderr, " sizeof(struct %s) = %u\n", "HandshakeInfo",
(word32)sizeof(struct HandshakeInfo));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WOLFSSH_CHANNEL",
(word32)sizeof(struct WOLFSSH_CHANNEL));
fprintf(stderr, " sizeof(struct %s) = %u\n", "Buffer",
(word32)sizeof(struct Buffer));
#ifdef WOLFSSH_SFTP
wolfSSH_SFTP_ShowSizes();
#endif
}
#endif /* WOLFSSH_SHOW_SIZES */

View File

@ -4730,13 +4730,25 @@ static WS_SFTPNAME* wolfSSH_SFTP_DoName(WOLFSSH* ssh)
case SFTP_NAME_GET_PACKET: case SFTP_NAME_GET_PACKET:
/* get number of files */ /* get number of files */
ret = wolfSSH_stream_read(ssh, state->data, state->sz); /* using idx as an offset for partial reads */
if (ret < 0) { ret = wolfSSH_stream_read(ssh,
state->data + state->idx, state->sz - state->idx);
if (ret <= 0) {
if (ssh->error != WS_WANT_READ) { if (ssh->error != WS_WANT_READ) {
wolfSSH_SFTP_ClearState(ssh, STATE_ID_NAME); wolfSSH_SFTP_ClearState(ssh, STATE_ID_NAME);
} }
return NULL; return NULL;
} }
if ((word32)ret < state->sz - state->idx) {
/* Partial read, treat like a want-read. */
state->idx += ret;
ssh->error = WS_WANT_READ;
state->state = SFTP_NAME_GET_PACKET;
return NULL;
}
/* Reset idx back to 0 for parsing the buffer. */
state->idx = 0;
if (state->idx + UINT32_SZ > (word32)state->sz) { if (state->idx + UINT32_SZ > (word32)state->sz) {
ssh->error = WS_BUFFER_E; ssh->error = WS_BUFFER_E;
@ -7384,4 +7396,52 @@ int wolfSSH_SFTP_free(WOLFSSH* ssh)
return WS_SUCCESS; return WS_SUCCESS;
} }
#ifdef WOLFSSH_SHOW_SIZES
void wolfSSH_SFTP_ShowSizes(void)
{
fprintf(stderr, "wolfSFTP struct sizes:\n");
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_CHMOD_STATE",
(word32)sizeof(struct WS_SFTP_CHMOD_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_SETATR_STATE",
(word32)sizeof(struct WS_SFTP_SETATR_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_LSTAT_STATE",
(word32)sizeof(struct WS_SFTP_LSTAT_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_OPEN_STATE",
(word32)sizeof(struct WS_SFTP_OPEN_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_NAME_STATE",
(word32)sizeof(struct WS_SFTP_NAME_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_SEND_STATE",
(word32)sizeof(struct WS_SFTP_SEND_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_READDIR_STATE",
(word32)sizeof(struct WS_SFTP_READDIR_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_RM_STATE",
(word32)sizeof(struct WS_SFTP_RM_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_MKDIR_STATE",
(word32)sizeof(struct WS_SFTP_MKDIR_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_RMDIR_STATE",
(word32)sizeof(struct WS_SFTP_RMDIR_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_RECV_STATE",
(word32)sizeof(struct WS_SFTP_RECV_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_LS_STATE",
(word32)sizeof(struct WS_SFTP_LS_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_GET_STATE",
(word32)sizeof(struct WS_SFTP_GET_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_PUT_STATE",
(word32)sizeof(struct WS_SFTP_PUT_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_SEND_READ_STATE",
(word32)sizeof(struct WS_SFTP_SEND_READ_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_SEND_WRITE_STATE",
(word32)sizeof(struct WS_SFTP_SEND_WRITE_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_CLOSE_STATE",
(word32)sizeof(struct WS_SFTP_CLOSE_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_GET_HANDLE_STATE",
(word32)sizeof(struct WS_SFTP_GET_HANDLE_STATE));
fprintf(stderr, " sizeof(struct %s) = %u\n", "WS_SFTP_RENAME_STATE",
(word32)sizeof(struct WS_SFTP_RENAME_STATE));
}
#endif /* WOLFSSH_SHOW_SIZES */
#endif /* WOLFSSH_SFTP */ #endif /* WOLFSSH_SFTP */

View File

@ -251,6 +251,9 @@ enum WS_DisconnectReasonCodes {
}; };
WOLFSSH_API void wolfSSH_ShowSizes(void);
#ifndef WOLFSSH_MAX_FILENAME #ifndef WOLFSSH_MAX_FILENAME
#define WOLFSSH_MAX_FILENAME 256 #define WOLFSSH_MAX_FILENAME 256
#endif #endif

View File

@ -236,6 +236,7 @@ WOLFSSL_LOCAL int wolfSSH_SFTP_free(WOLFSSH* ssh);
WOLFSSL_LOCAL int SFTP_AddHandleNode(WOLFSSH* ssh, byte* handle, word32 handleSz, char* name); WOLFSSL_LOCAL int SFTP_AddHandleNode(WOLFSSH* ssh, byte* handle, word32 handleSz, char* name);
WOLFSSL_LOCAL int SFTP_RemoveHandleNode(WOLFSSH* ssh, byte* handle, word32 handleSz); WOLFSSL_LOCAL int SFTP_RemoveHandleNode(WOLFSSH* ssh, byte* handle, word32 handleSz);
WOLFSSH_LOCAL void wolfSSH_SFTP_ShowSizes(void);
#ifdef __cplusplus #ifdef __cplusplus
} }