Skip to content

Commit 89c793d

Browse files
committed
Fix SCP server side
SCP on the server side would get an EAGAIN around the 128KB mark, which would trigger an error. That error in-turn would cause two attempts to close the file, which would segfault. Also fix inverted error return status on scpclient.
1 parent 697f54a commit 89c793d

File tree

9 files changed

+98
-36
lines changed

9 files changed

+98
-36
lines changed

apps/wolfsshd/test/run_all_sshd_tests.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ test_cases=(
88
"sshd_term_size_test.sh"
99
"sshd_large_sftp_test.sh"
1010
"sshd_bad_sftp_test.sh"
11+
"sshd_scp_fail.sh"
1112
"sshd_term_close_test.sh"
1213
"ssh_kex_algos.sh"
1314
)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/bin/sh
2+
3+
# sshd local test
4+
5+
PWD=`pwd`
6+
cd ../../..
7+
8+
TEST_SCP_CLIENT="./examples/scpclient/wolfscp"
9+
USER=`whoami`
10+
PRIVATE_KEY="./keys/hansel-key-ecc.der"
11+
PUBLIC_KEY="./keys/hansel-key-ecc.pub"
12+
13+
if [ -z "$1" ] || [ -z "$2" ]; then
14+
echo "expecting host and port as arguments"
15+
echo "./sshd_exec_test.sh 127.0.0.1 22222"
16+
exit 1
17+
fi
18+
19+
mkdir test-$$
20+
21+
OUTDIR="`pwd`/test-$$"
22+
23+
dd if=/dev/random of=$OUTDIR/test.dat bs=1024 count=512
24+
25+
echo "$TEST_SCP_CLIENT -u $USER -i $PRIVATE_KEY -j $PUBLIC_KEY -S$OUTDIR/test.dat:. -H $1 -p $2"
26+
$TEST_SCP_CLIENT -u $USER -i $PRIVATE_KEY -j $PUBLIC_KEY -S$OUTDIR/test.dat:. -H $1 -p $2
27+
28+
RESULT=$?
29+
if [ "$RESULT" != "0" ]; then
30+
echo "Expecting to pass transfer"
31+
exit 1
32+
fi
33+
34+
MD5SOURCE=`md5sum $OUTDIR/test.dat | awk '{ print $1 }'`
35+
MD5DEST=`md5sum test.dat | awk '{ print $1 }'`
36+
37+
if [ "$MD5SOURCE" != "$MD5DEST" ]; then
38+
echo "Files do not match $MD5SOURCE != $MD5DEST"
39+
exit 1
40+
fi
41+
42+
rm -rf test-$$
43+
rm testout.dat
44+
45+
cd $PWD
46+
exit 0
47+

examples/scpclient/scpclient.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ THREAD_RETURN WOLFSSH_THREAD scp_client(void* args)
344344
wc_ecc_fp_free(); /* free per thread cache */
345345
#endif
346346

347-
if (ret != WS_SUCCESS)
347+
if ((ret != WS_SUCCESS) && (ret != WS_CHANNEL_CLOSED))
348348
((func_args*)args)->return_code = 1;
349349
return 0;
350350
}

keys/ca-cert-ecc.der

1 Byte
Binary file not shown.

keys/ca-cert-ecc.pem

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ Certificate:
33
Version: 3 (0x2)
44
Serial Number: 6 (0x6)
55
Signature Algorithm: ecdsa-with-SHA256
6-
Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = [email protected]
6+
Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=[email protected]
77
Validity
8-
Not Before: Oct 1 05:54:44 2022 GMT
9-
Not After : Sep 28 05:54:44 2032 GMT
10-
Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = [email protected]
8+
Not Before: Feb 19 10:16:58 2025 GMT
9+
Not After : Feb 17 10:16:58 2035 GMT
10+
Subject: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=[email protected]
1111
Subject Public Key Info:
1212
Public Key Algorithm: id-ecPublicKey
1313
Public-Key: (256 bit)
@@ -26,22 +26,22 @@ Certificate:
2626
keyid:56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21
2727
DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=www.wolfssl.com/[email protected]
2828
serial:06
29-
3029
X509v3 Basic Constraints: critical
3130
CA:TRUE
3231
X509v3 Key Usage: critical
3332
Digital Signature, Certificate Sign, CRL Sign
3433
Signature Algorithm: ecdsa-with-SHA256
35-
30:45:02:20:18:bc:74:fd:d9:26:f2:f5:c2:f3:f5:cd:99:38:
36-
9d:85:7d:8b:67:c8:f5:51:4a:5a:88:b6:3f:61:38:6b:9f:11:
37-
02:21:00:f1:95:08:34:2b:47:32:93:8c:10:4b:4b:fd:6e:22:
38-
f2:48:3b:5d:8a:74:46:24:7d:30:eb:65:15:06:e4:38:e0
34+
Signature Value:
35+
30:46:02:21:00:89:3c:83:7d:39:e1:f5:dd:48:f4:c0:f7:16:
36+
ba:64:28:8d:9c:1f:f2:96:97:48:c9:31:ca:75:c0:13:d4:3d:
37+
0c:02:21:00:f2:21:8a:3d:45:5d:cc:2a:22:11:e0:11:b3:54:
38+
3f:7f:99:ea:ab:85:28:31:7c:c2:3f:50:d8:42:f2:23:e6:d2
3939
-----BEGIN CERTIFICATE-----
40-
MIIDJjCCAsygAwIBAgIBBjAKBggqhkjOPQQDAjCBlTELMAkGA1UEBhMCVVMxEzAR
40+
MIIDJzCCAsygAwIBAgIBBjAKBggqhkjOPQQDAjCBlTELMAkGA1UEBhMCVVMxEzAR
4141
BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv
4242
bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz
43-
bC5jb20xHTAbBgkqhkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTIyMTAwMTA1
44-
NTQ0NFoXDTMyMDkyODA1NTQ0NFowgZUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApX
43+
bC5jb20xHTAbBgkqhkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTI1MDIxOTEw
44+
MTY1OFoXDTM1MDIxNzEwMTY1OFowgZUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApX
4545
YXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQw
4646
EgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR0w
4747
GwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
@@ -52,6 +52,6 @@ pSGhgZukgZgwgZUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAw
5252
DgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZl
5353
bG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR0wGwYJKoZIhvcNAQkB
5454
Fg5jYUBleGFtcGxlLmNvbYIBBjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
55-
AwIBhjAKBggqhkjOPQQDAgNIADBFAiAYvHT92Sby9cLz9c2ZOJ2FfYtnyPVRSlqI
56-
tj9hOGufEQIhAPGVCDQrRzKTjBBLS/1uIvJIO12KdEYkfTDrZRUG5Djg
55+
AwIBhjAKBggqhkjOPQQDAgNJADBGAiEAiTyDfTnh9d1I9MD3FrpkKI2cH/KWl0jJ
56+
Mcp1wBPUPQwCIQDyIYo9RV3MKiIR4BGzVD9/meqrhSgxfMI/UNhC8iPm0g==
5757
-----END CERTIFICATE-----

keys/renewcerts.cnf

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ authorityKeyIdentifier=keyid:always,issuer:always
3737
basicConstraints = critical,CA:true
3838
keyUsage = critical, digitalSignature, keyCertSign, cRLSign
3939

40-
# Extensions for fred cert
41-
[ v3_fred ]
40+
# Extensions for root cert
41+
[ v3_root ]
4242
subjectKeyIdentifier=hash
4343
authorityKeyIdentifier=keyid:always,issuer:always
44-
subjectAltName = @fred_altnames
44+
subjectAltName = @root_altnames
4545

46-
[ fred_altnames ]
47-
otherName = msUPN;UTF8:fred@example
46+
[ root_altnames ]
47+
otherName = msUPN;UTF8:root@example
4848

4949
# Extensions for server cert
5050
[ v3_server ]

keys/server-cert.der

-1 Bytes
Binary file not shown.

keys/server-cert.pem

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ Certificate:
33
Version: 3 (0x2)
44
Serial Number: 8 (0x8)
55
Signature Algorithm: ecdsa-with-SHA256
6-
Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = [email protected]
6+
Issuer: C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com, emailAddress=[email protected]
77
Validity
8-
Not Before: Oct 1 05:54:44 2022 GMT
9-
Not After : Sep 28 05:54:44 2032 GMT
10-
Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = [email protected]
8+
Not Before: Feb 19 10:16:59 2025 GMT
9+
Not After : Feb 17 10:16:59 2035 GMT
10+
Subject: C=US, ST=Washington, L=Seattle, O=Eliptic, OU=ECC, CN=www.wolfssl.com, emailAddress=[email protected]
1111
Subject Public Key Info:
1212
Public Key Algorithm: id-ecPublicKey
1313
Public-Key: (256 bit)
@@ -26,20 +26,20 @@ Certificate:
2626
keyid:56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21
2727
DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=www.wolfssl.com/[email protected]
2828
serial:06
29-
3029
X509v3 Subject Alternative Name:
3130
DNS:example, IP Address:127.0.0.1
3231
Signature Algorithm: ecdsa-with-SHA256
33-
30:45:02:20:42:d8:a0:95:e7:aa:4e:63:fd:50:6e:6b:f9:98:
34-
90:be:3d:44:53:68:1b:66:dd:22:a3:12:77:70:94:56:db:82:
35-
02:21:00:ce:18:b2:10:b2:2d:2a:b9:79:d4:76:64:df:28:91:
36-
23:8d:93:22:e9:4b:ea:7f:49:4e:eb:65:ce:c8:86:ba:fb
32+
Signature Value:
33+
30:44:02:20:75:7f:24:0a:80:3c:90:38:3a:a1:16:86:ba:44:
34+
43:0a:75:34:52:a0:d0:2e:29:b1:a1:92:e3:85:d2:b4:24:be:
35+
02:20:63:d5:b8:eb:3c:cf:19:3e:60:78:7b:01:f1:e4:94:d6:
36+
fd:3a:73:f1:05:a1:74:07:fd:cb:55:59:fc:2c:19:72
3737
-----BEGIN CERTIFICATE-----
38-
MIIDGjCCAsCgAwIBAgIBCDAKBggqhkjOPQQDAjCBlTELMAkGA1UEBhMCVVMxEzAR
38+
MIIDGTCCAsCgAwIBAgIBCDAKBggqhkjOPQQDAjCBlTELMAkGA1UEBhMCVVMxEzAR
3939
BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv
4040
bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz
41-
bC5jb20xHTAbBgkqhkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTIyMTAwMTA1
42-
NTQ0NFoXDTMyMDkyODA1NTQ0NFowgZExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApX
41+
bC5jb20xHTAbBgkqhkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTI1MDIxOTEw
42+
MTY1OVoXDTM1MDIxNzEwMTY1OVowgZExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApX
4343
YXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMQww
4444
CgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEhMB8GCSqGSIb3
4545
DQEJARYSc2VydmVyQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
@@ -50,6 +50,6 @@ pIGYMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UE
5050
BwwHU2VhdHRsZTEQMA4GA1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1l
5151
bnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEdMBsGCSqGSIb3DQEJARYOY2FA
5252
ZXhhbXBsZS5jb22CAQYwGAYDVR0RBBEwD4IHZXhhbXBsZYcEfwAAATAKBggqhkjO
53-
PQQDAgNIADBFAiBC2KCV56pOY/1Qbmv5mJC+PURTaBtm3SKjEndwlFbbggIhAM4Y
54-
shCyLSq5edR2ZN8okSONkyLpS+p/SU7rZc7Ihrr7
53+
PQQDAgNHADBEAiB1fyQKgDyQODqhFoa6REMKdTRSoNAuKbGhkuOF0rQkvgIgY9W4
54+
6zzPGT5geHsB8eSU1v06c/EFoXQH/ctVWfwsGXI=
5555
-----END CERTIFICATE-----

src/wolfscp.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ int DoScpSource(WOLFSSH* ssh)
602602
ssh->scpBufferedSz);
603603
if (ret == WS_WINDOW_FULL || ret == WS_REKEYING) {
604604
ret = wolfSSH_worker(ssh, NULL);
605-
if (ret == WS_SUCCESS)
605+
if (ret == WS_SUCCESS || ssh->error == WS_WANT_READ)
606606
continue;
607607
}
608608
if (ret == WS_EXTDATA) {
@@ -616,8 +616,10 @@ int DoScpSource(WOLFSSH* ssh)
616616
* open file descriptor before exit */
617617
ScpSendCtx* sendCtx = NULL;
618618
sendCtx = (ScpSendCtx*)wolfSSH_GetScpSendCtx(ssh);
619-
if (sendCtx != NULL)
619+
if (sendCtx != NULL) {
620620
WFCLOSE(ssh->fs, sendCtx->fp);
621+
sendCtx->fp = NULL;
622+
}
621623
#endif
622624
WLOG(WS_LOG_ERROR, scpError, "failed to send file", ret);
623625
break;
@@ -1181,6 +1183,7 @@ static int ParseBasePathHelper(WOLFSSH* ssh, int cmdSz)
11811183

11821184
if (ScpPushDir(ssh->fs, &ctx, ssh->scpBasePath, ssh->ctx->heap) != WS_SUCCESS) {
11831185
WLOG(WS_LOG_DEBUG, "scp : issue opening base dir");
1186+
ssh->error = WS_INVALID_PATH_E;
11841187
ret = WS_FATAL_ERROR;
11851188
}
11861189
else {
@@ -2021,6 +2024,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
20212024
WLOG(WS_LOG_ERROR, scpError, "scp receive callback unable "
20222025
"to write requested size to file", bytes);
20232026
WFCLOSE(ssh->fs, fp);
2027+
fp = NULL;
20242028
ret = WS_SCP_ABORT;
20252029
} else {
20262030
#ifdef WOLFSCP_FLUSH
@@ -2047,6 +2051,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
20472051
flush_bytes = 0;
20482052
#endif
20492053
WFCLOSE(ssh->fs, fp);
2054+
fp = NULL;
20502055
}
20512056

20522057
/* set timestamp info */
@@ -2587,6 +2592,7 @@ static int ScpProcessEntry(WOLFSSH* ssh, char* fileName, word64* mTime,
25872592
if ((sendCtx->fp != NULL) &&
25882593
((ret < 0) || (*totalFileSz == (word32)ret))) {
25892594
WFCLOSE(ssh->fs, sendCtx->fp);
2595+
sendCtx->fp = NULL;
25902596
}
25912597
}
25922598

@@ -2758,6 +2764,7 @@ int wsScpSendCallback(WOLFSSH* ssh, int state, const char* peerRequest,
27582764
if ((sendCtx != NULL) && (sendCtx->fp != NULL) &&
27592765
((ret < 0) || (*totalFileSz == (word32)ret))) {
27602766
WFCLOSE(ssh->fs, sendCtx->fp);
2767+
sendCtx->fp = NULL;
27612768
}
27622769

27632770
break;
@@ -2840,13 +2847,20 @@ int wsScpSendCallback(WOLFSSH* ssh, int state, const char* peerRequest,
28402847
break;
28412848
}
28422849

2850+
if (sendCtx->fp == NULL) {
2851+
WLOG(WS_LOG_ERROR, "scp: file has been closed, abort");
2852+
ret = WS_SCP_ABORT;
2853+
break;
2854+
}
2855+
28432856
ret = (word32)WFREAD(ssh->fs, buf, 1, bufSz, sendCtx->fp);
28442857
if (ret == 0) { /* handle case of EOF */
28452858
ret = WS_EOF;
28462859
}
28472860

28482861
if ((ret <= 0) || (fileOffset + ret == *totalFileSz)) {
28492862
WFCLOSE(ssh->fs, sendCtx->fp);
2863+
sendCtx->fp = NULL;
28502864
}
28512865

28522866
break;

0 commit comments

Comments
 (0)