On Tue, Nov 05, 2013 at 02:18:08PM +0100, Ingo Schwarze wrote:
> Hi Stefan,
>
> Stefan Sperling wrote on Tue, Nov 05, 2013 at 01:56:33PM +0100:
>
> > Do others think this useful? I hit this because I made copy/paste errors.
>
> Useful? I don't know. Maybe, maybe not.
>
> But your patch is NOT OK.
>
> Try stuff like
>
> $ ftp ' foo' bar
>
> I would be surprised if you couldn't get it to segfault.
>
> 1081: url = strdup(argv[argpos]);
> 1086: url++;
> 1073: free(url);
>
> is not a great idiom, imho.
Ooops, thanks! Here's a fixed version.
Index: fetch.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/fetch.c,v
retrieving revision 1.110
diff -u -p -r1.110 fetch.c
--- fetch.c 27 Oct 2013 18:31:24 -0000 1.110
+++ fetch.c 5 Nov 2013 13:32:53 -0000
@@ -1044,7 +1044,7 @@ int
auto_fetch(int argc, char *argv[], char *outfile)
{
char *xargv[5];
- char *cp, *url, *host, *dir, *file, *portnum;
+ char *cp, *url, *scheme, *host, *dir, *file, *portnum;
char *username, *pass, *pathstart;
char *ftpproxy, *httpproxy;
int rval, xargc;
@@ -1073,7 +1073,7 @@ auto_fetch(int argc, char *argv[], char
for (rval = 0; (rval == 0) && (argpos < argc); free(url), argpos++) {
if (strchr(argv[argpos], ':') == NULL)
break;
- host = dir = file = portnum = username = pass = NULL;
+ scheme = host = dir = file = portnum = username = pass = NULL;
/*
* We muck with the string, so we make a copy.
@@ -1085,14 +1085,17 @@ auto_fetch(int argc, char *argv[], char
/*
* Try HTTP URL-style arguments first.
*/
- if (strncasecmp(url, HTTP_URL, sizeof(HTTP_URL) - 1) == 0 ||
+ scheme = url;
+ while (isspace(*scheme))
+ scheme++;
+ if (strncasecmp(scheme, HTTP_URL, sizeof(HTTP_URL) - 1) == 0 ||
#ifndef SMALL
/* even if we compiled without SSL, url_get will check */
- strncasecmp(url, HTTPS_URL, sizeof(HTTPS_URL) -1) == 0 ||
+ strncasecmp(scheme, HTTPS_URL, sizeof(HTTPS_URL) -1) == 0 ||
#endif /* !SMALL */
- strncasecmp(url, FILE_URL, sizeof(FILE_URL) - 1) == 0) {
+ strncasecmp(scheme, FILE_URL, sizeof(FILE_URL) - 1) == 0) {
redirect_loop = 0;
- if (url_get(url, httpproxy, outfile) == -1)
+ if (url_get(scheme, httpproxy, outfile) == -1)
rval = argpos + 1;
continue;
}