Skip to content

Commit 88263dd

Browse files
add rekey check to sftp client and use reletave path to file in test case
1 parent 462d77b commit 88263dd

2 files changed

Lines changed: 37 additions & 33 deletions

File tree

.github/workflows/windows-sftp.yml

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -318,16 +318,15 @@ jobs:
318318
}
319319
Write-Host "Basic SFTP test passed"
320320
321-
- name: Create 3GB test file and run SFTP get/put (large_rw)
322-
if: matrix.test_type == 'large_rw'
321+
- name: Create 3GB test file and run SFTP get/put
323322
working-directory: ${{ github.workspace }}\wolfssh
324323
shell: pwsh
325324
timeout-minutes: 25
326325
run: |
327326
$sftpPath = $env:SFTP_PATH
328-
$workDir = (Get-Location).Path
327+
$workDir = Join-Path $env:GITHUB_WORKSPACE "wolfssh"
329328
$largeFile = Join-Path $workDir "large_test.dat"
330-
$getDest = Join-Path $workDir "large_test_copy.dat"
329+
$getDestPath = Join-Path $workDir "large_test_copy.dat"
331330
332331
# Create 3GB file: one random 10MB chunk repeated 307x + 2MB
333332
Write-Host "Creating 3GB test file..."
@@ -346,57 +345,62 @@ jobs:
346345
$fs.Close()
347346
348347
$hash = Get-FileHash -Path $largeFile -Algorithm SHA256
349-
$hash.Hash | Out-File -FilePath large_test.dat.sha256
348+
$hash.Hash | Out-File -FilePath (Join-Path $workDir "large_test.dat.sha256")
350349
Write-Host "Created 3GB file, SHA256: $($hash.Hash)"
351350
352351
# SFTP PUT (upload)
353352
Write-Host "SFTP PUT 3GB file..."
354353
$putCommands = "put $largeFile /large_test.dat`nquit"
355-
$putCommands | Out-File -FilePath sftp_put_commands.txt -Encoding ASCII
354+
$putCommands | Out-File -FilePath (Join-Path $workDir "sftp_put_commands.txt") -Encoding ASCII
356355
$proc = Start-Process -FilePath $sftpPath `
357356
-ArgumentList "-u", "testuser", "-P", $env:TESTUSER_PASSWORD, "-h", "localhost", "-p", "${{env.TEST_PORT}}" `
358-
-RedirectStandardInput "sftp_put_commands.txt" `
359-
-RedirectStandardOutput "sftp_put_out.txt" `
360-
-RedirectStandardError "sftp_put_err.txt" `
357+
-WorkingDirectory $workDir `
358+
-RedirectStandardInput (Join-Path $workDir "sftp_put_commands.txt") `
359+
-RedirectStandardOutput (Join-Path $workDir "sftp_put_out.txt") `
360+
-RedirectStandardError (Join-Path $workDir "sftp_put_err.txt") `
361361
-Wait -NoNewWindow -PassThru
362362
363-
if ($proc.ExitCode -ne 0) {
364-
Get-Content sftp_put_out.txt
365-
Get-Content sftp_put_err.txt
363+
$putOut = Get-Content (Join-Path $workDir "sftp_put_out.txt") -Raw -ErrorAction SilentlyContinue
364+
Write-Host "=== SFTP PUT output ==="; Write-Host $putOut
365+
if ($proc.ExitCode -ne 0 -or $putOut -match "Error pushing file") {
366+
Get-Content (Join-Path $workDir "sftp_put_err.txt") -ErrorAction SilentlyContinue
366367
Write-Host "ERROR: SFTP PUT failed"
367368
exit 1
368369
}
369370
Write-Host "PUT succeeded"
370371
371-
# SFTP GET (download)
372+
# SFTP GET (download) - use relative local path so the file lands in $workDir
373+
# (wolfsftp runs with -WorkingDirectory $workDir via Start-Process)
372374
Write-Host "SFTP GET 3GB file..."
373-
$getCommands = "get /large_test.dat $getDest`nquit"
374-
$getCommands | Out-File -FilePath sftp_get_commands.txt -Encoding ASCII
375+
$getCommands = "get /large_test.dat large_test_copy.dat`nquit"
376+
$getCommands | Out-File -FilePath (Join-Path $workDir "sftp_get_commands.txt") -Encoding ASCII
375377
$proc2 = Start-Process -FilePath $sftpPath `
376378
-ArgumentList "-u", "testuser", "-P", $env:TESTUSER_PASSWORD, "-h", "localhost", "-p", "${{env.TEST_PORT}}" `
377-
-RedirectStandardInput "sftp_get_commands.txt" `
378-
-RedirectStandardOutput "sftp_get_out.txt" `
379-
-RedirectStandardError "sftp_get_err.txt" `
379+
-WorkingDirectory $workDir `
380+
-RedirectStandardInput (Join-Path $workDir "sftp_get_commands.txt") `
381+
-RedirectStandardOutput (Join-Path $workDir "sftp_get_out.txt") `
382+
-RedirectStandardError (Join-Path $workDir "sftp_get_err.txt") `
380383
-Wait -NoNewWindow -PassThru
381384
382-
if ($proc2.ExitCode -ne 0) {
383-
Get-Content sftp_get_out.txt
384-
Get-Content sftp_get_err.txt
385+
$getOut = Get-Content (Join-Path $workDir "sftp_get_out.txt") -Raw -ErrorAction SilentlyContinue
386+
Write-Host "=== SFTP GET output ==="; Write-Host $getOut
387+
if ($proc2.ExitCode -ne 0 -or $getOut -match "Error getting file") {
388+
Get-Content (Join-Path $workDir "sftp_get_err.txt") -ErrorAction SilentlyContinue
385389
Write-Host "ERROR: SFTP GET failed"
386390
exit 1
387391
}
388392
Write-Host "GET succeeded"
389393
390-
# Verify integrity
391-
$expectedHash = (Get-Content large_test.dat.sha256).Trim()
392-
$actualHash = (Get-FileHash -Path $getDest -Algorithm SHA256).Hash
394+
# Verify integrity (file is in $workDir from GET with relative path)
395+
$expectedHash = (Get-Content (Join-Path $workDir "large_test.dat.sha256")).Trim()
396+
$actualHash = (Get-FileHash -Path $getDestPath -Algorithm SHA256).Hash
393397
if ($expectedHash -ne $actualHash) {
394398
Write-Host "ERROR: SHA256 mismatch - PUT/GET corruption"
395399
Write-Host "Expected: $expectedHash"
396400
Write-Host "Actual: $actualHash"
397401
exit 1
398402
}
399-
Write-Host "PASS: 3GB SFTP get/put with WOLFSSH_MAX_SFTP_RW=10485760 succeeded"
403+
Write-Host "PASS: 3GB SFTP get/put succeeded"
400404
401405
- name: Cleanup
402406
if: always()

examples/sftpclient/sftpclient.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -769,8 +769,8 @@ static int doCmds(func_args* args)
769769

770770
ret = wolfSSH_SFTP_STAT(ssh, pt, &atrb);
771771
err = wolfSSH_get_error(ssh);
772-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
773-
&& ret != WS_SUCCESS);
772+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
773+
err == WS_REKEYING) && ret != WS_SUCCESS);
774774
if (ret != WS_SUCCESS) {
775775
if (SFTP_FPUTS(args, "Error changing directory\n") < 0) {
776776
err_msg("fputs error");
@@ -857,8 +857,8 @@ static int doCmds(func_args* args)
857857

858858
ret = wolfSSH_SFTP_CHMOD(ssh, pt, mode);
859859
err = wolfSSH_get_error(ssh);
860-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
861-
&& ret != WS_SUCCESS);
860+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
861+
err == WS_REKEYING) && ret != WS_SUCCESS);
862862
if (ret != WS_SUCCESS) {
863863
if (SFTP_FPUTS(args, "Unable to change permissions of ") < 0) {
864864
err_msg("fputs error");
@@ -914,8 +914,8 @@ static int doCmds(func_args* args)
914914

915915
ret = wolfSSH_SFTP_RMDIR(ssh, pt);
916916
err = wolfSSH_get_error(ssh);
917-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
918-
&& ret != WS_SUCCESS);
917+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
918+
err == WS_REKEYING) && ret != WS_SUCCESS);
919919
if (ret != WS_SUCCESS) {
920920
if (ret == WS_PERMISSIONS) {
921921
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0) {
@@ -967,8 +967,8 @@ static int doCmds(func_args* args)
967967

968968
ret = wolfSSH_SFTP_Remove(ssh, pt);
969969
err = wolfSSH_get_error(ssh);
970-
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE)
971-
&& ret != WS_SUCCESS);
970+
} while ((err == WS_WANT_READ || err == WS_WANT_WRITE ||
971+
err == WS_REKEYING) && ret != WS_SUCCESS);
972972
if (ret != WS_SUCCESS) {
973973
if (ret == WS_PERMISSIONS) {
974974
if (SFTP_FPUTS(args, "Insufficient permissions\n") < 0) {

0 commit comments

Comments
 (0)