@@ -1151,9 +1151,9 @@ static int wolfSSH_SFTP_RecvRealPath(WOLFSSH* ssh, int reqId, byte* data,
11511151{
11521152 WS_SFTP_FILEATRB atr ;
11531153 char r [WOLFSSH_MAX_FILENAME ];
1154- word32 rSz ;
1154+ char s [WOLFSSH_MAX_FILENAME ];
1155+ word32 rSz , sSz ;
11551156 word32 lidx = 0 ;
1156- word32 i ;
11571157 int ret ;
11581158 byte * out ;
11591159 word32 outSz = 0 ;
@@ -1177,16 +1177,14 @@ static int wolfSSH_SFTP_RecvRealPath(WOLFSSH* ssh, int reqId, byte* data,
11771177 lidx += UINT32_SZ ;
11781178 WMEMCPY (r , data + lidx , rSz );
11791179 r [rSz ] = '\0' ;
1180+ WLOG (WS_LOG_SFTP , "Real Path Request = %s" , r );
11801181
1181- /* get working directory in the case of receiving non absolute path */
1182- if (r [0 ] != '/' && r [1 ] != ':' ) {
1182+ if (ssh -> sftpDefaultPath != NULL ) {
1183+ ret = wolfSSH_RealPath (ssh -> sftpDefaultPath , r , s , sizeof s );
1184+ }
1185+ else {
11831186 char wd [WOLFSSH_MAX_FILENAME ];
1184-
11851187 WMEMSET (wd , 0 , WOLFSSH_MAX_FILENAME );
1186- if (ssh -> sftpDefaultPath ) {
1187- XSTRNCPY (wd , ssh -> sftpDefaultPath , WOLFSSH_MAX_FILENAME - 1 );
1188- }
1189- else {
11901188 #ifndef USE_WINDOWS_API
11911189 if (WGETCWD (ssh -> fs , wd , WOLFSSH_MAX_FILENAME ) == NULL ) {
11921190 WLOG (WS_LOG_SFTP , "Unable to get current working directory" );
@@ -1210,40 +1208,18 @@ static int wolfSSH_SFTP_RecvRealPath(WOLFSSH* ssh, int reqId, byte* data,
12101208 return WS_BAD_FILE_E ;
12111209 }
12121210 #endif
1213- }
1214- WSTRNCAT (wd , "/" , WOLFSSH_MAX_FILENAME );
1215- WSTRNCAT (wd , r , WOLFSSH_MAX_FILENAME );
1216- WMEMCPY (r , wd , WOLFSSH_MAX_FILENAME );
1211+ ret = wolfSSH_RealPath (wd , r , s , sizeof s );
12171212 }
1213+ sSz = (word32 )WSTRLEN (s );
12181214
1219- if ((ret = wolfSSH_CleanPath (ssh , r )) < 0 ) {
1220- return WS_FATAL_ERROR ;
1221- }
1222- rSz = (word32 )ret ;
1223-
1224- /* For real path remove ending case of /.
1225- * Lots of peers send a '.' wanting a return of the current absolute path
1226- * not the absolute path + .
1227- */
1228- if (rSz > 2 && r [rSz - 2 ] == WS_DELIM && r [rSz - 1 ] == '.' ) {
1229- r [rSz - 1 ] = '\0' ;
1230- rSz -= 1 ;
1231- }
1232-
1233- /* special case of /. */
1234- if (rSz == 2 && r [0 ] == WS_DELIM && r [1 ] == '.' ) {
1235- r [1 ] = '\0' ;
1236- rSz -= 1 ;
1215+ if (ret != WS_SUCCESS ) {
1216+ return WS_ERROR ;
12371217 }
12381218
1239- /* for real path always send '/' chars */
1240- for (i = 0 ; i < rSz ; i ++ ) {
1241- if (r [i ] == WS_DELIM ) r [i ] = '/' ;
1242- }
1243- WLOG (WS_LOG_SFTP , "Real Path Directory = %s" , r );
1219+ WLOG (WS_LOG_SFTP , "Real Path Directory = %s" , s );
12441220
12451221 /* send response */
1246- outSz = WOLFSSH_SFTP_HEADER + (UINT32_SZ * 3 ) + (rSz * 2 );
1222+ outSz = WOLFSSH_SFTP_HEADER + (UINT32_SZ * 3 ) + (sSz * 2 );
12471223 WMEMSET (& atr , 0 , sizeof (WS_SFTP_FILEATRB ));
12481224 outSz += SFTP_AtributesSz (ssh , & atr );
12491225 lidx = 0 ;
@@ -1264,12 +1240,12 @@ static int wolfSSH_SFTP_RecvRealPath(WOLFSSH* ssh, int reqId, byte* data,
12641240 c32toa (1 , out + lidx ); lidx += UINT32_SZ ; /* only sending one file name */
12651241
12661242 /* set file name size and string */
1267- c32toa (rSz , out + lidx ); lidx += UINT32_SZ ;
1268- WMEMCPY (out + lidx , r , rSz ); lidx += rSz ;
1243+ c32toa (sSz , out + lidx ); lidx += UINT32_SZ ;
1244+ WMEMCPY (out + lidx , s , sSz ); lidx += sSz ;
12691245
12701246 /* set long name size and string */
1271- c32toa (rSz , out + lidx ); lidx += UINT32_SZ ;
1272- WMEMCPY (out + lidx , r , rSz ); lidx += rSz ;
1247+ c32toa (sSz , out + lidx ); lidx += UINT32_SZ ;
1248+ WMEMCPY (out + lidx , s , sSz ); lidx += sSz ;
12731249
12741250 /* set attributes */
12751251 SFTP_SetAttributes (ssh , out + lidx , outSz - lidx , & atr );
@@ -4550,7 +4526,6 @@ static int SFTP_GetAttributes_Handle(WOLFSSH* ssh, byte* handle, int handleSz,
45504526
45514527#elif defined(WOLFSSH_USER_FILESYSTEM )
45524528 /* User-defined I/O support */
4553-
45544529#else
45554530
45564531/* @TODO can be overriden by user for portability
0 commit comments