Skip to content
Snippets Groups Projects
Commit c0c2c2a6 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Fix sftp_resolve_path() to return '/' instead of empty string

Also fail early if parsing underruns root.
parent 4a6d6672
No related branches found
No related tags found
No related merge requests found
Pipeline #6032 passed
...@@ -305,7 +305,18 @@ extern int thread_suid_broken; /* NPTL is no longer broken */ ...@@ -305,7 +305,18 @@ extern int thread_suid_broken; /* NPTL is no longer broken */
#include "mqtt.h" #include "mqtt.h"
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
/*
* MSVC (correctly) warns that flexible arrays are not part of C++
* Since these are used in this header, disable the warning
*/
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4200)
#endif
#include "sftp.h" #include "sftp.h"
#ifdef _MSC_VER
#pragma warning(pop)
#endif
} }
#endif #endif
......
...@@ -645,12 +645,14 @@ sftp_resolve_path(char *target, const char *path, size_t size) ...@@ -645,12 +645,14 @@ sftp_resolve_path(char *target, const char *path, size_t size)
{ {
char *out; char *out;
char *p; char *p;
bool target_alloced=false;
if(target==NULL) { if(target==NULL) {
size = MAX_PATH + 1; size = MAX_PATH + 1;
if((target=(char*)malloc(size))==NULL) { if((target=(char*)malloc(size))==NULL) {
return(NULL); return(NULL);
} }
target_alloced=true;
} }
strncpy(target, path, size); strncpy(target, path, size);
target[size-1] = 0; target[size-1] = 0;
...@@ -665,8 +667,11 @@ sftp_resolve_path(char *target, const char *path, size_t size) ...@@ -665,8 +667,11 @@ sftp_resolve_path(char *target, const char *path, size_t size)
else if(*(out+1)=='.' && *(out+2)=='.' && (*(out+3)=='/' || *(out+3)==0)) { else if(*(out+1)=='.' && *(out+2)=='.' && (*(out+3)=='/' || *(out+3)==0)) {
*out=0; *out=0;
p=strrchr(target,'/'); p=strrchr(target,'/');
if(p==NULL) if(p==NULL) {
p=target; if (target_alloced)
free(target);
return nullptr;
}
memmove(p,out+3,strlen(out+3)+1); memmove(p,out+3,strlen(out+3)+1);
out=p; out=p;
} }
...@@ -674,8 +679,10 @@ sftp_resolve_path(char *target, const char *path, size_t size) ...@@ -674,8 +679,10 @@ sftp_resolve_path(char *target, const char *path, size_t size)
out++; out++;
} }
} }
if (!*out) }
break; if (size > 1 && *target == 0) {
target[0] = '/';
target[1] = 0;
} }
return(target); return(target);
} }
...@@ -700,6 +707,8 @@ sftp_parse_crealpath(sbbs_t *sbbs, const char *filename) ...@@ -700,6 +707,8 @@ sftp_parse_crealpath(sbbs_t *sbbs, const char *filename)
else { else {
ret = sftp_resolve_path(nullptr, filename, 0); ret = sftp_resolve_path(nullptr, filename, 0);
} }
if (ret == nullptr)
return ret;
if (ret[0] == 0) { if (ret[0] == 0) {
free(ret); free(ret);
return nullptr; return nullptr;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment