summaryrefslogtreecommitdiff
path: root/lib/curl_path.c
diff options
context:
space:
mode:
authorJohn DeHelian <john.de.helian@cranepi.com>2017-12-08 11:31:01 -0500
committerDaniel Stenberg <daniel@haxx.se>2017-12-09 13:38:38 +0100
commita4a56ec93e727293f30074f4eac24c19110bd39d (patch)
treeda8c65c9dc9a14e1a1cbf3c6640310b59a507edf /lib/curl_path.c
parent9fb5a943f56496fabd9dc4de6b4b27a2404bfe79 (diff)
downloadcurl-a4a56ec93e727293f30074f4eac24c19110bd39d.tar.gz
sftp: allow quoted commands to use relative paths
Closes #1900
Diffstat (limited to 'lib/curl_path.c')
-rw-r--r--lib/curl_path.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/lib/curl_path.c b/lib/curl_path.c
index cd6592096..e843deac7 100644
--- a/lib/curl_path.c
+++ b/lib/curl_path.c
@@ -110,21 +110,25 @@ CURLcode Curl_getworkingpath(struct connectdata *conn,
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-CURLcode Curl_get_pathname(const char **cpp, char **path)
+CURLcode Curl_get_pathname(const char **cpp, char **path, char *homedir)
{
const char *cp = *cpp, *end;
char quot;
unsigned int i, j;
+ size_t fullPathLength, pathLength;
+ bool relativePath = false;
static const char WHITESPACE[] = " \t\r\n";
- cp += strspn(cp, WHITESPACE);
if(!*cp) {
- *cpp = cp;
+ *cpp = NULL;
*path = NULL;
return CURLE_QUOTE_ERROR;
}
-
- *path = malloc(strlen(cp) + 1);
+ /* Ignore leading whitespace */
+ cp += strspn(cp, WHITESPACE);
+ /* Allocate enough space for home directory and filename + separator */
+ fullPathLength = strlen(cp) + strlen(homedir) + 2;
+ *path = malloc(fullPathLength);
if(*path == NULL)
return CURLE_OUT_OF_MEMORY;
@@ -162,14 +166,26 @@ CURLcode Curl_get_pathname(const char **cpp, char **path)
*cpp = cp + i + strspn(cp + i, WHITESPACE);
}
else {
- /* Read to end of filename */
+ /* Read to end of filename - either to white space or terminator */
end = strpbrk(cp, WHITESPACE);
if(end == NULL)
end = strchr(cp, '\0');
+ /* return pointer to second parameter if it exists */
*cpp = end + strspn(end, WHITESPACE);
-
- memcpy(*path, cp, end - cp);
- (*path)[end - cp] = '\0';
+ pathLength = 0;
+ relativePath = (cp[0] == '/' && cp[1] == '~' && cp[2] == '/');
+ /* Handling for relative path - prepend home directory */
+ if(relativePath) {
+ strcpy(*path, homedir);
+ pathLength = strlen(homedir);
+ (*path)[pathLength++] = '/';
+ (*path)[pathLength] = '\0';
+ cp += 3;
+ }
+ /* Copy path name up until first "white space" */
+ memcpy(&(*path)[pathLength], cp, (int)(end - cp));
+ pathLength += (int)(end - cp);
+ (*path)[pathLength] = '\0';
}
return CURLE_OK;