Skip to content

Commit 0539f00

Browse files
use NoticeError throughout wolfsftp.c and account for rekey with more sftp client commands
1 parent a2e6556 commit 0539f00

2 files changed

Lines changed: 65 additions & 73 deletions

File tree

examples/sftpclient/sftpclient.c

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ static void myStatusCb(WOLFSSH* sshIn, word32* bytes, char* name)
154154
word32 currentTime;
155155
#ifndef WOLFSSH_NO_TIMESTAMP
156156
static word32 lastOutputTime = 0;
157+
static word32 lastPrintedBytes[2] = {0, 0};
157158
word32 elapsedTime;
158159
#endif
159160
char buf[80];
@@ -162,12 +163,24 @@ static void myStatusCb(WOLFSSH* sshIn, word32* bytes, char* name)
162163
#ifndef WOLFSSH_NO_TIMESTAMP
163164
currentTime = current_time(0);
164165
if (currentTime == lastOutputTime) {
165-
return;
166+
if (bytes[0] != lastPrintedBytes[0] || bytes[1] != lastPrintedBytes[1]) {
167+
/* Progress made in the same second — throttle but track latest */
168+
lastPrintedBytes[0] = bytes[0];
169+
lastPrintedBytes[1] = bytes[1];
170+
return;
171+
}
172+
/* bytes unchanged: EOF final call — fall through to print */
173+
}
174+
else {
175+
lastOutputTime = currentTime;
166176
}
167-
lastOutputTime = currentTime;
177+
lastPrintedBytes[0] = bytes[0];
178+
lastPrintedBytes[1] = bytes[1];
168179
if (WSTRNCMP(currentFile, name, WSTRLEN(name)) != 0) {
169180
startTime = current_time(1);
170181
lastOutputTime = 0; /* Reset timer for new file transfer */
182+
lastPrintedBytes[0] = 0;
183+
lastPrintedBytes[1] = 0;
171184
WMEMSET(currentFile, 0, WOLFSSH_MAX_FILENAME);
172185
WSTRNCPY(currentFile, name, WOLFSSH_MAX_FILENAME);
173186
}
@@ -756,8 +769,8 @@ static int doCmds(func_args* args)
756769

757770
ret = wolfSSH_SFTP_STAT(ssh, pt, &atrb);
758771
err = wolfSSH_get_error(ssh);
759-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
760-
&& ret != WS_SUCCESS);
772+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
773+
err == WS_REKEYING) && ret != WS_SUCCESS);
761774
if (ret != WS_SUCCESS) {
762775
if (SFTP_FPUTS(args, "Error changing directory\n") < 0) {
763776
err_msg("fputs error");
@@ -844,8 +857,8 @@ static int doCmds(func_args* args)
844857

845858
ret = wolfSSH_SFTP_CHMOD(ssh, pt, mode);
846859
err = wolfSSH_get_error(ssh);
847-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
848-
&& ret != WS_SUCCESS);
860+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
861+
err == WS_REKEYING) && ret != WS_SUCCESS);
849862
if (ret != WS_SUCCESS) {
850863
if (SFTP_FPUTS(args, "Unable to change permissions of ") < 0) {
851864
err_msg("fputs error");
@@ -901,8 +914,8 @@ static int doCmds(func_args* args)
901914

902915
ret = wolfSSH_SFTP_RMDIR(ssh, pt);
903916
err = wolfSSH_get_error(ssh);
904-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
905-
&& ret != WS_SUCCESS);
917+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
918+
err == WS_REKEYING) && ret != WS_SUCCESS);
906919
if (ret != WS_SUCCESS) {
907920
if (ret == WS_PERMISSIONS) {
908921
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0) {
@@ -954,8 +967,8 @@ static int doCmds(func_args* args)
954967

955968
ret = wolfSSH_SFTP_Remove(ssh, pt);
956969
err = wolfSSH_get_error(ssh);
957-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
958-
&& ret != WS_SUCCESS);
970+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
971+
err == WS_REKEYING) && ret != WS_SUCCESS);
959972
if (ret != WS_SUCCESS) {
960973
if (ret == WS_PERMISSIONS) {
961974
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0) {

src/wolfsftp.c

Lines changed: 42 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6435,15 +6435,15 @@ static WS_SFTPNAME* wolfSSH_SFTP_DoName(WOLFSSH* ssh)
64356435
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
64366436
wolfSSH_SFTP_buffer_size(&state->buffer));
64376437
if (ret < 0) {
6438-
if (ssh->error != WS_WANT_READ) {
6438+
if (!NoticeError(ssh)) {
64396439
wolfSSH_SFTP_ClearState(ssh, STATE_ID_NAME);
64406440
}
64416441
return NULL;
64426442
}
64436443

64446444
wolfSSH_SFTP_buffer_rewind(&state->buffer);
64456445
wolfSSH_SFTP_DoStatus(ssh, reqId, &state->buffer);
6446-
if (ssh->error != WS_WANT_READ) {
6446+
if (!NoticeError(ssh)) {
64476447
wolfSSH_SFTP_ClearState(ssh, STATE_ID_NAME);
64486448
}
64496449
return NULL;
@@ -6458,7 +6458,7 @@ static WS_SFTPNAME* wolfSSH_SFTP_DoName(WOLFSSH* ssh)
64586458
wolfSSH_SFTP_buffer_size(&state->buffer) -
64596459
wolfSSH_SFTP_buffer_idx(&state->buffer));
64606460
if (ret <= 0) {
6461-
if (ssh->error != WS_WANT_READ) {
6461+
if (!NoticeError(ssh)) {
64626462
wolfSSH_SFTP_ClearState(ssh, STATE_ID_NAME);
64636463
}
64646464
return NULL;
@@ -6909,8 +6909,7 @@ int wolfSSH_SFTP_CHMOD(WOLFSSH* ssh, char* n, char* oct)
69096909
case STATE_CHMOD_GET:
69106910
/* get current attributes of path */
69116911
if ((ret = wolfSSH_SFTP_STAT(ssh, n, &state->atr)) != WS_SUCCESS) {
6912-
if (ssh->error != WS_WANT_READ
6913-
&& ssh->error != WS_WANT_WRITE) {
6912+
if (!NoticeError(ssh)) {
69146913
break;
69156914
}
69166915
return ret;
@@ -6990,14 +6989,12 @@ static int SFTP_STAT(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr, byte type)
69906989
WLOG(WS_LOG_SFTP, "SFTP LSTAT STATE: SEND_TYPE_REQ");
69916990
ret = SendPacketType(ssh, type, (byte*)dir, state->dirSz);
69926991
if (ret != WS_SUCCESS) {
6993-
if (ssh->error == WS_WANT_READ ||
6994-
ssh->error == WS_WANT_WRITE)
6992+
if (NoticeError(ssh)) {
69956993
return WS_FATAL_ERROR;
6996-
else {
6997-
ret_fatal = 1;
6998-
state->state = STATE_LSTAT_CLEANUP;
6999-
continue;
70006994
}
6995+
ret_fatal = 1;
6996+
state->state = STATE_LSTAT_CLEANUP;
6997+
continue;
70016998
}
70026999
state->state = STATE_LSTAT_GET_HEADER;
70037000
FALL_THROUGH;
@@ -7008,14 +7005,12 @@ static int SFTP_STAT(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr, byte type)
70087005
ret = SFTP_GetHeader(ssh, &state->reqId, &state->type,
70097006
&state->buffer);
70107007
if (ret <= 0) {
7011-
if (ssh->error == WS_WANT_READ ||
7012-
ssh->error == WS_WANT_WRITE)
7008+
if (NoticeError(ssh)) {
70137009
return WS_FATAL_ERROR;
7014-
else {
7015-
state->state = STATE_LSTAT_CLEANUP;
7016-
ret_fatal = 1;
7017-
continue;
70187010
}
7011+
state->state = STATE_LSTAT_CLEANUP;
7012+
ret_fatal = 1;
7013+
continue;
70197014
}
70207015

70217016
state->state = STATE_LSTAT_CHECK_REQ_ID;
@@ -7042,7 +7037,7 @@ static int SFTP_STAT(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr, byte type)
70427037
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
70437038
wolfSSH_SFTP_buffer_size(&state->buffer));
70447039
if (ret < 0) {
7045-
if (ssh->error != WS_WANT_READ) {
7040+
if (!NoticeError(ssh)) {
70467041
wolfSSH_SFTP_ClearState(ssh, STATE_ID_LSTAT);
70477042
}
70487043
return WS_FATAL_ERROR;
@@ -7211,8 +7206,7 @@ int wolfSSH_SFTP_SetSTAT(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr)
72117206
/* send header and type specific data */
72127207
case STATE_SET_ATR_SEND:
72137208
if (wolfSSH_SFTP_buffer_send(ssh, &state->buffer) < 0) {
7214-
if (ssh->error != WS_WANT_READ
7215-
&& ssh->error != WS_WANT_WRITE) {
7209+
if (!NoticeError(ssh)) {
72167210
ret = WS_FATAL_ERROR;
72177211
break;
72187212
}
@@ -7229,8 +7223,7 @@ int wolfSSH_SFTP_SetSTAT(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr)
72297223
case STATE_SET_ATR_GET:
72307224
maxSz = SFTP_GetHeader(ssh, &state->reqId, &type, &state->buffer);
72317225
if (maxSz <= 0) {
7232-
if (ssh->error != WS_WANT_READ
7233-
&& ssh->error != WS_WANT_WRITE) {
7226+
if (!NoticeError(ssh)) {
72347227
ret = WS_FATAL_ERROR;
72357228
break;
72367229
}
@@ -7257,8 +7250,7 @@ int wolfSSH_SFTP_SetSTAT(WOLFSSH* ssh, char* dir, WS_SFTP_FILEATRB* atr)
72577250
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
72587251
wolfSSH_SFTP_buffer_size(&state->buffer));
72597252
if (ret < 0) {
7260-
if (ssh->error != WS_WANT_READ
7261-
&& ssh->error != WS_WANT_WRITE) {
7253+
if (!NoticeError(ssh)) {
72627254
ret = WS_FATAL_ERROR;
72637255
break;
72647256
}
@@ -7730,12 +7722,8 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
77307722
if (NoticeError(ssh)) {
77317723
return WS_FATAL_ERROR;
77327724
}
7733-
if (ssh->error != WS_WANT_READ &&
7734-
ssh->error != WS_WANT_WRITE) {
7735-
state->state = STATE_SEND_READ_CLEANUP;
7736-
continue;
7737-
}
7738-
return ret;
7725+
state->state = STATE_SEND_READ_CLEANUP;
7726+
continue;
77397727
}
77407728
wolfSSH_SFTP_buffer_free(ssh, &state->buffer);
77417729
state->state = STATE_SEND_READ_GET_HEADER;
@@ -7746,11 +7734,11 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
77467734
/* Get response */
77477735
if ((ret = SFTP_GetHeader(ssh, &state->reqId, &state->type,
77487736
&state->buffer)) <= 0) {
7749-
if (!NoticeError(ssh)) {
7750-
state->state = STATE_SEND_READ_CLEANUP;
7751-
continue;
7737+
if (NoticeError(ssh)) {
7738+
return WS_FATAL_ERROR;
77527739
}
7753-
return WS_FATAL_ERROR;
7740+
state->state = STATE_SEND_READ_CLEANUP;
7741+
continue;
77547742
}
77557743
ret = wolfSSH_SFTP_buffer_create(ssh, &state->buffer, ret);
77567744
if (ret != WS_SUCCESS) {
@@ -7789,11 +7777,11 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
77897777
/* get size of string and place it into out buffer */
77907778
ret = wolfSSH_stream_read(ssh, szFlat, UINT32_SZ);
77917779
if (ret < 0) {
7792-
if (!NoticeError(ssh)) {
7793-
state->state = STATE_SEND_READ_CLEANUP;
7794-
continue;
7780+
if (NoticeError(ssh)) {
7781+
return WS_FATAL_ERROR;
77957782
}
7796-
return ret;
7783+
state->state = STATE_SEND_READ_CLEANUP;
7784+
continue;
77977785
}
77987786
ato32(szFlat, &sz);
77997787
wolfSSH_SFTP_buffer_create(ssh, &state->buffer, sz);
@@ -7814,8 +7802,7 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
78147802
out + state->recvSz,
78157803
wolfSSH_SFTP_buffer_size(&state->buffer));
78167804
if (ret < 0) {
7817-
if (ssh->error == WS_WANT_READ ||
7818-
ssh->error == WS_WANT_WRITE) {
7805+
if (NoticeError(ssh)) {
78197806
return WS_FATAL_ERROR;
78207807
}
78217808
WLOG(WS_LOG_SFTP, "Error reading remainder of data");
@@ -7852,12 +7839,11 @@ int wolfSSH_SFTP_SendReadPacket(WOLFSSH* ssh, byte* handle, word32 handleSz,
78527839
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
78537840
wolfSSH_SFTP_buffer_size(&state->buffer));
78547841
if (ret < 0) {
7855-
if (ssh->error != WS_WANT_READ &&
7856-
ssh->error != WS_WANT_WRITE) {
7857-
state->state = STATE_SEND_READ_CLEANUP;
7858-
continue;
7842+
if (NoticeError(ssh)) {
7843+
return WS_FATAL_ERROR;
78597844
}
7860-
return WS_FATAL_ERROR;
7845+
state->state = STATE_SEND_READ_CLEANUP;
7846+
continue;
78617847
}
78627848
wolfSSH_SFTP_buffer_rewind(&state->buffer);
78637849
ret = wolfSSH_SFTP_DoStatus(ssh,
@@ -8176,8 +8162,7 @@ int wolfSSH_SFTP_Close(WOLFSSH* ssh, byte* handle, word32 handleSz)
81768162
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
81778163
wolfSSH_SFTP_buffer_size(&state->buffer));
81788164
if (ret < 0) {
8179-
if (ssh->error != WS_WANT_WRITE &&
8180-
ssh->error != WS_WANT_READ) {
8165+
if (!NoticeError(ssh)) {
81818166
wolfSSH_SFTP_buffer_free(ssh, &state->buffer);
81828167
}
81838168
return WS_FATAL_ERROR;
@@ -8523,8 +8508,7 @@ int wolfSSH_SFTP_Remove(WOLFSSH* ssh, char* f)
85238508
case STATE_RM_LSTAT:
85248509
/* check file is there to be removed */
85258510
if ((ret = wolfSSH_SFTP_LSTAT(ssh, f, &atrb)) != WS_SUCCESS) {
8526-
if (ssh->error != WS_WANT_WRITE
8527-
&& ssh->error != WS_WANT_READ) {
8511+
if (!NoticeError(ssh)) {
85288512
WLOG(WS_LOG_SFTP, "Error verifying file");
85298513
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RM);
85308514
}
@@ -8537,8 +8521,7 @@ int wolfSSH_SFTP_Remove(WOLFSSH* ssh, char* f)
85378521
ret = SendPacketType(ssh, WOLFSSH_FTP_REMOVE, (byte*)f,
85388522
(word32)WSTRLEN(f));
85398523
if (ret != WS_SUCCESS) {
8540-
if (ssh->error != WS_WANT_WRITE
8541-
&& ssh->error != WS_WANT_READ) {
8524+
if (!NoticeError(ssh)) {
85428525
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RM);
85438526
}
85448527
return ret;
@@ -8549,8 +8532,7 @@ int wolfSSH_SFTP_Remove(WOLFSSH* ssh, char* f)
85498532
case STATE_RM_GET:
85508533
ret = SFTP_GetHeader(ssh, &state->reqId, &type, &state->buffer);
85518534
if (ret <= 0 || type != WOLFSSH_FTP_STATUS) {
8552-
if (ssh->error != WS_WANT_WRITE
8553-
&& ssh->error != WS_WANT_READ) {
8535+
if (!NoticeError(ssh)) {
85548536
WLOG(WS_LOG_SFTP, "Unexpected packet type");
85558537
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RM);
85568538
}
@@ -8568,8 +8550,7 @@ int wolfSSH_SFTP_Remove(WOLFSSH* ssh, char* f)
85688550
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
85698551
wolfSSH_SFTP_buffer_size(&state->buffer));
85708552
if (ret < 0) {
8571-
if (ssh->error != WS_WANT_WRITE
8572-
&& ssh->error != WS_WANT_READ) {
8553+
if (!NoticeError(ssh)) {
85738554
WLOG(WS_LOG_SFTP, "Unexpected packet type");
85748555
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RM);
85758556
}
@@ -8630,8 +8611,7 @@ int wolfSSH_SFTP_RMDIR(WOLFSSH* ssh, char* dir)
86308611
ret = SendPacketType(ssh, WOLFSSH_FTP_RMDIR, (byte*)dir,
86318612
(word32)WSTRLEN(dir));
86328613
if (ret != WS_SUCCESS) {
8633-
if (ssh->error != WS_WANT_READ
8634-
&& ssh->error != WS_WANT_WRITE) {
8614+
if (!NoticeError(ssh)) {
86358615
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RMDIR);
86368616
}
86378617
return ret;
@@ -8642,7 +8622,7 @@ int wolfSSH_SFTP_RMDIR(WOLFSSH* ssh, char* dir)
86428622
case STATE_RMDIR_GET:
86438623
ret = SFTP_GetHeader(ssh, &state->reqId, &type, &state->buffer);
86448624
if (ret <= 0 || type != WOLFSSH_FTP_STATUS) {
8645-
if (ssh->error != WS_WANT_READ) {
8625+
if (!NoticeError(ssh)) {
86468626
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RMDIR);
86478627
WLOG(WS_LOG_SFTP, "Unexpected packet type");
86488628
}
@@ -8659,7 +8639,7 @@ int wolfSSH_SFTP_RMDIR(WOLFSSH* ssh, char* dir)
86598639
ret = wolfSSH_SFTP_buffer_read(ssh, &state->buffer,
86608640
wolfSSH_SFTP_buffer_size(&state->buffer));
86618641
if (ret < 0) {
8662-
if (ssh->error != WS_WANT_READ)
8642+
if (!NoticeError(ssh))
86638643
wolfSSH_SFTP_ClearState(ssh, STATE_ID_RMDIR);
86648644
return WS_FATAL_ERROR;
86658645
}
@@ -8867,9 +8847,9 @@ int wolfSSH_SFTP_Get(WOLFSSH* ssh, char* from,
88678847
WLOG(WS_LOG_SFTP, "SFTP GET STATE: STAT");
88688848
ret = wolfSSH_SFTP_STAT(ssh, from, &state->attrib);
88698849
if (ret != WS_SUCCESS) {
8870-
if (ssh->error == WS_WANT_READ ||
8871-
ssh->error == WS_WANT_WRITE)
8850+
if (NoticeError(ssh)) {
88728851
return WS_FATAL_ERROR;
8852+
}
88738853
WLOG(WS_LOG_SFTP, "Error verifying file");
88748854
state->state = STATE_GET_CLEANUP;
88758855
continue;
@@ -8894,8 +8874,7 @@ int wolfSSH_SFTP_Get(WOLFSSH* ssh, char* from,
88948874
ret = wolfSSH_SFTP_Open(ssh, from, WOLFSSH_FXF_READ, NULL,
88958875
state->handle, &state->handleSz);
88968876
if (ret != WS_SUCCESS) {
8897-
if (ssh->error == WS_WANT_READ ||
8898-
ssh->error == WS_WANT_WRITE) {
8877+
if (NoticeError(ssh)) {
88998878
return WS_FATAL_ERROR;
89008879
}
89018880
WLOG(WS_LOG_SFTP, "Error getting handle");

0 commit comments

Comments
 (0)