]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
libssh2: put the readdir buffers into struct
authorDaniel Stenberg <daniel@haxx.se>
Sun, 13 Oct 2024 21:50:11 +0000 (23:50 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 16 Oct 2024 09:55:47 +0000 (11:55 +0200)
... 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

lib/vssh/curl_path.c
lib/vssh/curl_path.h
lib/vssh/libssh2.c
lib/vssh/ssh.h

index 144f8803d3a668aae3d7e15a4edf832d617d9ed4..61452a42527c2d288c6e1c11c33f585adca4f1c4 100644 (file)
@@ -26,9 +26,9 @@
 
 #if defined(USE_SSH)
 
+#include "curl_path.h"
 #include <curl/curl.h>
 #include "curl_memory.h"
-#include "curl_path.h"
 #include "escape.h"
 #include "memdebug.h"
 
index 6fdb2fddfff47370afcab4a2e2a4179b775bfe58..8e984174d79c5ca1364e893334749b3ad6203c6c 100644 (file)
 #include <curl/curl.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,
                              char *homedir,
                              char **path);
index bf76f77a80d2b537dce9401e4386592245c80299..505adc4456e41e0badcadd223a056d9fc9dd85c2 100644 (file)
@@ -1628,10 +1628,8 @@ static CURLcode sftp_readdir(struct Curl_easy *data,
 {
   CURLcode result = CURLE_OK;
   int rc = libssh2_sftp_readdir_ex(sshc->sftp_handle,
-                                   sshp->readdir_filename,
-                                   PATH_MAX,
-                                   sshp->readdir_longentry,
-                                   PATH_MAX,
+                                   sshp->readdir_filename, CURL_PATH_MAX,
+                                   sshp->readdir_longentry, CURL_PATH_MAX,
                                    &sshp->readdir_attrs);
   if(rc == LIBSSH2_ERROR_EAGAIN) {
     *blockp = TRUE;
@@ -1658,7 +1656,7 @@ static CURLcode sftp_readdir(struct Curl_easy *data,
         if((sshp->readdir_attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) &&
            ((sshp->readdir_attrs.permissions & LIBSSH2_SFTP_S_IFMT) ==
             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,
                                  sshp->readdir_filename);
           state(data, SSH_SFTP_READDIR_LINK);
@@ -1671,8 +1669,6 @@ static CURLcode sftp_readdir(struct Curl_easy *data,
     }
   }
   else if(rc == 0) {
-    Curl_safefree(sshp->readdir_filename);
-    Curl_safefree(sshp->readdir_longentry);
     state(data, SSH_SFTP_READDIR_DONE);
   }
   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",
           sftp_libssh2_strerror(sftperr),
           libssh2_session_last_errno(sshc->ssh_session));
-    Curl_safefree(sshp->readdir_filename);
-    Curl_safefree(sshp->readdir_longentry);
     state(data, SSH_SFTP_CLOSE);
   }
   return result;
@@ -2053,13 +2047,13 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
 
     case SSH_SFTP_REALPATH:
     {
-      char tempHome[PATH_MAX];
+      char tempHome[CURL_PATH_MAX];
 
       /*
        * Get the "home" directory
        */
       rc = sftp_libssh2_realpath(sshc->sftp_session, ".",
-                                 tempHome, PATH_MAX-1);
+                                 tempHome, CURL_PATH_MAX-1);
       if(rc == LIBSSH2_ERROR_EAGAIN) {
         break;
       }
@@ -2490,20 +2484,7 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
         sshc->actualcode = result ? result : CURLE_SSH;
         break;
       }
-      sshp->readdir_filename = malloc(PATH_MAX + 1);
-      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);
+      Curl_dyn_init(&sshp->readdir, CURL_PATH_MAX * 2);
       state(data, SSH_SFTP_READDIR);
       break;
 
@@ -2523,7 +2504,7 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
                                 (unsigned int)
                                   Curl_dyn_len(&sshp->readdir_link),
                                 sshp->readdir_filename,
-                                PATH_MAX, LIBSSH2_SFTP_READLINK);
+                                CURL_PATH_MAX, LIBSSH2_SFTP_READLINK);
       if(rc == LIBSSH2_ERROR_EAGAIN) {
         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);
 
       if(result) {
-        Curl_safefree(sshp->readdir_filename);
-        Curl_safefree(sshp->readdir_longentry);
         state(data, SSH_SFTP_CLOSE);
         sshc->actualcode = result;
         break;
@@ -2567,8 +2546,6 @@ static CURLcode ssh_statemachine(struct Curl_easy *data, bool *block)
         break;
       }
       sshc->sftp_handle = NULL;
-      Curl_safefree(sshp->readdir_filename);
-      Curl_safefree(sshp->readdir_longentry);
 
       /* no data to transfer */
       Curl_xfer_setup_nop(data);
@@ -3505,8 +3482,6 @@ static CURLcode ssh_done(struct Curl_easy *data, CURLcode status)
     result = status;
 
   Curl_safefree(sshp->path);
-  Curl_safefree(sshp->readdir_filename);
-  Curl_safefree(sshp->readdir_longentry);
   Curl_dyn_free(&sshp->readdir);
 
   if(Curl_pgrsDone(data))
index 2ed78649b9c182247000960f827dea5060ba8ef2..f2d42a3de2aed89f0ec0aa5c5c863196c3452cb9 100644 (file)
@@ -39,6 +39,8 @@
 #include <wolfssh/wolfsftp.h>
 #endif
 
+#include "curl_path.h"
+
 /****************************************************************************
  * SSH unique setup
  ***************************************************************************/
@@ -109,6 +111,8 @@ typedef enum {
   SSH_LAST  /* never used */
 } sshstate;
 
+#define CURL_PATH_MAX 1024
+
 /* 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.
    Everything that is strictly related to a connection is banned from this
@@ -118,8 +122,8 @@ struct SSHPROTO {
 #ifdef USE_LIBSSH2
   struct dynbuf readdir_link;
   struct dynbuf readdir;
-  char *readdir_filename;
-  char *readdir_longentry;
+  char readdir_filename[CURL_PATH_MAX + 1];
+  char readdir_longentry[CURL_PATH_MAX + 1];
 
   LIBSSH2_SFTP_ATTRIBUTES quote_attrs; /* used by the SFTP_QUOTE state */