Module Name: othersrc Committed By: lukem Date: Fri Aug 27 01:38:49 UTC 2021
Modified Files: othersrc/usr.bin/tnftp/src: fetch.c ftp.1 ftp.c ssl.c ssl.h util.c version.h Log Message: Merge from NetBSD-2021-01-31 to NetBSD-20210826 To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 othersrc/usr.bin/tnftp/src/fetch.c cvs rdiff -u -r1.17 -r1.18 othersrc/usr.bin/tnftp/src/ftp.1 cvs rdiff -u -r1.23 -r1.24 othersrc/usr.bin/tnftp/src/ftp.c cvs rdiff -u -r1.5 -r1.6 othersrc/usr.bin/tnftp/src/ssl.c cvs rdiff -u -r1.4 -r1.5 othersrc/usr.bin/tnftp/src/ssl.h cvs rdiff -u -r1.24 -r1.25 othersrc/usr.bin/tnftp/src/util.c cvs rdiff -u -r1.9 -r1.10 othersrc/usr.bin/tnftp/src/version.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: othersrc/usr.bin/tnftp/src/fetch.c diff -u othersrc/usr.bin/tnftp/src/fetch.c:1.25 othersrc/usr.bin/tnftp/src/fetch.c:1.26 --- othersrc/usr.bin/tnftp/src/fetch.c:1.25 Sun Apr 25 07:50:37 2021 +++ othersrc/usr.bin/tnftp/src/fetch.c Fri Aug 27 01:38:49 2021 @@ -1,5 +1,5 @@ -/* $NetBSD: fetch.c,v 1.25 2021/04/25 07:50:37 lukem Exp $ */ -/* from NetBSD: fetch.c,v 1.232 2020/07/11 00:29:38 lukem Exp */ +/* $NetBSD: fetch.c,v 1.26 2021/08/27 01:38:49 lukem Exp $ */ +/* from NetBSD: fetch.c,v 1.234 2021/08/01 15:29:30 andvar Exp */ /*- * Copyright (c) 1997-2015 The NetBSD Foundation, Inc. @@ -42,7 +42,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID(" NetBSD: fetch.c,v 1.232 2020/07/11 00:29:38 lukem Exp "); +__RCSID(" NetBSD: fetch.c,v 1.234 2021/08/01 15:29:30 andvar Exp "); #endif /* not lint */ /* @@ -145,6 +145,43 @@ static int redirect_loop; ((urltype) == HTTP_URL_T) #endif +/** + * fwrite(3) replacement that just uses write(2). Many stdio implementations + * don't handle interrupts properly and corrupt the output. We are taking + * alarm interrupts because of the progress bar. + * + * Assumes `fp' is pristine with no prior I/O calls on it. + */ +static size_t +maxwrite(const void *buf, size_t size, size_t nmemb, FILE *fp) +{ + const char *p = buf; + ssize_t nwr = 0; + ssize_t n; + int fd = fileno(fp); + + size *= nmemb; /* assume no overflow */ + + while (size > 0) { + if ((n = write(fd, p, size)) == -1) { + switch (errno) { + case EINTR: + case EAGAIN: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + continue; + default: + return nwr; + } + } + p += n; + nwr += n; + size -= n; + } + return nwr; +} + /* * Determine if token is the next word in buf (case insensitive). * If so, advance buf past the token and any trailing LWS, and @@ -1657,7 +1694,7 @@ fetch_url(const char *url, const char *p } bytes += flen; bufrem -= flen; - if (fwrite(xferbuf, sizeof(char), flen, fout) + if (maxwrite(xferbuf, sizeof(char), flen, fout) != flen) { warn("Writing `%s'", savefile); goto cleanup_fetch_url; @@ -2215,7 +2252,7 @@ go_fetch(const char *url) /* * Try FTP URL-style and host:file arguments next. * If ftpproxy is set with an FTP URL, use fetch_url() - * Othewise, use fetch_ftp(). + * Otherwise, use fetch_ftp(). */ proxyenv = getoptionvalue("ftp_proxy"); if (!EMPTYSTRING(proxyenv) && STRNEQUAL(url, FTP_URL)) Index: othersrc/usr.bin/tnftp/src/ftp.1 diff -u othersrc/usr.bin/tnftp/src/ftp.1:1.17 othersrc/usr.bin/tnftp/src/ftp.1:1.18 --- othersrc/usr.bin/tnftp/src/ftp.1:1.17 Sun Apr 25 07:50:37 2021 +++ othersrc/usr.bin/tnftp/src/ftp.1 Fri Aug 27 01:38:49 2021 @@ -1,5 +1,5 @@ -.\" $NetBSD: ftp.1,v 1.17 2021/04/25 07:50:37 lukem Exp $ -.\" from NetBSD: ftp.1,v 1.144 2021/01/31 08:59:40 lukem Exp +.\" $NetBSD: ftp.1,v 1.18 2021/08/27 01:38:49 lukem Exp $ +.\" from NetBSD: ftp.1,v 1.146 2021/04/25 09:09:55 lukem Exp .\" .\" Copyright (c) 1996-2021 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -58,7 +58,7 @@ .\" .\" @(#)ftp.1 8.3 (Berkeley) 10/9/94 .\" -.Dd January 31, 2021 +.Dd April 25, 2021 .Dt FTP 1 .Os .Sh NAME @@ -185,10 +185,13 @@ Forces .Nm to only use IPv6 addresses. .It Fl A -Force active mode ftp. +Force active mode +.Tn FTP . By default, .Nm -will try to use passive mode ftp and fall back to active mode +will try to use passive mode +.Tn FTP +and fall back to active mode if passive is not supported by the server. This option causes .Nm @@ -301,7 +304,9 @@ Upload files on the command line to .Ar url where .Ar url -is one of the ftp URL types as supported by auto-fetch +is one of the +.Sq Li ftp:// +URL types as supported by auto-fetch (with an optional target filename for single file uploads), and .Ar file is one or more local files to be uploaded. @@ -543,7 +548,9 @@ A synonym for .Ic open . .It Ic gate Op Ar host Op Ar port Toggle gate-ftp mode, which used to connect through the -TIS FWTK and Gauntlet ftp proxies. +TIS FWTK and Gauntlet +.Tn FTP +proxies. This will not be permitted if the gate-ftp server hasn't been set (either explicitly by the user, or from the .Ev FTPSERVER @@ -601,7 +608,9 @@ each remote file name is expanded separately on the remote machine and the lists are not merged. Expansion of a directory name is likely to be different from expansion of the name of an ordinary file: -the exact result depends on the foreign operating system and ftp server, +the exact result depends on the foreign operating system and +.Tn FTP +server, and can be previewed by doing .Sq Li mls remote-files \- . Note: @@ -1113,7 +1122,9 @@ Any other response will answer .Sq yes to the current file. .It Ic proxy Ar ftp-command -Execute an ftp command on a secondary control connection. +Execute an +.Tn FTP +command on a secondary control connection. This command allows simultaneous connection to two remote .Tn FTP servers for transferring files between the two servers. @@ -1887,9 +1898,9 @@ proxies will be restarted. For .Tn FTP , this is implemented by using -.Nm reget +.Ic reget instead of -.Nm get . +.Ic get . For .Tn HTTP , this is implemented by using the Index: othersrc/usr.bin/tnftp/src/ftp.c diff -u othersrc/usr.bin/tnftp/src/ftp.c:1.23 othersrc/usr.bin/tnftp/src/ftp.c:1.24 --- othersrc/usr.bin/tnftp/src/ftp.c:1.23 Sun Apr 25 07:50:37 2021 +++ othersrc/usr.bin/tnftp/src/ftp.c Fri Aug 27 01:38:49 2021 @@ -1,5 +1,5 @@ -/* $NetBSD: ftp.c,v 1.23 2021/04/25 07:50:37 lukem Exp $ */ -/* from NetBSD: ftp.c,v 1.171 2021/01/06 04:43:14 lukem Exp */ +/* $NetBSD: ftp.c,v 1.24 2021/08/27 01:38:49 lukem Exp $ */ +/* from NetBSD: ftp.c,v 1.174 2021/08/26 06:23:24 lukem Exp */ /*- * Copyright (c) 1996-2021 The NetBSD Foundation, Inc. @@ -98,7 +98,7 @@ #if 0 static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94"; #else -__RCSID(" NetBSD: ftp.c,v 1.171 2021/01/06 04:43:14 lukem Exp "); +__RCSID(" NetBSD: ftp.c,v 1.174 2021/08/26 06:23:24 lukem Exp "); #endif #endif /* not lint */ @@ -288,6 +288,11 @@ hookup(const char *host, const char *por goto bad; } + if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, + (void *)&on, sizeof(on)) == -1) { + DWARN("setsockopt %s (ignored)", "SO_KEEPALIVE"); + } + if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (void *)&on, sizeof(on)) == -1) { DWARN("setsockopt %s (ignored)", "SO_OOBINLINE"); @@ -1384,13 +1389,11 @@ initconn(void) if (data_addr.su_family != AF_INET) { fputs( "Passive mode AF mismatch. Shouldn't happen!\n", ttyout); - error = 1; goto bad; } if (code / 10 == 22 && code != 227) { fputs("wrong server: return code must be 227\n", ttyout); - error = 1; goto bad; } error = sscanf(pasv, "%u,%u,%u,%u,%u,%u", @@ -1399,21 +1402,24 @@ initconn(void) if (error != 6) { fputs( "Passive mode address scan failure. Shouldn't happen!\n", ttyout); - error = 1; goto bad; } - error = 0; memset(&data_addr, 0, sizeof(data_addr)); data_addr.su_family = AF_INET; data_addr.su_len = sizeof(struct sockaddr_in); data_addr.si_su.su_sin.sin_addr.s_addr = htonl(pack4(addr, 0)); data_addr.su_port = htons(pack2(port, 0)); + if (data_addr.si_su.su_sin.sin_addr.s_addr != + hisctladdr.si_su.su_sin.sin_addr.s_addr) { + fputs("Passive mode address mismatch.\n", + ttyout); + goto bad; + } } else if (strcmp(pasvcmd, "LPSV") == 0) { if (code / 10 == 22 && code != 228) { fputs("wrong server: return code must be 228\n", ttyout); - error = 1; goto bad; } switch (data_addr.su_family) { @@ -1426,23 +1432,26 @@ initconn(void) if (error != 9) { fputs( "Passive mode address scan failure. Shouldn't happen!\n", ttyout); - error = 1; goto bad; } if (af != 4 || hal != 4 || pal != 2) { fputs( "Passive mode AF mismatch. Shouldn't happen!\n", ttyout); - error = 1; goto bad; } - error = 0; memset(&data_addr, 0, sizeof(data_addr)); data_addr.su_family = AF_INET; data_addr.su_len = sizeof(struct sockaddr_in); data_addr.si_su.su_sin.sin_addr.s_addr = htonl(pack4(addr, 0)); data_addr.su_port = htons(pack2(port, 0)); + if (data_addr.si_su.su_sin.sin_addr.s_addr != + hisctladdr.si_su.su_sin.sin_addr.s_addr) { + fputs("Passive mode address mismatch.\n", + ttyout); + goto bad; + } break; #ifdef INET6 case AF_INET6: @@ -1458,17 +1467,14 @@ initconn(void) if (error != 21) { fputs( "Passive mode address scan failure. Shouldn't happen!\n", ttyout); - error = 1; goto bad; } if (af != 6 || hal != 16 || pal != 2) { fputs( "Passive mode AF mismatch. Shouldn't happen!\n", ttyout); - error = 1; goto bad; } - error = 0; memset(&data_addr, 0, sizeof(data_addr)); data_addr.su_family = AF_INET6; data_addr.su_len = sizeof(struct sockaddr_in6); @@ -1480,10 +1486,19 @@ initconn(void) } } data_addr.su_port = htons(pack2(port, 0)); + if (memcmp( + &data_addr.si_su.su_sin6.sin6_addr, + &hisctladdr.si_su.su_sin6.sin6_addr, + sizeof(data_addr.si_su.su_sin6.sin6_addr))) { + fputs("Passive mode address mismatch.\n", + ttyout); + goto bad; + } break; #endif default: - error = 1; + fputs("Unknown passive mode AF.\n", ttyout); + goto bad; } } else if (strcmp(pasvcmd, "EPSV") == 0) { char delim[4]; @@ -1492,20 +1507,17 @@ initconn(void) if (code / 10 == 22 && code != 229) { fputs("wrong server: return code must be 229\n", ttyout); - error = 1; goto bad; } if (sscanf(pasv, "%c%c%c%d%c", &delim[0], &delim[1], &delim[2], &port[1], &delim[3]) != 5) { fputs("parse error!\n", ttyout); - error = 1; goto bad; } if (delim[0] != delim[1] || delim[0] != delim[2] || delim[0] != delim[3]) { fputs("parse error!\n", ttyout); - error = 1; goto bad; } data_addr = hisctladdr; Index: othersrc/usr.bin/tnftp/src/ssl.c diff -u othersrc/usr.bin/tnftp/src/ssl.c:1.5 othersrc/usr.bin/tnftp/src/ssl.c:1.6 --- othersrc/usr.bin/tnftp/src/ssl.c:1.5 Sun Apr 25 07:50:37 2021 +++ othersrc/usr.bin/tnftp/src/ssl.c Fri Aug 27 01:38:49 2021 @@ -1,5 +1,5 @@ -/* $NetBSD: ssl.c,v 1.5 2021/04/25 07:50:37 lukem Exp $ */ -/* from NetBSD: ssl.c,v 1.9 2021/01/06 04:43:14 lukem Exp */ +/* $NetBSD: ssl.c,v 1.6 2021/08/27 01:38:49 lukem Exp $ */ +/* from NetBSD: ssl.c,v 1.10 2021/06/03 10:23:33 lukem Exp */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav @@ -39,13 +39,17 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID(" NetBSD: ssl.c,v 1.9 2021/01/06 04:43:14 lukem Exp "); +__RCSID(" NetBSD: ssl.c,v 1.10 2021/06/03 10:23:33 lukem Exp "); #endif +#include <errno.h> +#include <fcntl.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> #include <time.h> #include <unistd.h> -#include <string.h> -#include <fcntl.h> #include <sys/param.h> #include <sys/select.h> @@ -53,13 +57,16 @@ __RCSID(" NetBSD: ssl.c,v 1.9 2021/01/06 #include <netinet/tcp.h> #include <netinet/in.h> -#endif /* tnftp */ +#ifdef WITH_SSL #include <openssl/crypto.h> #include <openssl/x509.h> #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/err.h> +#endif + +#endif /* tnftp */ #include "ssl.h" @@ -82,7 +89,9 @@ struct fetch_connect { int issock; int iserr; int iseof; +#ifdef WITH_SSL SSL *ssl; /* SSL handle */ +#endif }; /* @@ -128,9 +137,11 @@ fetch_writev(struct fetch_connect *conn, } } errno = 0; +#ifdef WITH_SSL if (conn->ssl != NULL) len = SSL_write(conn->ssl, iov->iov_base, iov->iov_len); else +#endif len = writev(fd, iov, iovcnt); if (len == 0) { /* we consider a short write a failure */ @@ -282,7 +293,9 @@ fetch_close(struct fetch_connect *conn) return 0; fetch_flush(conn); +#ifdef WITH_SSL SSL_free(conn->ssl); +#endif close(conn->sd); free(conn->cache.buf); free(conn->buf); @@ -294,6 +307,7 @@ fetch_close(struct fetch_connect *conn) #define FETCH_READ_WAIT -2 #define FETCH_READ_ERROR -1 +#ifdef WITH_SSL static ssize_t fetch_ssl_read(SSL *ssl, void *buf, size_t len) { @@ -312,6 +326,7 @@ fetch_ssl_read(SSL *ssl, void *buf, size return FETCH_READ_ERROR; } } +#endif /* WITH_SSL */ static ssize_t fetch_nonssl_read(int sd, void *buf, size_t len) @@ -440,9 +455,11 @@ fetch_read(void *ptr, size_t size, size_ * In the non-SSL case, it may improve performance (very * slightly) when reading small amounts of data. */ +#ifdef WITH_SSL if (conn->ssl != NULL) rlen = fetch_ssl_read(conn->ssl, buf, len); else +#endif rlen = fetch_nonssl_read(conn->sd, buf, len); switch (rlen) { case 0: @@ -571,6 +588,7 @@ fetch_getline(struct fetch_connect *conn return len; } +#ifdef WITH_SSL void * fetch_start_ssl(int sock, const char *servername) { @@ -631,10 +649,13 @@ fetch_start_ssl(int sock, const char *se return ssl; } +#endif /* WITH_SSL */ void fetch_set_ssl(struct fetch_connect *conn, void *ssl) { +#ifdef WITH_SSL conn->ssl = ssl; +#endif } Index: othersrc/usr.bin/tnftp/src/ssl.h diff -u othersrc/usr.bin/tnftp/src/ssl.h:1.4 othersrc/usr.bin/tnftp/src/ssl.h:1.5 --- othersrc/usr.bin/tnftp/src/ssl.h:1.4 Sat Jul 4 09:59:07 2020 +++ othersrc/usr.bin/tnftp/src/ssl.h Fri Aug 27 01:38:49 2021 @@ -1,8 +1,8 @@ -/* $NetBSD: ssl.h,v 1.4 2020/07/04 09:59:07 lukem Exp $ */ -/* from NetBSD: ssl.h,v 1.4 2019/04/04 00:36:09 christos Exp */ +/* $NetBSD: ssl.h,v 1.5 2021/08/27 01:38:49 lukem Exp $ */ +/* from NetBSD: ssl.h,v 1.5 2021/06/03 10:23:33 lukem Exp */ /*- - * Copyright (c) 2012 The NetBSD Foundation, Inc. + * Copyright (c) 2012-2021 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +26,6 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -#ifdef WITH_SSL #define FETCH struct fetch_connect struct fetch_connect; @@ -44,21 +43,3 @@ char *fetch_getln(char *, int, struct fe int fetch_getline(struct fetch_connect *, char *, size_t, const char **); void fetch_set_ssl(struct fetch_connect *, void *); void *fetch_start_ssl(int, const char *); - -#else /* !WITH_SSL */ - -#define FETCH FILE - -#define fetch_printf fprintf -#define fetch_fileno fileno -#define fetch_error ferror -#define fetch_flush fflush -#define fetch_open fopen -#define fetch_fdopen fdopen -#define fetch_close fclose -#define fetch_read fread -#define fetch_getln fgets -#define fetch_getline get_line -#define fetch_set_ssl(a, b) - -#endif /* !WITH_SSL */ Index: othersrc/usr.bin/tnftp/src/util.c diff -u othersrc/usr.bin/tnftp/src/util.c:1.24 othersrc/usr.bin/tnftp/src/util.c:1.25 --- othersrc/usr.bin/tnftp/src/util.c:1.24 Sat Jul 4 09:59:07 2020 +++ othersrc/usr.bin/tnftp/src/util.c Fri Aug 27 01:38:49 2021 @@ -1,5 +1,5 @@ -/* $NetBSD: util.c,v 1.24 2020/07/04 09:59:07 lukem Exp $ */ -/* from NetBSD: util.c,v 1.161 2020/06/08 01:33:27 lukem Exp */ +/* $NetBSD: util.c,v 1.25 2021/08/27 01:38:49 lukem Exp $ */ +/* from NetBSD: util.c,v 1.162 2021/04/25 08:26:35 lukem Exp */ /*- * Copyright (c) 1997-2020 The NetBSD Foundation, Inc. @@ -69,7 +69,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID(" NetBSD: util.c,v 1.161 2020/06/08 01:33:27 lukem Exp "); +__RCSID(" NetBSD: util.c,v 1.162 2021/04/25 08:26:35 lukem Exp "); #endif /* not lint */ /* @@ -738,7 +738,7 @@ remotemodtime(const char *file, int nois *frac++ = '\0'; if (strlen(timestr) == 15 && strncmp(timestr, "191", 3) == 0) { /* - * XXX: Workaround for lame ftpd's that return + * XXX: Workaround for buggy ftp servers that return * `19100' instead of `2000' */ fprintf(ttyout, Index: othersrc/usr.bin/tnftp/src/version.h diff -u othersrc/usr.bin/tnftp/src/version.h:1.9 othersrc/usr.bin/tnftp/src/version.h:1.10 --- othersrc/usr.bin/tnftp/src/version.h:1.9 Sun Apr 25 07:50:37 2021 +++ othersrc/usr.bin/tnftp/src/version.h Fri Aug 27 01:38:49 2021 @@ -1,5 +1,5 @@ -/* $NetBSD: version.h,v 1.9 2021/04/25 07:50:37 lukem Exp $ */ -/* from NetBSD: version.h,v 1.92 2021/01/06 04:43:14 lukem Exp */ +/* $NetBSD: version.h,v 1.10 2021/08/27 01:38:49 lukem Exp $ */ +/* from NetBSD: version.h,v 1.94 2021/08/26 06:25:59 lukem Exp */ /*- * Copyright (c) 1999-2021 The NetBSD Foundation, Inc. @@ -35,5 +35,5 @@ #endif #ifndef FTP_VERSION -#define FTP_VERSION "20210106" +#define FTP_VERSION "20210826" #endif