@@ -747,6 +747,13 @@ static int doCmds(func_args* args)
747747
748748 /* check directory is valid */
749749 do {
750+ while (ret == WS_REKEYING || ssh -> error == WS_REKEYING ) {
751+ ret = wolfSSH_worker (ssh , NULL );
752+ if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR ) {
753+ ret = wolfSSH_get_error (ssh );
754+ }
755+ }
756+
750757 ret = wolfSSH_SFTP_STAT (ssh , pt , & atrb );
751758 err = wolfSSH_get_error (ssh );
752759 } while ((err == WS_WANT_READ || err == WS_WANT_WRITE )
@@ -828,6 +835,13 @@ static int doCmds(func_args* args)
828835
829836 /* update permissions */
830837 do {
838+ while (ret == WS_REKEYING || ssh -> error == WS_REKEYING ) {
839+ ret = wolfSSH_worker (ssh , NULL );
840+ if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR ) {
841+ ret = wolfSSH_get_error (ssh );
842+ }
843+ }
844+
831845 ret = wolfSSH_SFTP_CHMOD (ssh , pt , mode );
832846 err = wolfSSH_get_error (ssh );
833847 } while ((err == WS_WANT_READ || err == WS_WANT_WRITE )
@@ -878,6 +892,13 @@ static int doCmds(func_args* args)
878892 }
879893
880894 do {
895+ while (ret == WS_REKEYING || ssh -> error == WS_REKEYING ) {
896+ ret = wolfSSH_worker (ssh , NULL );
897+ if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR ) {
898+ ret = wolfSSH_get_error (ssh );
899+ }
900+ }
901+
881902 ret = wolfSSH_SFTP_RMDIR (ssh , pt );
882903 err = wolfSSH_get_error (ssh );
883904 } while ((err == WS_WANT_READ || err == WS_WANT_WRITE )
@@ -924,6 +945,13 @@ static int doCmds(func_args* args)
924945 }
925946
926947 do {
948+ while (ret == WS_REKEYING || ssh -> error == WS_REKEYING ) {
949+ ret = wolfSSH_worker (ssh , NULL );
950+ if (ret != WS_SUCCESS && ret == WS_FATAL_ERROR ) {
951+ ret = wolfSSH_get_error (ssh );
952+ }
953+ }
954+
927955 ret = wolfSSH_SFTP_Remove (ssh , pt );
928956 err = wolfSSH_get_error (ssh );
929957 } while ((err == WS_WANT_READ || err == WS_WANT_WRITE )
@@ -1119,7 +1147,7 @@ static int doCmds(func_args* args)
11191147/* alternate main loop for the autopilot get/receive */
11201148static int doAutopilot (int cmd , char * local , char * remote )
11211149{
1122- int err ;
1150+ int err = 0 ;
11231151 int ret = WS_SUCCESS ;
11241152 char fullpath [128 ] = "." ;
11251153 WS_SFTPNAME * name = NULL ;
@@ -1156,6 +1184,12 @@ static int doAutopilot(int cmd, char* local, char* remote)
11561184 }
11571185
11581186 do {
1187+ if (err == WS_REKEYING || err == WS_WINDOW_FULL ) { /* handle rekeying state */
1188+ do {
1189+ ret = wolfSSH_worker (ssh , NULL );
1190+ } while (ret == WS_REKEYING );
1191+ }
1192+
11591193 if (cmd == AUTOPILOT_PUT ) {
11601194 ret = wolfSSH_SFTP_Put (ssh , local , fullpath , 0 , NULL );
11611195 }
@@ -1164,7 +1198,8 @@ static int doAutopilot(int cmd, char* local, char* remote)
11641198 }
11651199 err = wolfSSH_get_error (ssh );
11661200 } while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
1167- err == WS_CHAN_RXD || err == WS_REKEYING ) &&
1201+ err == WS_CHAN_RXD || err == WS_REKEYING ||
1202+ err == WS_WINDOW_FULL ) &&
11681203 ret == WS_FATAL_ERROR );
11691204
11701205 if (ret != WS_SUCCESS ) {
@@ -1452,14 +1487,52 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
14521487
14531488 WFREE (workingDir , NULL , DYNAMIC_TYPE_TMP_BUFFER );
14541489 if (ret == WS_SUCCESS ) {
1455- if (wolfSSH_shutdown (ssh ) != WS_SUCCESS ) {
1456- int rc ;
1457- rc = wolfSSH_get_error (ssh );
1490+ int err ;
1491+ ret = wolfSSH_shutdown (ssh );
1492+
1493+ /* peer hung up, stop trying to shutdown */
1494+ if (ret == WS_SOCKET_ERROR_E ) {
1495+ ret = 0 ;
1496+ }
1497+
1498+ err = wolfSSH_get_error (ssh );
1499+ if (err != WS_SOCKET_ERROR_E &&
1500+ (err == WS_WANT_READ || err == WS_WANT_WRITE )) {
1501+ int maxAttempt = 10 ; /* make 10 attempts max before giving up */
1502+ int attempt ;
1503+
1504+ for (attempt = 0 ; attempt < maxAttempt ; attempt ++ ) {
1505+ ret = wolfSSH_worker (ssh , NULL );
1506+ err = wolfSSH_get_error (ssh );
1507+
1508+ /* peer successfully closed down gracefully */
1509+ if (ret == WS_CHANNEL_CLOSED ) {
1510+ ret = 0 ;
1511+ break ;
1512+ }
1513+
1514+ /* peer hung up, stop shutdown */
1515+ if (ret == WS_SOCKET_ERROR_E ) {
1516+ ret = 0 ;
1517+ break ;
1518+ }
1519+
1520+ if (err == WS_WANT_READ || err == WS_WANT_WRITE ) {
1521+ /* Wanting read or wanting write. Clear ret. */
1522+ ret = 0 ;
1523+ }
1524+ else {
1525+ break ;
1526+ }
1527+ }
14581528
1459- if (rc != WS_SOCKET_ERROR_E && rc != WS_EOF )
1460- printf ("error with wolfSSH_shutdown()\n" );
1529+ if (attempt == maxAttempt ) {
1530+ printf ("SFTP client gave up on gracefull shutdown,"
1531+ "closing the socket\n" );
1532+ }
14611533 }
14621534 }
1535+
14631536 WCLOSESOCKET (sockFd );
14641537 wolfSSH_free (ssh );
14651538 wolfSSH_CTX_free (ctx );
0 commit comments