libssh2: put the readdir buffers into struct
... instead of separate malloc() calls: - removes two mallocs (and associated error handling paths) - makes cleanup easier Also reduce maximum SFTP file path lengths to 1024 bytes universally everywhere. Using the system's own MAX_PATH did not make sense since this is mostly about getting a remote file name. Closes #15285
This commit is contained in:
parent
1cf187a4f6
commit
083b4ab6e4
@ -26,9 +26,9 @@
|
|||||||
|
|
||||||
#if defined(USE_SSH)
|
#if defined(USE_SSH)
|
||||||
|
|
||||||
|
#include "curl_path.h"
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include "curl_memory.h"
|
#include "curl_memory.h"
|
||||||
#include "curl_path.h"
|
|
||||||
#include "escape.h"
|
#include "escape.h"
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
|
||||||
|
|||||||
@ -28,19 +28,6 @@
|
|||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# undef PATH_MAX
|
|
||||||
# define PATH_MAX MAX_PATH
|
|
||||||
# ifndef R_OK
|
|
||||||
# define R_OK 4
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
|
||||||
#define PATH_MAX 1024 /* just an extra precaution since there are systems that
|
|
||||||
have their definition hidden well */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CURLcode Curl_getworkingpath(struct Curl_easy *data,
|
CURLcode Curl_getworkingpath(struct Curl_easy *data,
|
||||||
char *homedir,
|
char *homedir,
|
||||||
char **path);
|
char **path);
|
||||||
|
|||||||
@ -1628,10 +1628,8 @@ static CURLcode sftp_readdir(struct Curl_easy *data,
|
|||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
int rc = libssh2_sftp_readdir_ex(sshc->sftp_handle,
|
int rc = libssh2_sftp_readdir_ex(sshc->sftp_handle,
|
||||||
sshp->readdir_filename,
|
sshp->readdir_filename, CURL_PATH_MAX,
|
||||||
PATH_MAX,
|
sshp->readdir_longentry, CURL_PATH_MAX,
|
||||||
sshp->readdir_longentry,
|
|
||||||
PATH_MAX,
|
|
||||||
&sshp->readdir_attrs);
|
&sshp->readdir_attrs);
|
||||||
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
||||||
*blockp = TRUE;
|
*blockp = TRUE;
|
||||||
@ -1658,7 +1656,7 @@ static CURLcode sftp_readdir(struct Curl_easy *data,
|
|||||||
if((sshp->readdir_attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) &&
|
if((sshp->readdir_attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) &&
|
||||||
((sshp->readdir_attrs.permissions & LIBSSH2_SFTP_S_IFMT) ==
|
((sshp->readdir_attrs.permissions & LIBSSH2_SFTP_S_IFMT) ==
|
||||||
LIBSSH2_SFTP_S_IFLNK)) {
|
LIBSSH2_SFTP_S_IFLNK)) {
|
||||||
Curl_dyn_init(&sshp->readdir_link, PATH_MAX);
|
Curl_dyn_init(&sshp->readdir_link, CURL_PATH_MAX);
|
||||||
result = Curl_dyn_addf(&sshp->readdir_link, "%s%s", sshp->path,
|
result = Curl_dyn_addf(&sshp->readdir_link, "%s%s", sshp->path,
|
||||||
sshp->readdir_filename);
|
sshp->readdir_filename);
|
||||||
state(data, SSH_SFTP_READDIR_LINK);
|
state(data, SSH_SFTP_READDIR_LINK);
|
||||||
@ -1671,8 +1669,6 @@ static CURLcode sftp_readdir(struct Curl_easy *data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(rc == 0) {
|
else if(rc == 0) {
|
||||||
Curl_safefree(sshp->readdir_filename);
|
|
||||||
Curl_safefree(sshp->readdir_longentry);
|
|
||||||
state(data, SSH_SFTP_READDIR_DONE);
|
state(data, SSH_SFTP_READDIR_DONE);
|
||||||
}
|
}
|
||||||
else if(rc < 0) {
|
else if(rc < 0) {
|
||||||
@ -1682,8 +1678,6 @@ static CURLcode sftp_readdir(struct Curl_easy *data,
|
|||||||
failf(data, "Could not open remote file for reading: %s :: %d",
|
failf(data, "Could not open remote file for reading: %s :: %d",
|
||||||
sftp_libssh2_strerror(sftperr),
|
sftp_libssh2_strerror(sftperr),
|
||||||
libssh2_session_last_errno(sshc->ssh_session));
|
libssh2_session_last_errno(sshc->ssh_session));
|
||||||
Curl_safefree(sshp->readdir_filename);
|
|
||||||
Curl_safefree(sshp->readdir_longentry);
|
|
||||||
state(data, SSH_SFTP_CLOSE);
|
state(data, SSH_SFTP_CLOSE);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@ -2053,13 +2047,13 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
|
|||||||
|
|
||||||
case SSH_SFTP_REALPATH:
|
case SSH_SFTP_REALPATH:
|
||||||
{
|
{
|
||||||
char tempHome[PATH_MAX];
|
char tempHome[CURL_PATH_MAX];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the "home" directory
|
* Get the "home" directory
|
||||||
*/
|
*/
|
||||||
rc = sftp_libssh2_realpath(sshc->sftp_session, ".",
|
rc = sftp_libssh2_realpath(sshc->sftp_session, ".",
|
||||||
tempHome, PATH_MAX-1);
|
tempHome, CURL_PATH_MAX-1);
|
||||||
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2490,20 +2484,7 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
|
|||||||
sshc->actualcode = result ? result : CURLE_SSH;
|
sshc->actualcode = result ? result : CURLE_SSH;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sshp->readdir_filename = malloc(PATH_MAX + 1);
|
Curl_dyn_init(&sshp->readdir, CURL_PATH_MAX * 2);
|
||||||
if(!sshp->readdir_filename) {
|
|
||||||
state(data, SSH_SFTP_CLOSE);
|
|
||||||
sshc->actualcode = CURLE_OUT_OF_MEMORY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sshp->readdir_longentry = malloc(PATH_MAX + 1);
|
|
||||||
if(!sshp->readdir_longentry) {
|
|
||||||
Curl_safefree(sshp->readdir_filename);
|
|
||||||
state(data, SSH_SFTP_CLOSE);
|
|
||||||
sshc->actualcode = CURLE_OUT_OF_MEMORY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Curl_dyn_init(&sshp->readdir, PATH_MAX * 2);
|
|
||||||
state(data, SSH_SFTP_READDIR);
|
state(data, SSH_SFTP_READDIR);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2523,7 +2504,7 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
|
|||||||
(unsigned int)
|
(unsigned int)
|
||||||
Curl_dyn_len(&sshp->readdir_link),
|
Curl_dyn_len(&sshp->readdir_link),
|
||||||
sshp->readdir_filename,
|
sshp->readdir_filename,
|
||||||
PATH_MAX, LIBSSH2_SFTP_READLINK);
|
CURL_PATH_MAX, LIBSSH2_SFTP_READLINK);
|
||||||
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
if(rc == LIBSSH2_ERROR_EAGAIN) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2533,8 +2514,6 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
|
|||||||
result = Curl_dyn_addf(&sshp->readdir, " -> %s", sshp->readdir_filename);
|
result = Curl_dyn_addf(&sshp->readdir, " -> %s", sshp->readdir_filename);
|
||||||
|
|
||||||
if(result) {
|
if(result) {
|
||||||
Curl_safefree(sshp->readdir_filename);
|
|
||||||
Curl_safefree(sshp->readdir_longentry);
|
|
||||||
state(data, SSH_SFTP_CLOSE);
|
state(data, SSH_SFTP_CLOSE);
|
||||||
sshc->actualcode = result;
|
sshc->actualcode = result;
|
||||||
break;
|
break;
|
||||||
@ -2567,8 +2546,6 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sshc->sftp_handle = NULL;
|
sshc->sftp_handle = NULL;
|
||||||
Curl_safefree(sshp->readdir_filename);
|
|
||||||
Curl_safefree(sshp->readdir_longentry);
|
|
||||||
|
|
||||||
/* no data to transfer */
|
/* no data to transfer */
|
||||||
Curl_xfer_setup_nop(data);
|
Curl_xfer_setup_nop(data);
|
||||||
@ -3505,8 +3482,6 @@ static CURLcode ssh_done(struct Curl_easy *data, CURLcode status)
|
|||||||
result = status;
|
result = status;
|
||||||
|
|
||||||
Curl_safefree(sshp->path);
|
Curl_safefree(sshp->path);
|
||||||
Curl_safefree(sshp->readdir_filename);
|
|
||||||
Curl_safefree(sshp->readdir_longentry);
|
|
||||||
Curl_dyn_free(&sshp->readdir);
|
Curl_dyn_free(&sshp->readdir);
|
||||||
|
|
||||||
if(Curl_pgrsDone(data))
|
if(Curl_pgrsDone(data))
|
||||||
|
|||||||
@ -39,6 +39,8 @@
|
|||||||
#include <wolfssh/wolfsftp.h>
|
#include <wolfssh/wolfsftp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "curl_path.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* SSH unique setup
|
* SSH unique setup
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -109,6 +111,8 @@ typedef enum {
|
|||||||
SSH_LAST /* never used */
|
SSH_LAST /* never used */
|
||||||
} sshstate;
|
} sshstate;
|
||||||
|
|
||||||
|
#define CURL_PATH_MAX 1024
|
||||||
|
|
||||||
/* this struct is used in the HandleData struct which is part of the
|
/* this struct is used in the HandleData struct which is part of the
|
||||||
Curl_easy, which means this is used on a per-easy handle basis.
|
Curl_easy, which means this is used on a per-easy handle basis.
|
||||||
Everything that is strictly related to a connection is banned from this
|
Everything that is strictly related to a connection is banned from this
|
||||||
@ -118,8 +122,8 @@ struct SSHPROTO {
|
|||||||
#ifdef USE_LIBSSH2
|
#ifdef USE_LIBSSH2
|
||||||
struct dynbuf readdir_link;
|
struct dynbuf readdir_link;
|
||||||
struct dynbuf readdir;
|
struct dynbuf readdir;
|
||||||
char *readdir_filename;
|
char readdir_filename[CURL_PATH_MAX + 1];
|
||||||
char *readdir_longentry;
|
char readdir_longentry[CURL_PATH_MAX + 1];
|
||||||
|
|
||||||
LIBSSH2_SFTP_ATTRIBUTES quote_attrs; /* used by the SFTP_QUOTE state */
|
LIBSSH2_SFTP_ATTRIBUTES quote_attrs; /* used by the SFTP_QUOTE state */
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user