Skip to content

Commit ea563b5

Browse files
authored
Merge pull request #865 from JacobBarthelmeh/windows
improvements to wolfSSH_CleanPath function used with SCP
2 parents 7d48298 + 4cc065b commit ea563b5

File tree

3 files changed

+22
-19
lines changed

3 files changed

+22
-19
lines changed

src/internal.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16992,17 +16992,17 @@ int wolfSSH_GetPath(const char* defaultPath, byte* in, word32 inSz,
1699216992
}
1699316993

1699416994

16995-
/* cleans up absolute path
16995+
/* Cleans up absolute path, OS specific.
1699616996
* returns size of new path on success (strlen sz) and negative values on fail*/
16997-
int wolfSSH_CleanPath(WOLFSSH* ssh, char* in)
16997+
int wolfSSH_CleanPath(WOLFSSH* ssh, char* in, int inSz)
1699816998
{
1699916999
int i;
1700017000
long sz;
1700117001
byte found;
1700217002
char *path;
1700317003
void *heap = NULL;
1700417004

17005-
if (in == NULL) {
17005+
if (in == NULL || inSz <= 0) {
1700617006
return WS_BAD_ARGUMENT;
1700717007
}
1700817008

@@ -17011,7 +17011,9 @@ int wolfSSH_CleanPath(WOLFSSH* ssh, char* in)
1701117011
}
1701217012

1701317013
sz = (long)WSTRLEN(in);
17014-
path = (char*)WMALLOC(sz+1, heap, DYNTYPE_PATH);
17014+
17015+
/* +2 to handle extra delimiter and null terminator */
17016+
path = (char*)WMALLOC(sz+2, heap, DYNTYPE_PATH);
1701517017
if (path == NULL) {
1701617018
return WS_MEMORY_E;
1701717019
}
@@ -17094,8 +17096,6 @@ int wolfSSH_CleanPath(WOLFSSH* ssh, char* in)
1709417096
if (path[sz - 1] == ':') {
1709517097
path[sz] = WS_DELIM;
1709617098
path[sz + 1] = '\0';
17097-
in[sz] = WS_DELIM;
17098-
in[sz + 1] = '\0';
1709917099
}
1710017100

1710117101
/* clean up any multiple drive listed i.e. A:/A: */
@@ -17141,12 +17141,13 @@ int wolfSSH_CleanPath(WOLFSSH* ssh, char* in)
1714117141
}
1714217142

1714317143
/* copy result back to 'in' buffer */
17144-
if (WSTRLEN(in) < WSTRLEN(path)) {
17145-
WLOG(WS_LOG_ERROR, "Fatal error cleaning path");
17144+
sz = (long)WSTRLEN(path);
17145+
if (sz >= (long)inSz) {
17146+
/* Path would overflow input buffer */
17147+
WLOG(WS_LOG_ERROR, "Fatal error cleaning path: buffer overflow");
1714617148
WFREE(path, heap, DYNTYPE_PATH);
1714717149
return WS_BUFFER_E;
1714817150
}
17149-
sz = (long)WSTRLEN(path);
1715017151
WMEMCPY(in, path, sz);
1715117152
in[sz] = '\0';
1715217153
WFREE(path, heap, DYNTYPE_PATH);

src/wolfscp.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,7 +1138,7 @@ static int ScpCheckForRename(WOLFSSH* ssh, int cmdSz)
11381138
buf[sz] = '\0';
11391139
WSTRNCAT(buf, "/..", DEFAULT_SCP_MSG_SZ);
11401140

1141-
idx = wolfSSH_CleanPath(ssh, buf);
1141+
idx = wolfSSH_CleanPath(ssh, buf, DEFAULT_SCP_MSG_SZ);
11421142
if (idx < 0) {
11431143
return WS_FATAL_ERROR;
11441144
}
@@ -1304,7 +1304,8 @@ int ParseScpCommand(WOLFSSH* ssh)
13041304
WMEMCPY(ssh->scpBasePathDynamic, cmd + idx,
13051305
cmdSz - idx);
13061306
if (wolfSSH_CleanPath(ssh,
1307-
ssh->scpBasePathDynamic) < 0) {
1307+
ssh->scpBasePathDynamic,
1308+
ssh->scpBasePathSz) < 0) {
13081309
ret = WS_FATAL_ERROR;
13091310
}
13101311
else {
@@ -1330,7 +1331,8 @@ int ParseScpCommand(WOLFSSH* ssh)
13301331
WMEMCPY(ssh->scpBasePathDynamic, cmd + idx,
13311332
cmdSz - idx);
13321333
if (wolfSSH_CleanPath(ssh,
1333-
ssh->scpBasePathDynamic) < 0)
1334+
ssh->scpBasePathDynamic,
1335+
ssh->scpBasePathSz) < 0)
13341336
ret = WS_FATAL_ERROR;
13351337
}
13361338
break;
@@ -1972,7 +1974,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
19721974
{
19731975
DSTAT stat;
19741976

1975-
wolfSSH_CleanPath(ssh, (char*)basePath);
1977+
wolfSSH_CleanPath(ssh, (char*)basePath, WOLFSSH_MAX_FILENAME);
19761978
/* make sure is directory */
19771979
if ((ret = NU_Get_First(&stat, basePath)) != NU_SUCCESS) {
19781980
/* if back to root directory i.e. A:/ then handle case
@@ -2020,7 +2022,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
20202022
WSTRNCAT(abslut, (char*)basePath, WOLFSSH_MAX_FILENAME);
20212023
WSTRNCAT(abslut, "/", WOLFSSH_MAX_FILENAME);
20222024
WSTRNCAT(abslut, fileName, WOLFSSH_MAX_FILENAME);
2023-
wolfSSH_CleanPath(ssh, abslut);
2025+
wolfSSH_CleanPath(ssh, abslut, WOLFSSH_MAX_FILENAME);
20242026
if (WFOPEN(ssh->fs, &fp, abslut, "wb") != 0) {
20252027
#else
20262028
if (WFOPEN(ssh->fs, &fp, fileName, "wb") != 0) {
@@ -2106,7 +2108,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
21062108
WSTRNCAT(abslut, (char*)basePath, WOLFSSH_MAX_FILENAME);
21072109
WSTRNCAT(abslut, "/", WOLFSSH_MAX_FILENAME);
21082110
WSTRNCAT(abslut, fileName, WOLFSSH_MAX_FILENAME);
2109-
wolfSSH_CleanPath(ssh, abslut);
2111+
wolfSSH_CleanPath(ssh, abslut, WOLFSSH_MAX_FILENAME);
21102112
if (WMKDIR(ssh->fs, abslut, fileMode) != 0) {
21112113
/* check if directory already exists */
21122114
if (NU_Make_Dir(abslut) != NUF_EXIST) {
@@ -2134,7 +2136,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
21342136
#ifdef WOLFSSL_NUCLEUS
21352137
WSTRNCAT((char*)basePath, "/", sizeof("/"));
21362138
WSTRNCAT((char*)basePath, fileName, WOLFSSH_MAX_FILENAME);
2137-
wolfSSH_CleanPath(ssh, (char*)basePath);
2139+
wolfSSH_CleanPath(ssh, (char*)basePath, WOLFSSH_MAX_FILENAME);
21382140
#else
21392141
if (WCHDIR(ssh->fs, fileName) != 0) {
21402142
WLOG(WS_LOG_ERROR,
@@ -2151,7 +2153,7 @@ int wsScpRecvCallback(WOLFSSH* ssh, int state, const char* basePath,
21512153
/* cd out of directory */
21522154
#ifdef WOLFSSL_NUCLEUS
21532155
WSTRNCAT((char*)basePath, "/..", WOLFSSH_MAX_FILENAME - 1);
2154-
wolfSSH_CleanPath(ssh, (char*)basePath);
2156+
wolfSSH_CleanPath(ssh, (char*)basePath, WOLFSSH_MAX_FILENAME);
21552157
#else
21562158
if (WCHDIR(ssh->fs, "..") != 0) {
21572159
WLOG(WS_LOG_ERROR,
@@ -2564,7 +2566,7 @@ static int ScpProcessEntry(WOLFSSH* ssh, char* fileName, word64* mTime,
25642566
DEFAULT_SCP_FILE_NAME_SZ);
25652567
WSTRNCPY(fileName, sendCtx->currentDir->dir.lfname,
25662568
DEFAULT_SCP_FILE_NAME_SZ);
2567-
if (wolfSSH_CleanPath(ssh, filePath) < 0) {
2569+
if (wolfSSH_CleanPath(ssh, filePath, DEFAULT_SCP_FILE_NAME_SZ) < 0) {
25682570
ret = WS_SCP_ABORT;
25692571
}
25702572
#elif defined(USE_WINDOWS_API)

wolfssh/internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,7 @@ WOLFSSH_LOCAL int wsScpSendCallback(WOLFSSH*, int, const char*, char*, word32,
14111411
#endif
14121412

14131413

1414-
WOLFSSH_LOCAL int wolfSSH_CleanPath(WOLFSSH* ssh, char* in);
1414+
WOLFSSH_LOCAL int wolfSSH_CleanPath(WOLFSSH* ssh, char* in, int inSz);
14151415
#ifndef WOLFSSH_NO_RSA
14161416
WOLFSSH_LOCAL int wolfSSH_RsaVerify(
14171417
const byte *sig, word32 sigSz,

0 commit comments

Comments
 (0)