From 6a3e96275b5b1e1e3a304bfffef37c3e3af400d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20R=C3=BChsen?= Date: Thu, 13 Feb 2020 20:00:09 +0100 Subject: [PATCH] * src/ftp.c (getftp): Remove use of alloca --- src/ftp.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/ftp.c b/src/ftp.c index 4794d91e..2cca9316 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -756,12 +756,12 @@ Error in server response, closing control connection.\n")); else { const char *targ = NULL; + char *target = u->dir; + char targetbuf[1024]; int cwd_count; int cwd_end; int cwd_start; - char *target = u->dir; - DEBUGP (("changing working directory\n")); /* Change working directory. To change to a non-absolute @@ -799,13 +799,20 @@ Error in server response, closing control connection.\n")); && (con->rs != ST_OS400) && (con->rs != ST_VMS)) { - int idlen = strlen (con->id); char *ntarget, *p; + size_t idlen = strlen (con->id); + size_t len; /* Strip trailing slash(es) from con->id. */ while (idlen > 0 && con->id[idlen - 1] == '/') --idlen; - p = ntarget = (char *)alloca (idlen + 1 + strlen (u->dir) + 1); + + len = idlen + 1 + strlen (target); + if (len < sizeof (targetbuf)) + p = ntarget = targetbuf; + else + p = ntarget = xmalloc (len + 1); + memcpy (p, con->id, idlen); p += idlen; *p++ = '/'; @@ -985,6 +992,9 @@ Error in server response, closing control connection.\n")); /* 2004-09-20 SMS. */ + if (target != targetbuf) + xfree (target); + } /* else */ } else /* do not CWD */