Accommodate POSIX basename(3) that takes a non-const parameter and
may modify the string buffer.

I've tried to follow the conventions of the existing code.

ok?

Index: usr.bin/ftp/fetch.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/fetch.c,v
retrieving revision 1.197
diff -u -p -r1.197 fetch.c
--- usr.bin/ftp/fetch.c 4 Jul 2020 11:23:35 -0000       1.197
+++ usr.bin/ftp/fetch.c 15 Oct 2020 21:14:28 -0000
@@ -192,7 +192,7 @@ file_get(const char *path, const char *o
        int              fd, out = -1, rval = -1, save_errno;
        volatile sig_t   oldintr, oldinti;
        const char      *savefile;
-       char            *buf = NULL, *cp;
+       char            *buf = NULL, *cp, *pathbuf = NULL;
        const size_t     buflen = 128 * 1024;
        off_t            hashbytes;
        ssize_t          len, wlen;
@@ -215,8 +215,12 @@ file_get(const char *path, const char *o
        else {
                if (path[strlen(path) - 1] == '/')      /* Consider no file */
                        savefile = NULL;                /* after dir invalid. */
-               else
-                       savefile = basename(path);
+               else {
+                       pathbuf = strdup(path);
+                       if (pathbuf == NULL)
+                               errx(1, "Can't allocate memory for filename");
+                       savefile = basename(pathbuf);
+               }
        }
 
        if (EMPTYSTRING(savefile)) {
@@ -294,6 +298,7 @@ file_get(const char *path, const char *o
 
 cleanup_copy:
        free(buf);
+       free(pathbuf);
        if (out >= 0 && out != fileno(stdout))
                close(out);
        close(fd);
@@ -315,6 +320,7 @@ url_get(const char *origline, const char
        int isunavail = 0, retryafter = -1;
        struct addrinfo hints, *res0, *res;
        const char *savefile;
+       char *pathbuf = NULL;
        char *proxyurl = NULL;
        char *credentials = NULL, *proxy_credentials = NULL;
        int fd = -1, out = -1;
@@ -412,8 +418,12 @@ noslash:
        else {
                if (path[strlen(path) - 1] == '/')      /* Consider no file */
                        savefile = NULL;                /* after dir invalid. */
-               else
-                       savefile = basename(path);
+               else {
+                       pathbuf = strdup(path);
+                       if (pathbuf == NULL)
+                               errx(1, "Can't allocate memory for filename");
+                       savefile = basename(pathbuf);
+               }
        }
 
        if (EMPTYSTRING(savefile)) {
@@ -1106,6 +1116,7 @@ cleanup_url_get:
        if (out >= 0 && out != fileno(stdout))
                close(out);
        free(buf);
+       free(pathbuf);
        free(proxyhost);
        free(proxyurl);
        free(newline);
Index: usr.bin/ftp/util.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/util.c,v
retrieving revision 1.93
diff -u -p -r1.93 util.c
--- usr.bin/ftp/util.c  6 Jul 2020 17:11:29 -0000       1.93
+++ usr.bin/ftp/util.c  15 Oct 2020 21:31:55 -0000
@@ -763,7 +763,7 @@ progressmeter(int flag, const char *file
        off_t cursize, abbrevsize;
        double elapsed;
        int ratio, barlength, i, remaining, overhead = 30;
-       char buf[512];
+       char buf[512], *filenamebuf;
 
        if (flag == -1) {
                clock_gettime(CLOCK_MONOTONIC, &start);
@@ -782,11 +782,13 @@ progressmeter(int flag, const char *file
        ratio = MAXIMUM(ratio, 0);
        ratio = MINIMUM(ratio, 100);
        if (!verbose && flag == -1) {
-               filename = basename(filename);
-               if (filename != NULL) {
+               filenamebuf = strdup(filename);
+               filename = basename(filenamebuf);
+               if (filenamebuf != NULL && filename != NULL) {
                        free(title);
                        title = strdup(filename);
                }
+               free(filenamebuf);
        }
 
        buf[0] = 0;
-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to