From 82a848de658ce5ef52ccb4868c05853d0eff7652 Mon Sep 17 00:00:00 2001 From: Zhongling He Date: Wed, 13 Apr 2022 09:12:23 +0000 Subject: [PATCH] Init package from upstream v0.17 Signed-off-by: Zhongling He --- ftp.spec | 126 +++ netkit-ftp-0.17-C-Frame121.patch | 25 + netkit-ftp-0.17-acct.patch | 12 + netkit-ftp-0.17-acct_ovl.patch | 13 + netkit-ftp-0.17-active-mode-option.patch | 35 + netkit-ftp-0.17-arg_max.patch | 55 ++ netkit-ftp-0.17-bitrate.patch | 14 + netkit-ftp-0.17-case.patch | 16 + netkit-ftp-0.17-chkmalloc.patch | 33 + netkit-ftp-0.17-commands-leaks.patch | 13 + netkit-ftp-0.17-data.patch | 24 + netkit-ftp-0.17-fdleak.patch | 11 + netkit-ftp-0.17-fprintf.patch | 225 +++++ netkit-ftp-0.17-getlogin.patch | 37 + netkit-ftp-0.17-linelen-segfault.patch | 23 + netkit-ftp-0.17-linelen.patch | 33 + netkit-ftp-0.17-longint.patch | 135 +++ netkit-ftp-0.17-longnames.patch | 106 ++ netkit-ftp-0.17-lsn-timeout.patch | 24 + netkit-ftp-0.17-man.patch | 30 + netkit-ftp-0.17-multihome.patch | 98 ++ netkit-ftp-0.17-multiipv6.patch | 66 ++ netkit-ftp-0.17-nodebug.patch | 11 + netkit-ftp-0.17-out-of-memory.patch | 29 + ...t-ftp-0.17-pre20000412.pasv-security.patch | 49 + netkit-ftp-0.17-printf.patch | 11 + netkit-ftp-0.17-remove-nested-include.patch | 18 + netkit-ftp-0.17-runique_mget.patch | 13 + netkit-ftp-0.17-segv.patch | 82 ++ netkit-ftp-0.17-sigseg.patch | 16 + netkit-ftp-0.17-size.patch | 12 + netkit-ftp-0.17-stamp.patch | 23 + netkit-ftp-0.17-token.patch | 75 ++ netkit-ftp-0.17-volatile.patch | 39 + netkit-ftp-0.17-vsftp165083.patch | 47 + netkit-ftp-0.17.tar.gz | Bin 0 -> 53934 bytes netkit-ftp-locale.patch | 18 + netkit-ftp.usagi-ipv6.patch | 928 ++++++++++++++++++ 38 files changed, 2525 insertions(+) create mode 100644 ftp.spec create mode 100644 netkit-ftp-0.17-C-Frame121.patch create mode 100644 netkit-ftp-0.17-acct.patch create mode 100644 netkit-ftp-0.17-acct_ovl.patch create mode 100644 netkit-ftp-0.17-active-mode-option.patch create mode 100644 netkit-ftp-0.17-arg_max.patch create mode 100644 netkit-ftp-0.17-bitrate.patch create mode 100644 netkit-ftp-0.17-case.patch create mode 100644 netkit-ftp-0.17-chkmalloc.patch create mode 100644 netkit-ftp-0.17-commands-leaks.patch create mode 100644 netkit-ftp-0.17-data.patch create mode 100644 netkit-ftp-0.17-fdleak.patch create mode 100644 netkit-ftp-0.17-fprintf.patch create mode 100644 netkit-ftp-0.17-getlogin.patch create mode 100644 netkit-ftp-0.17-linelen-segfault.patch create mode 100644 netkit-ftp-0.17-linelen.patch create mode 100644 netkit-ftp-0.17-longint.patch create mode 100644 netkit-ftp-0.17-longnames.patch create mode 100644 netkit-ftp-0.17-lsn-timeout.patch create mode 100644 netkit-ftp-0.17-man.patch create mode 100644 netkit-ftp-0.17-multihome.patch create mode 100644 netkit-ftp-0.17-multiipv6.patch create mode 100644 netkit-ftp-0.17-nodebug.patch create mode 100644 netkit-ftp-0.17-out-of-memory.patch create mode 100644 netkit-ftp-0.17-pre20000412.pasv-security.patch create mode 100644 netkit-ftp-0.17-printf.patch create mode 100644 netkit-ftp-0.17-remove-nested-include.patch create mode 100644 netkit-ftp-0.17-runique_mget.patch create mode 100644 netkit-ftp-0.17-segv.patch create mode 100644 netkit-ftp-0.17-sigseg.patch create mode 100644 netkit-ftp-0.17-size.patch create mode 100644 netkit-ftp-0.17-stamp.patch create mode 100644 netkit-ftp-0.17-token.patch create mode 100644 netkit-ftp-0.17-volatile.patch create mode 100644 netkit-ftp-0.17-vsftp165083.patch create mode 100644 netkit-ftp-0.17.tar.gz create mode 100644 netkit-ftp-locale.patch create mode 100644 netkit-ftp.usagi-ipv6.patch diff --git a/ftp.spec b/ftp.spec new file mode 100644 index 0000000..992b2a7 --- /dev/null +++ b/ftp.spec @@ -0,0 +1,126 @@ +%define anolis_release 1 +Summary: The standard UNIX FTP (File Transfer Protocol) client +Name: ftp +Version: 0.17 +Release: %{anolis_release}%{dist} +License: BSD with advertising +Source0: ftp://ftp.linux.org.uk/pub/linux/Networking/netkit/netkit-ftp-%{version}.tar.gz +URL: ftp://ftp.linux.org.uk/pub/linux/Networking/netkit +Patch1: netkit-ftp-0.17-pre20000412.pasv-security.patch +Patch2: netkit-ftp-0.17-acct.patch +Patch3: netkit-ftp.usagi-ipv6.patch +Patch4: netkit-ftp-0.17-segv.patch +Patch5: netkit-ftp-0.17-volatile.patch +Patch6: netkit-ftp-0.17-runique_mget.patch +Patch7: netkit-ftp-locale.patch +Patch8: netkit-ftp-0.17-printf.patch +Patch9: netkit-ftp-0.17-longint.patch +Patch10: netkit-ftp-0.17-vsftp165083.patch +Patch11: netkit-ftp-0.17-C-Frame121.patch +Patch12: netkit-ftp-0.17-data.patch +Patch13: netkit-ftp-0.17-multihome.patch +Patch14: netkit-ftp-0.17-longnames.patch +Patch15: netkit-ftp-0.17-multiipv6.patch +Patch16: netkit-ftp-0.17-nodebug.patch +Patch17: netkit-ftp-0.17-stamp.patch +Patch18: netkit-ftp-0.17-sigseg.patch +Patch19: netkit-ftp-0.17-size.patch +Patch20: netkit-ftp-0.17-fdleak.patch +Patch21: netkit-ftp-0.17-fprintf.patch +Patch22: netkit-ftp-0.17-bitrate.patch +Patch23: netkit-ftp-0.17-arg_max.patch +Patch24: netkit-ftp-0.17-case.patch +Patch25: netkit-ftp-0.17-chkmalloc.patch +Patch26: netkit-ftp-0.17-man.patch +Patch27: netkit-ftp-0.17-acct_ovl.patch +Patch28: netkit-ftp-0.17-remove-nested-include.patch +Patch29: netkit-ftp-0.17-linelen.patch +Patch30: netkit-ftp-0.17-active-mode-option.patch +Patch31: netkit-ftp-0.17-commands-leaks.patch +Patch32: netkit-ftp-0.17-lsn-timeout.patch +Patch33: netkit-ftp-0.17-getlogin.patch +Patch34: netkit-ftp-0.17-token.patch +Patch35: netkit-ftp-0.17-linelen-segfault.patch +Patch36: netkit-ftp-0.17-out-of-memory.patch + +BuildRequires: glibc-devel, readline-devel, ncurses-devel +BuildRequires: perl-interpreter, gcc +BuildRequires: make + +%description +The ftp package provides the standard UNIX command-line FTP (File +Transfer Protocol) client. FTP is a widely used protocol for +transferring files over the Internet and for archiving files. + +If your system is on a network, you should install ftp in order to do +file transfers. + +%prep +%setup -q -n netkit-ftp-%{version} +%patch1 -p1 +%patch2 -p1 -b .acct +%patch3 -p1 -b .ipv6 +%patch4 -p1 -b .segv +%patch5 -p1 -b .volatile +%patch6 -p1 -b .runique_mget +%patch7 -p1 -b .locale +%patch8 -p1 -b .printf +%patch9 -p1 -b .longint +%patch10 -p1 -b .vsftp165083 +%patch11 -p1 -b .C-Frame121 +%patch12 -p1 -b .data +%patch13 -p1 -b .multihome +%patch14 -p1 -b .patch +%patch15 -p1 -b .multiipv6 +%patch16 -p1 -b .nodebug +%patch17 -p1 -b .stamp +%patch18 -p1 -b .sigseg +%patch19 -p1 -b .size +%patch20 -p1 -b .fdleak +%patch21 -p1 -b .fprintf +%patch22 -p1 -b .bitrate +%patch23 -p1 -b .arg_max +%patch24 -p1 -b .case +%patch25 -p1 -b .chkmalloc +%patch26 -p1 -b .man +%patch27 -p1 -b .acct_ovl +%patch28 -p1 +%patch29 -p1 -b .linelen +%patch30 -p1 -b .activemode +%patch31 -p1 -b .cmds-leaks +%patch32 -p1 -b .lsn-timeout +%patch33 -p1 -b .getlogin +%patch34 -p1 -b .token +%patch35 -p1 -b .linelen-segfault +%patch36 -p1 -b .out-of-memory + +%build +sh configure --with-c-compiler=%{__cc} --enable-ipv6 +perl -pi -e ' + s,^CC=.*$,CC=cc,; + s,-O2,\$(RPM_OPT_FLAGS) -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64,; + s,^LDFLAGS=.*$,LDFLAGS=\$(RPM_LD_FLAGS),; + s,^BINDIR=.*$,BINDIR=%{_bindir},; + s,^MANDIR=.*$,MANDIR=%{_mandir},; + s,^SBINDIR=.*$,SBINDIR=%{_sbindir},; + ' MCONFIG + +%{make_build} + +%install +mkdir -p ${RPM_BUILD_ROOT}%{_bindir} +mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man1 +mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man5 + +make INSTALLROOT=${RPM_BUILD_ROOT} install + +%files +%{_bindir}/ftp +%{_bindir}/pftp +%{_mandir}/man1/ftp.* +%{_mandir}/man1/pftp.* +%{_mandir}/man5/netrc.* + +%changelog +* Wed Apr 13 2022 Zhongling He 0.17-1 +- Init package from upstream v0.17 diff --git a/netkit-ftp-0.17-C-Frame121.patch b/netkit-ftp-0.17-C-Frame121.patch new file mode 100644 index 0000000..f687d16 --- /dev/null +++ b/netkit-ftp-0.17-C-Frame121.patch @@ -0,0 +1,25 @@ +--- netkit-ftp-0.17/ftp/ftp.c.rasold 2005-10-26 16:56:09.000000000 +0200 ++++ netkit-ftp-0.17/ftp/ftp.c 2005-10-26 16:56:46.000000000 +0200 +@@ -1253,14 +1253,14 @@ + switch (data_addr.su_family) { + case AF_INET: + #if 0 +- if (try_epsv) { +- result = command(pasvcmd = "EPSV 1"); +- if (code / 10 == 22 && code != 229) { +- fprintf(stderr, +- "wrong server: return code must be 229\n"); +- result = COMPLETE + 1; +- } +- } else { ++/*@*/ if (try_epsv) { ++/*@*/ result = command(pasvcmd = "EPSV 1"); ++/*@*/ if (code / 10 == 22 && code != 229) { ++/*@*/ fprintf(stderr, ++/*@*/ "wrong server: return code must be 229\n"); ++/*@*/ result = COMPLETE + 1; ++/*@*/ } ++/*@*/ } else { + #endif + result = COMPLETE + 1; + diff --git a/netkit-ftp-0.17-acct.patch b/netkit-ftp-0.17-acct.patch new file mode 100644 index 0000000..aaadc1f --- /dev/null +++ b/netkit-ftp-0.17-acct.patch @@ -0,0 +1,12 @@ +--- netkit-ftp-0.17/ftp/ftp.c.acct Sun Jan 21 00:08:29 2001 ++++ netkit-ftp-0.17/ftp/ftp.c Sun Jan 21 00:09:04 2001 +@@ -254,7 +254,8 @@ + if (n == CONTINUE) { + aflag++; + /* fflush(stdout); */ +- zacct = getpass("Account:"); ++ if(zacct==NULL) ++ zacct = getpass("Account:"); + n = command("ACCT %s", zacct); + } + if (n != COMPLETE) { diff --git a/netkit-ftp-0.17-acct_ovl.patch b/netkit-ftp-0.17-acct_ovl.patch new file mode 100644 index 0000000..ebff49c --- /dev/null +++ b/netkit-ftp-0.17-acct_ovl.patch @@ -0,0 +1,13 @@ +diff -up netkit-ftp-0.17/ftp/cmds.c.acct_ovl netkit-ftp-0.17/ftp/cmds.c +--- netkit-ftp-0.17/ftp/cmds.c.acct_ovl 2011-09-09 15:36:36.087956561 +0200 ++++ netkit-ftp-0.17/ftp/cmds.c 2011-09-09 15:41:16.457495370 +0200 +@@ -1837,8 +1837,7 @@ account(int argc, char *argv[]) + while (argc > 1) { + --argc; + ++argv; +- strncat(buf, *argv, sizeof(buf)-strlen(buf)); +- buf[sizeof(buf)-1] = 0; ++ strncat(buf, *argv, sizeof(buf)-strlen(buf)-1); + } + ap = buf; + } diff --git a/netkit-ftp-0.17-active-mode-option.patch b/netkit-ftp-0.17-active-mode-option.patch new file mode 100644 index 0000000..c3226a6 --- /dev/null +++ b/netkit-ftp-0.17-active-mode-option.patch @@ -0,0 +1,35 @@ +--- netkit-ftp-0.17/ftp/main.c.orig 2012-08-22 14:13:47.452058828 +0200 ++++ netkit-ftp-0.17/ftp/main.c 2012-08-22 14:16:47.964124112 +0200 +@@ -87,7 +87,8 @@ static + void + usage(void) + { +- printf("\n\tUsage: { ftp | pftp } [-pinegvtd] [hostname]\n"); ++ printf("\n\tUsage: { ftp | pftp } [-Apinegvtd] [hostname]\n"); ++ printf("\t -A: enable active mode\n"); + printf("\t -p: enable passive mode (default for ftp and pftp)\n"); + printf("\t -i: turn off prompting during mget\n"); + printf("\t -n: inhibit auto-login\n"); +@@ -166,6 +167,10 @@ main(volatile int argc, char **volatile + passivemode = 1; + break; + ++ case 'A': ++ passivemode = 0; ++ break; ++ + case 'g': + doglob = 0; + break; +--- netkit-ftp-0.17/ftp/ftp.1.orig 2009-10-26 15:38:34.000000000 -0500 ++++ netkit-ftp-0.17/ftp/ftp.1 2009-10-26 15:41:12.000000000 -0500 +@@ -58,6 +58,9 @@ + Options may be specified at the command line, or to the + command interpreter. + .Bl -tag -width flag ++.It Fl A ++Use active mode for data transfers. This is useful for transmissions ++to servers which do not support passive connections (for whatever reason.) + .It Fl p + Use passive mode for data transfers. Allows use of ftp in environments + where a firewall prevents connections from the outside world back to diff --git a/netkit-ftp-0.17-arg_max.patch b/netkit-ftp-0.17-arg_max.patch new file mode 100644 index 0000000..08a88bb --- /dev/null +++ b/netkit-ftp-0.17-arg_max.patch @@ -0,0 +1,55 @@ +diff -up netkit-ftp-0.17/ftp/glob.c.arg_max netkit-ftp-0.17/ftp/glob.c +--- netkit-ftp-0.17/ftp/glob.c.arg_max 2008-04-07 11:41:14.000000000 +0200 ++++ netkit-ftp-0.17/ftp/glob.c 2008-04-07 12:01:53.000000000 +0200 +@@ -50,6 +50,7 @@ char glob_rcsid[] = + #include + #include + #include ++#include + + #include "ftp_var.h" /* for protos only */ + #include "glob.h" +@@ -57,7 +58,7 @@ char glob_rcsid[] = + #define QUOTE 0200 + #define TRIM 0177 + #define eq(a,b) (strcmp(a, b)==0) +-#define GAVSIZ (ARG_MAX/6) ++#define GAVSIZ (sysconf(_SC_ARG_MAX)/6) + #define isdir(d) ((d.st_mode & S_IFMT) == S_IFDIR) + + const char *globerr; +@@ -115,7 +116,7 @@ char ** + ftpglob(const char *v) + { + char agpath[BUFSIZ]; +- entry agargv[GAVSIZ]; ++ entry *agargv; + centry vv[2]; + vv[0].text = v; + vv[1].text = NULL; +@@ -133,6 +134,8 @@ ftpglob(const char *v) + /* added ()'s to sizeof, (ambigious math for the compiler) */ + lastgpathp = agpath + (sizeof(agpath)- 2); + ++ agargv = (entry *)malloc(sizeof (entry) * GAVSIZ); ++ if (agargv == NULL) fatal("Out of memory"); + ginit(agargv); + globcnt = 0; + collect(v); +@@ -156,7 +159,7 @@ ginit(entry *agargv) + gargv = agargv; + sortbas = agargv; + gargc = 0; +- gnleft = ARG_MAX - 4; ++ gnleft = sysconf(_SC_ARG_MAX) - 4; + } + + static +@@ -674,6 +677,7 @@ efree(entry *av) + { + int i; + for (i=0; av[i].text; i++) free(av[i].text); ++ free((void *)av); + } + + static diff --git a/netkit-ftp-0.17-bitrate.patch b/netkit-ftp-0.17-bitrate.patch new file mode 100644 index 0000000..eb2506e --- /dev/null +++ b/netkit-ftp-0.17-bitrate.patch @@ -0,0 +1,14 @@ +diff -up netkit-ftp-0.17/ftp/ftp.c.old netkit-ftp-0.17/ftp/ftp.c +--- netkit-ftp-0.17/ftp/ftp.c.old 2008-01-28 10:23:17.000000000 +0100 ++++ netkit-ftp-0.17/ftp/ftp.c 2008-01-28 10:32:01.000000000 +0100 +@@ -1609,8 +1609,8 @@ ptransfer(const char *direction, long lo + s = td.tv_sec + (td.tv_usec / 1000000.); + #define nz(x) ((x) == 0 ? 1 : (x)) + bs = bytes / nz(s); +- printf("%lld bytes %s in %.3g secs (%.2g Kbytes/sec)\n", +- bytes, direction, s, bs / 1024.0); ++ printf("%lld bytes %s in %.3g secs (%.2f Kbytes/sec)\n", ++ bytes, direction, s, bs / 1000.0); + } + } + diff --git a/netkit-ftp-0.17-case.patch b/netkit-ftp-0.17-case.patch new file mode 100644 index 0000000..a6eb166 --- /dev/null +++ b/netkit-ftp-0.17-case.patch @@ -0,0 +1,16 @@ +diff -up netkit-ftp-0.17/ftp/cmds.c.case netkit-ftp-0.17/ftp/cmds.c +--- netkit-ftp-0.17/ftp/cmds.c.case 2008-04-23 14:52:59.000000000 +0200 ++++ netkit-ftp-0.17/ftp/cmds.c 2008-04-23 14:58:07.000000000 +0200 +@@ -831,8 +831,11 @@ mget(int argc, char **argv) + tp++; + tp2++; + } ++ tp = tmpbuf; ++ } ++ else { ++ tp = cp; + } +- tp = tmpbuf; + } + if (ntflag) { + tp = dotrans(tp); diff --git a/netkit-ftp-0.17-chkmalloc.patch b/netkit-ftp-0.17-chkmalloc.patch new file mode 100644 index 0000000..f9a1210 --- /dev/null +++ b/netkit-ftp-0.17-chkmalloc.patch @@ -0,0 +1,33 @@ +diff -up netkit-ftp-0.17/ftp/ruserpass.c.chkmalloc netkit-ftp-0.17/ftp/ruserpass.c +--- netkit-ftp-0.17/ftp/ruserpass.c.chkmalloc 2008-12-01 11:54:15.000000000 +0100 ++++ netkit-ftp-0.17/ftp/ruserpass.c 2008-12-01 11:56:06.000000000 +0100 +@@ -137,7 +137,8 @@ next: + if (token()) { + if (*aname == 0) { + *aname = malloc((unsigned) strlen(tokval) + 1); +- (void) strcpy(*aname, tokval); ++ if (*aname != NULL) ++ (void) strcpy(*aname, tokval); + } else { + if (strcmp(*aname, tokval)) + goto next; +@@ -158,7 +159,8 @@ next: + } + if (token() && *apass == 0) { + *apass = malloc((unsigned) strlen(tokval) + 1); +- (void) strcpy(*apass, tokval); ++ if (*apass != NULL) ++ (void) strcpy(*apass, tokval); + } + break; + case ACCOUNT: +@@ -170,7 +172,8 @@ next: + } + if (token() && *aacct == 0) { + *aacct = malloc((unsigned) strlen(tokval) + 1); +- (void) strcpy(*aacct, tokval); ++ if (*aacct != NULL) ++ (void) strcpy(*aacct, tokval); + } + break; + case MACDEF: diff --git a/netkit-ftp-0.17-commands-leaks.patch b/netkit-ftp-0.17-commands-leaks.patch new file mode 100644 index 0000000..a2bd264 --- /dev/null +++ b/netkit-ftp-0.17-commands-leaks.patch @@ -0,0 +1,13 @@ +diff -up netkit-ftp-0.17/ftp/cmds.c.orig netkit-ftp-0.17/ftp/cmds.c +--- netkit-ftp-0.17/ftp/cmds.c.orig 2011-09-05 14:41:34.000000000 +0200 ++++ netkit-ftp-0.17/ftp/cmds.c 2011-09-05 14:44:44.000000000 +0200 +@@ -499,6 +499,9 @@ usage: + } + sendrequest(cmd, argv[1], argv[2], + argv[1] != oldargv1 || argv[2] != oldargv2); ++ if (argv[1] != oldargv1) { ++ free(argv[1]); ++ } + } + + void mabort(int); diff --git a/netkit-ftp-0.17-data.patch b/netkit-ftp-0.17-data.patch new file mode 100644 index 0000000..43157f8 --- /dev/null +++ b/netkit-ftp-0.17-data.patch @@ -0,0 +1,24 @@ +--- netkit-ftp-0.17/ftp/ftp.c.data 2005-12-02 15:31:27.000000000 +0100 ++++ netkit-ftp-0.17/ftp/ftp.c 2005-12-02 15:35:46.000000000 +0100 +@@ -1223,6 +1223,7 @@ + static int + initconn(void) + { ++ int rc; + u_char *p, *a; + int result, tmpno = 0; + socklen_t len; +@@ -1240,6 +1241,13 @@ + } + #endif + if (passivemode) { ++ if (data >= 0){ ++ rc = close (data); ++ data = -1; ++ if (rc == -1){ ++ perror ("ftp: close"); ++ } ++ } + data_addr = hisctladdr; + data = socket(data_addr.su_family, SOCK_STREAM, 0); + if (data < 0) { diff --git a/netkit-ftp-0.17-fdleak.patch b/netkit-ftp-0.17-fdleak.patch new file mode 100644 index 0000000..0f995c5 --- /dev/null +++ b/netkit-ftp-0.17-fdleak.patch @@ -0,0 +1,11 @@ +diff -up netkit-ftp-0.17/ftp/cmds.c.old netkit-ftp-0.17/ftp/cmds.c +--- netkit-ftp-0.17/ftp/cmds.c.old 2007-10-17 16:28:57.000000000 +0200 ++++ netkit-ftp-0.17/ftp/cmds.c 2007-10-17 16:33:41.000000000 +0200 +@@ -764,6 +764,7 @@ usage: + + recvrequest("RETR", argv[2], argv[1], modestr, + argv[1] != oldargv1 || argv[2] != oldargv2); ++ (void) close(data), data = -1; + restart_point = 0; + return (0); + } diff --git a/netkit-ftp-0.17-fprintf.patch b/netkit-ftp-0.17-fprintf.patch new file mode 100644 index 0000000..f0c81e7 --- /dev/null +++ b/netkit-ftp-0.17-fprintf.patch @@ -0,0 +1,225 @@ +diff -up netkit-ftp-0.17/ftp/cmds.c.old netkit-ftp-0.17/ftp/cmds.c +--- netkit-ftp-0.17/ftp/cmds.c.old 2007-11-15 13:34:31.000000000 +0100 ++++ netkit-ftp-0.17/ftp/cmds.c 2007-11-15 13:44:44.000000000 +0100 +@@ -137,7 +137,7 @@ static char *pathprotect(char *name) + if (name[i]=='.' && gotdots>=0) gotdots++; + else if (name[i]=='/' && gotdots<0) gotdots=0; + else if (name[i]=='/' && gotdots==2) { +- printf("Warning: embedded .. in %.*s (changing to !!)\n", ++ fprintf(stderr, "Warning: embedded .. in %.*s (changing to !!)\n", + len-1, name); + name[i-1] = '!'; + name[i-2] = '!'; +@@ -167,7 +167,7 @@ another(int *pargc, char ***pargv, const + int ret; + + if (len >= sizeof(line) - 3) { +- printf("sorry, arguments too long\n"); ++ fprintf(stderr, "sorry, arguments too long\n"); + intr(0); + } + printf("(%s) ", prompt); +@@ -195,7 +195,7 @@ setpeer(int argc, char *argv[]) + char *port; + + if (connected) { +- printf("Already connected to %s, use close first.\n", ++ fprintf(stderr, "Already connected to %s, use close first.\n", + hostname); + code = -1; + return; +@@ -278,7 +278,7 @@ setpeer(int argc, char *argv[]) + unix_server = 0; + if (overbose && + !strncmp(reply_string, "215 TOPS20", 10)) +- printf( ++ fprintf(stderr, + "Remember to set tenex mode when transfering binary files from this machine.\n"); + } + verbose = overbose; +@@ -316,7 +316,7 @@ do_settype(const char *thetype) + if (strcmp(thetype, p->t_name) == 0) + break; + if (p->t_name == 0) { +- printf("%s: unknown mode\n", thetype); ++ fprintf(stderr, "%s: unknown mode\n", thetype); + code = -1; + return; + } +@@ -378,7 +378,7 @@ changetype(int newtype, int show) + if (newtype == p->t_type) + break; + if (p->t_name == 0) { +- printf("ftp: internal error: unknown type %d\n", newtype); ++ fprintf(stderr, "ftp: internal error: unknown type %d\n", newtype); + return; + } + if (newtype == TYPE_L && bytename[0] != '\0') +@@ -428,7 +428,7 @@ settenex(void) + void + setmode(void) + { +- printf("We only support %s mode, sorry.\n", modename); ++ fprintf(stderr, "We only support %s mode, sorry.\n", modename); + code = -1; + } + +@@ -439,7 +439,7 @@ setmode(void) + void + setform(void) + { +- printf("We only support %s format, sorry.\n", formname); ++ fprintf(stderr, "We only support %s format, sorry.\n", formname); + code = -1; + } + +@@ -449,7 +449,7 @@ setform(void) + void + setstruct(void) + { +- printf("We only support %s structure, sorry.\n", structname); ++ fprintf(stderr, "We only support %s structure, sorry.\n", structname); + code = -1; + } + +@@ -594,7 +594,7 @@ mput(int argc, char *argv[]) + } + gargs = ftpglob(argv[i]); + if (globerr != NULL) { +- printf("%s\n", globerr); ++ fprintf(stderr, "%s\n", globerr); + if (gargs) { + blkfree(gargs); + free((char *)gargs); +@@ -906,7 +906,7 @@ remglob(char *argv[], int doswitch) + umask(oldumask); + + if (fd<0) { +- printf("Error creating temporary file, oops\n"); ++ fprintf(stderr, "Error creating temporary file, oops\n"); + return NULL; + } + +@@ -931,13 +931,13 @@ remglob(char *argv[], int doswitch) + } + verbose = oldverbose; hash = oldhash; + if (badglob) { +- printf("Refusing to handle insecure file list\n"); ++ fprintf(stderr, "Refusing to handle insecure file list\n"); + close(fd); + return NULL; + } + ftemp = fdopen(fd, "r"); + if (ftemp == NULL) { +- printf("fdopen failed, oops\n"); ++ fprintf(stderr, "fdopen failed, oops\n"); + return NULL; + } + rewind(ftemp); +@@ -1006,7 +1006,7 @@ checkglob(int fd, const char *pattern) + while (*sp == '/') + sp++; + if (nrslash >= MAXPATHLEN) { +- printf("Incredible pattern: %s\n", pattern); ++ fprintf(stderr, "Incredible pattern: %s\n", pattern); + return 0; + } + dotdot[nrslash++] = isdotdotglob(sp); +@@ -1019,7 +1019,7 @@ checkglob(int fd, const char *pattern) + if ((sp = strchr(buffer, '\n')) != 0) { + *sp = '\0'; + } else { +- printf("Extremely long filename from server: %s", ++ fprintf(stderr, "Extremely long filename from server: %s", + buffer); + okay = 0; + break; +@@ -1038,7 +1038,7 @@ checkglob(int fd, const char *pattern) + } + + if (!okay) +- printf("Filename provided by server " ++ fprintf(stderr, "Filename provided by server " + "doesn't match pattern `%s': %s\n", pattern, buffer); + + fclose(fp); +@@ -1061,14 +1061,14 @@ status(void) + if (connected) + printf("Connected to %s.\n", hostname); + else +- printf("Not connected.\n"); ++ fprintf(stderr, "Not connected.\n"); + if (!proxy) { + pswitch(1); + if (connected) { + printf("Connected for proxy commands to %s.\n", hostname); + } + else { +- printf("No proxy connection.\n"); ++ fprintf(stderr, "No proxy connection.\n"); + } + pswitch(0); + } +@@ -1218,7 +1218,7 @@ setdebug(int argc, char *argv[]) + if (argc > 1) { + val = atoi(argv[1]); + if (val < 0) { +- printf("%s: bad debugging value.\n", argv[1]); ++ fprintf(stderr, "%s: bad debugging value.\n", argv[1]); + code = -1; + return; + } +@@ -1248,7 +1248,7 @@ cd(int argc, char *argv[]) + } + if (command("CWD %s", argv[1]) == ERROR && code == 500) { + if (verbose) +- printf("CWD command not recognized, trying XCWD\n"); ++ fprintf(stderr, "CWD command not recognized, trying XCWD\n"); + (void) command("XCWD %s", argv[1]); + } + } +@@ -1546,7 +1546,7 @@ user(int argc, char *argv[]) + aflag++; + } + if (n != COMPLETE) { +- fprintf(stdout, "Login failed.\n"); ++ fprintf(stderr, "Login failed.\n"); + return; + } + if (!aflag && argc == 4) { +@@ -1567,7 +1567,7 @@ pwd(void) + */ + verbose = 1; + if (command("PWD") == ERROR && code == 500) { +- printf("PWD command not recognized, trying XPWD\n"); ++ fprintf(stderr, "PWD command not recognized, trying XPWD\n"); + (void) command("XPWD"); + } + verbose = oldverbose; +@@ -1587,7 +1587,7 @@ makedir(int argc, char *argv[]) + } + if (command("MKD %s", argv[1]) == ERROR && code == 500) { + if (verbose) +- printf("MKD command not recognized, trying XMKD\n"); ++ fprintf(stderr, "MKD command not recognized, trying XMKD\n"); + (void) command("XMKD %s", argv[1]); + } + } +@@ -1606,7 +1606,7 @@ removedir(int argc, char *argv[]) + } + if (command("RMD %s", argv[1]) == ERROR && code == 500) { + if (verbose) +- printf("RMD command not recognized, trying XRMD\n"); ++ fprintf(stderr, "RMD command not recognized, trying XRMD\n"); + (void) command("XRMD %s", argv[1]); + } + } +@@ -2212,7 +2212,7 @@ cdup(void) + { + if (command("CDUP") == ERROR && code == 500) { + if (verbose) +- printf("CDUP command not recognized, trying XCUP\n"); ++ fprintf(stderr, "CDUP command not recognized, trying XCUP\n"); + (void) command("XCUP"); + } + } diff --git a/netkit-ftp-0.17-getlogin.patch b/netkit-ftp-0.17-getlogin.patch new file mode 100644 index 0000000..9feb315 --- /dev/null +++ b/netkit-ftp-0.17-getlogin.patch @@ -0,0 +1,37 @@ +--- netkit-ftp-0.17-dist/ftp/ftp.c 2012-10-02 14:44:06.328343277 +0200 ++++ netkit-ftp-0.17-new/ftp/ftp.c 2012-10-03 09:07:47.381868330 +0200 +@@ -328,14 +328,12 @@ dologin(const char *host) + return(0); + } + while (luser == NULL) { +- char *myname = getlogin(); ++ char *myname = NULL; + +- if (myname == NULL) { +- struct passwd *pp = getpwuid(getuid()); ++ struct passwd *pp = getpwuid(getuid()); + +- if (pp != NULL) +- myname = pp->pw_name; +- } ++ if (pp != NULL) ++ myname = pp->pw_name; + if (myname) + printf("Name (%s:%s): ", host, myname); + else +--- netkit-ftp-0.17-dist/ftp/main.c 2012-10-02 14:44:06.330343274 +0200 ++++ netkit-ftp-0.17-new/ftp/main.c 2012-10-03 09:07:36.849862227 +0200 +@@ -204,12 +204,7 @@ main(volatile int argc, char **volatile + /* + * Set up the home directory in case we're globbing. + */ +- cp = getlogin(); +- if (cp != NULL) { +- pw = getpwnam(cp); +- } +- if (pw == NULL) +- pw = getpwuid(getuid()); ++ pw = getpwuid(getuid()); + if (pw != NULL) { + strncpy(homedir, pw->pw_dir, sizeof(homedir)); + homedir[sizeof(homedir)-1] = 0; diff --git a/netkit-ftp-0.17-linelen-segfault.patch b/netkit-ftp-0.17-linelen-segfault.patch new file mode 100644 index 0000000..a16db58 --- /dev/null +++ b/netkit-ftp-0.17-linelen-segfault.patch @@ -0,0 +1,23 @@ +diff -up netkit-ftp-0.17/ftp/ftp.c.orig netkit-ftp-0.17/ftp/ftp.c +diff -up netkit-ftp-0.17/ftp/ftp_var.h.orig netkit-ftp-0.17/ftp/ftp_var.h +diff -up netkit-ftp-0.17/ftp/main.c.orig netkit-ftp-0.17/ftp/main.c +--- netkit-ftp-0.17/ftp/main.c.orig 2018-09-03 16:49:16.459000000 +0200 ++++ netkit-ftp-0.17/ftp/main.c 2018-09-03 17:00:14.853452345 +0200 +@@ -399,7 +399,7 @@ int slrflag; + char ** + makeargv(int *pargc, char **parg) + { +- static char *rargv[20]; ++ static char *rargv[LINELEN]; + int rargc = 0; + char **argp; + +@@ -407,7 +407,7 @@ makeargv(int *pargc, char **parg) + stringbase = line; /* scan from first of buffer */ + argbase = argbuf; /* store from first of buffer */ + slrflag = 0; +- while ((*argp++ = slurpstring())!=NULL) ++ while ((rargc < LINELEN) && (*argp++ = slurpstring())!=NULL) + rargc++; + + *pargc = rargc; diff --git a/netkit-ftp-0.17-linelen.patch b/netkit-ftp-0.17-linelen.patch new file mode 100644 index 0000000..2e80a3f --- /dev/null +++ b/netkit-ftp-0.17-linelen.patch @@ -0,0 +1,33 @@ +--- netkit-ftp-0.17-dist/ftp/ftp_var.h 2012-10-29 10:02:44.455342130 +0100 ++++ netkit-ftp-0.17-new/ftp/ftp_var.h 2012-10-29 10:02:31.292342775 +0100 +@@ -54,6 +54,7 @@ + #define Extern extern + #endif + ++#define LINELEN PATH_MAX+200 + + /* + * Options and other state info. +@@ -109,9 +110,9 @@ Extern int ftp_port; /* htons'd port num + + Extern sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */ + +-Extern char line[200]; /* input line buffer */ ++Extern char line[LINELEN]; /* input line buffer */ + Extern char *stringbase; /* current scan point in line buffer */ +-Extern char argbuf[200]; /* argument storage buffer */ ++Extern char argbuf[LINELEN]; /* argument storage buffer */ + Extern char *argbase; /* current storage point in arg buffer */ + Extern int cpend; /* flag: if != 0, then pending server reply */ + Extern int mflag; /* flag: if != 0, then active multi command */ +--- netkit-ftp-0.17/ftp/domacro.c 2012-10-29 10:02:44.394342130 +0100 ++++ netkit-ftp-0.17-new/ftp/domacro.c 2012-10-29 10:02:31.292342775 +0100 +@@ -53,7 +53,7 @@ domacro(int argc, char *argv[]) + register int i, j; + register char *cp1, *cp2; + int count = 2, loopflg = 0; +- char line2[200]; ++ char line2[LINELEN]; + struct cmd *c; + + if (argc < 2 && !another(&argc, &argv, "macro name")) { diff --git a/netkit-ftp-0.17-longint.patch b/netkit-ftp-0.17-longint.patch new file mode 100644 index 0000000..c7b9f91 --- /dev/null +++ b/netkit-ftp-0.17-longint.patch @@ -0,0 +1,135 @@ +--- netkit-ftp-0.17/ftp/ftp.c.rasold 2005-08-22 14:22:50.000000000 +0200 ++++ netkit-ftp-0.17/ftp/ftp.c 2005-08-22 14:23:02.000000000 +0200 +@@ -139,7 +139,7 @@ + static char *gunique(char *); + static void proxtrans(const char *cmd, char *local, char *remote); + static int initconn(void); +-static void ptransfer(const char *direction, long bytes, ++static void ptransfer(const char *direction, long long bytes, + const struct timeval *t0, + const struct timeval *t1); + static void tvsub(struct timeval *tdiff, +@@ -579,7 +579,7 @@ + int (*volatile closefunc)(FILE *); + void (*volatile oldintr)(int); + void (*volatile oldintp)(int); +- volatile long bytes = 0, hashbytes = HASHBYTES; ++ volatile long long bytes = 0, hashbytes = HASHBYTES; + char buf[BUFSIZ], *bufp; + const char *volatile lmode; + +@@ -713,14 +713,14 @@ + if ((d = write(fileno(dout), bufp, c)) <= 0) + break; + if (hash) { +- while (bytes >= hashbytes) { +- (void) putchar('#'); +- hashbytes += HASHBYTES; +- } +- (void) fflush(stdout); +- } ++ while (bytes >= hashbytes) { /* <-- 'long long' signed overflow is */ ++ (void) putchar('#'); /* possible. In this case, we can */ ++ hashbytes += HASHBYTES; /* 'cycle' there for very long time. */ ++ } /* Search 'hasbytes' in file down, */ ++ (void) fflush(stdout); /* there are similar parts. */ ++ } /* */ + if (tick && (bytes >= hashbytes)) { +- printf("\rBytes transferred: %ld", bytes); ++ printf("\rBytes transferred: %lld", bytes); + (void) fflush(stdout); + while (bytes >= hashbytes) + hashbytes += TICKBYTES; +@@ -733,7 +733,7 @@ + (void) fflush(stdout); + } + if (tick) { +- (void) printf("\rBytes transferred: %ld\n", bytes); ++ (void) printf("\rBytes transferred: %lld\n", bytes); + (void) fflush(stdout); + } + if (c < 0) +@@ -755,7 +755,7 @@ + hashbytes += HASHBYTES; + } + if (tick && (bytes >= hashbytes)) { +- (void) printf("\rBytes transferred: %ld", ++ (void) printf("\rBytes transferred: %lld", + bytes); + (void) fflush(stdout); + while (bytes >= hashbytes) +@@ -780,7 +780,7 @@ + (void) fflush(stdout); + } + if (tick) { +- (void) printf("\rBytes transferred: %ld\n", bytes); ++ (void) printf("\rBytes transferred: %lld\n", bytes); + (void) fflush(stdout); + } + if (ferror(fin)) +@@ -853,9 +853,9 @@ + void (*volatile oldintp)(int); + void (*volatile oldintr)(int); + volatile int is_retr, tcrflag, bare_lfs = 0; +- static unsigned bufsize; ++ static unsigned bufsize=0; + static char *buf; +- volatile long bytes = 0, hashbytes = HASHBYTES; ++ volatile long long bytes = 0, hashbytes = HASHBYTES; + register int c, d; + struct timeval start, stop; + struct stat st; +@@ -1031,7 +1031,7 @@ + (void) fflush(stdout); + } + if (tick && (bytes >= hashbytes) && is_retr) { +- (void) printf("\rBytes transferred: %ld", ++ (void) printf("\rBytes transferred: %lld", + bytes); + (void) fflush(stdout); + while (bytes >= hashbytes) +@@ -1045,7 +1045,7 @@ + (void) fflush(stdout); + } + if (tick && is_retr) { +- (void) printf("\rBytes transferred: %ld\n", bytes); ++ (void) printf("\rBytes transferred: %lld\n", bytes); + (void) fflush(stdout); + } + if (c < 0) { +@@ -1095,7 +1095,7 @@ + hashbytes += HASHBYTES; + } + if (tick && (bytes >= hashbytes) && is_retr) { +- printf("\rBytes transferred: %ld", ++ printf("\rBytes transferred: %lld", + bytes); + fflush(stdout); + while (bytes >= hashbytes) +@@ -1126,7 +1126,7 @@ + (void) fflush(stdout); + } + if (tick && is_retr) { +- (void) printf("\rBytes transferred: %ld\n", bytes); ++ (void) printf("\rBytes transferred: %lld\n", bytes); + (void) fflush(stdout); + } + if (bare_lfs) { +@@ -1540,7 +1540,7 @@ + } + + static void +-ptransfer(const char *direction, long bytes, ++ptransfer(const char *direction, long long bytes, + const struct timeval *t0, + const struct timeval *t1) + { +@@ -1552,7 +1552,7 @@ + s = td.tv_sec + (td.tv_usec / 1000000.); + #define nz(x) ((x) == 0 ? 1 : (x)) + bs = bytes / nz(s); +- printf("%ld bytes %s in %.3g secs (%.2g Kbytes/sec)\n", ++ printf("%lld bytes %s in %.3g secs (%.2g Kbytes/sec)\n", + bytes, direction, s, bs / 1024.0); + } + } diff --git a/netkit-ftp-0.17-longnames.patch b/netkit-ftp-0.17-longnames.patch new file mode 100644 index 0000000..66e4a5a --- /dev/null +++ b/netkit-ftp-0.17-longnames.patch @@ -0,0 +1,106 @@ +--- netkit-ftp-0.17/ftp/cmds.c.longnames 2006-07-25 11:13:55.000000000 +0200 ++++ netkit-ftp-0.17/ftp/cmds.c 2006-07-24 17:52:10.000000000 +0200 +@@ -1057,10 +1057,9 @@ + status(void) + { + int i; +- +- if (connected) ++ if (connected) + printf("Connected to %s.\n", hostname); +- else ++ else + printf("Not connected.\n"); + if (!proxy) { + pswitch(1); +@@ -1081,7 +1080,7 @@ + onoff(runique)); + printf("Case: %s; CR stripping: %s\n",onoff(mcase),onoff(crflag)); + if (ntflag) { +- printf("Ntrans: (in) %s (out) %s\n", ntin,ntout); ++ printf("Ntrans: (in) %s (out) %s\n",ntin,ntout); + } + else { + printf("Ntrans: off\n"); +@@ -1948,14 +1947,14 @@ + } + ntflag++; + code = ntflag; +- (void) strncpy(ntin, argv[1], 16); +- ntin[16] = '\0'; ++ (void) strncpy(ntin, argv[1], NTRANS_MAX); ++ ntin[NTRANS_MAX] = '\0'; + if (argc == 2) { + ntout[0] = '\0'; + return; + } +- (void) strncpy(ntout, argv[2], 16); +- ntout[16] = '\0'; ++ (void) strncpy(ntout, argv[2], NTRANS_MAX); ++ ntout[NTRANS_MAX] = '\0'; + } + + static char * +@@ -1965,10 +1964,10 @@ + char *cp1, *cp2 = new; + register int i, ostop, found; + +- for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++); ++ for (ostop = 0; *(ntout + ostop) && ostop < NTRANS_MAX; ostop++); + for (cp1 = name; *cp1; cp1++) { + found = 0; +- for (i = 0; *(ntin + i) && i < 16; i++) { ++ for (i = 0; *(ntin + i) && i < NTRANS_MAX; i++) { + if (*cp1 == *(ntin + i)) { + found++; + if (i < ostop) { +--- netkit-ftp-0.17/ftp/ftp.c.longnames 2006-07-25 11:13:56.000000000 +0200 ++++ netkit-ftp-0.17/ftp/ftp.c 2006-07-24 17:46:14.000000000 +0200 +@@ -1656,8 +1656,8 @@ + int runqe; + int mcse; + int ntflg; +- char nti[17]; +- char nto[17]; ++ char nti[NTRANS_MAX+1]; ++ char nto[NTRANS_MAX+1]; + int mapflg; + char mi[MAXPATHLEN]; + char mo[MAXPATHLEN]; +@@ -1712,11 +1712,11 @@ + mcase = op->mcse; + ip->ntflg = ntflag; + ntflag = op->ntflg; +- (void) strncpy(ip->nti, ntin, 16); +- (ip->nti)[16] = '\0'; /* shouldn't use strlen */ ++ (void) strncpy(ip->nti, ntin, NTRANS_MAX); ++ (ip->nti)[NTRANS_MAX] = '\0'; /* shouldn't use strlen */ + (void) strcpy(ntin, op->nti); +- (void) strncpy(ip->nto, ntout, 16); +- (ip->nto)[16] = '\0'; ++ (void) strncpy(ip->nto, ntout, NTRANS_MAX); ++ (ip->nto)[NTRANS_MAX] = '\0'; + (void) strcpy(ntout, op->nto); + ip->mapflg = mapflag; + mapflag = op->mapflg; +--- netkit-ftp-0.17/ftp/ftp_var.h.longnames 2006-07-25 11:13:56.000000000 +0200 ++++ netkit-ftp-0.17/ftp/ftp_var.h 2006-07-24 15:49:37.000000000 +0200 +@@ -42,6 +42,7 @@ + + #include + #include ++#define NTRANS_MAX 64 + + /* + * Tick counter step size. +@@ -82,8 +83,8 @@ + Extern char pasv[64]; /* passive port for proxy data connection */ + Extern int passivemode; /* passive mode enabled */ + Extern char *altarg; /* argv[1] with no shell-like preprocessing */ +-Extern char ntin[17]; /* input translation table */ +-Extern char ntout[17]; /* output translation table */ ++Extern char ntin[NTRANS_MAX+1]; /* input translation table */ ++Extern char ntout[NTRANS_MAX+1]; /* output translation table */ + Extern char mapin[MAXPATHLEN]; /* input map template */ + Extern char mapout[MAXPATHLEN]; /* output map template */ + Extern char typename[32]; /* name of file transfer type */ diff --git a/netkit-ftp-0.17-lsn-timeout.patch b/netkit-ftp-0.17-lsn-timeout.patch new file mode 100644 index 0000000..561ccdb --- /dev/null +++ b/netkit-ftp-0.17-lsn-timeout.patch @@ -0,0 +1,24 @@ +--- netkit-ftp-0.17/ftp/ftp.c.to 2012-08-10 15:49:08.510257542 +0200 ++++ netkit-ftp-0.17/ftp/ftp.c 2012-08-10 15:49:32.386220785 +0200 +@@ -1245,6 +1245,10 @@ initconn(void) + u_int ad[16], po[2], af, alen, plen; + char *pasvcmd = NULL; + char hbuf[MAXHOSTNAMELEN], pbuf[NI_MAXSERV]; ++ struct timeval timeout; ++ ++ timeout.tv_sec = 30; ++ timeout.tv_usec = 0; + + #ifdef INET6 + if (myctladdr.su_family == AF_INET6 +@@ -1486,6 +1490,10 @@ noport: + perror("ftp: setsockopt (reuse address)"); + goto bad; + } ++ if (setsockopt (data, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, ++ sizeof(timeout)) < 0) { ++ perror("ftp: setsockopt failed\n"); ++ } + if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) { + perror("ftp: bind"); + goto bad; diff --git a/netkit-ftp-0.17-man.patch b/netkit-ftp-0.17-man.patch new file mode 100644 index 0000000..13bc0a6 --- /dev/null +++ b/netkit-ftp-0.17-man.patch @@ -0,0 +1,30 @@ +diff -up netkit-ftp-0.17/ftp/ftp.1.man netkit-ftp-0.17/ftp/ftp.1 +--- netkit-ftp-0.17/ftp/ftp.1.man 2011-03-29 09:35:52.588039000 +0200 ++++ netkit-ftp-0.17/ftp/ftp.1 2011-03-29 09:36:45.365651621 +0200 +@@ -197,7 +197,7 @@ current remote machine working directory + Change the permission modes of the file + .Ar file-name + on the remote +-sytem to ++system to + .Ar mode . + .It Ic close + Terminate the +@@ -342,7 +342,7 @@ Set the inactivity timer on the remote s + seconds. + If + .Ar seconds +-is ommitted, the current inactivity timer is printed. ++is omitted, the current inactivity timer is printed. + .It Ic lcd Op Ar directory + Change the working directory on the local machine. + If +@@ -850,7 +850,7 @@ Set the default umask on the remote serv + .Ar newmask . + If + .Ar newmask +-is ommitted, the current umask is printed. ++is omitted, the current umask is printed. + .It Xo + .Ic user Ar user-name + .Op Ar password diff --git a/netkit-ftp-0.17-multihome.patch b/netkit-ftp-0.17-multihome.patch new file mode 100644 index 0000000..9000937 --- /dev/null +++ b/netkit-ftp-0.17-multihome.patch @@ -0,0 +1,98 @@ +--- netkit-ftp-0.17/ftp/ftp_var.h.rasold 2006-01-12 11:23:16.000000000 +0100 ++++ netkit-ftp-0.17/ftp/ftp_var.h 2006-01-12 11:24:06.000000000 +0100 +@@ -69,6 +69,7 @@ + Extern int bell; /* ring bell on cmd completion */ + Extern int doglob; /* glob local file names */ + Extern int autologin; /* establish user account on connection */ ++Extern int multihome; /* multi homed host, use same interface for cmd and data channels */ + Extern int proxy; /* proxy server connection active */ + Extern int proxflag; /* proxy connection exists */ + Extern int sunique; /* store files on server with unique name */ +--- netkit-ftp-0.17/ftp/ftp.c.rasold 2006-01-12 11:14:55.000000000 +0100 ++++ netkit-ftp-0.17/ftp/ftp.c 2006-01-12 11:22:42.000000000 +0100 +@@ -132,6 +132,7 @@ + static sigjmp_buf ptabort; + static int ptabflg = 0; + static int abrtflag = 0; ++struct sockaddr_in source; + + void lostpeer(int); + extern int connected; +@@ -153,7 +154,7 @@ + char * + hookup(const char *host, const char *port) + { +- int s, tos, error; ++ int s, tos, error, alen; + socklen_t len; + static char hostnamebuf[256]; + struct addrinfo hints, *res, *res0; +@@ -278,7 +279,11 @@ + } + if (verbose) + printf("Connected to %s (%s).\n", hostname, hbuf); +- if (getreply(0) > 2) { /* read startup message from server */ ++ alen = sizeof(source); ++ getsockname(s,(struct sockaddr*)&source, &alen); ++ source.sin_port = 0; /* We just want the addr, not the port */ ++ ++ if (getreply(0) > 2) { /* read startup message from server */ + if (cin) + (void) fclose(cin); + if (cout) +@@ -1254,6 +1259,13 @@ + perror("ftp: socket"); + return(1); + } ++ if((multihome) && ++ bind(data, (struct sockaddr*)&source, sizeof(source)) == -1) { ++ close(data); ++ data = -1; ++ perror("ftp multihome bind"); ++ return(1); ++ } + if (options & SO_DEBUG && + setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, + sizeof (on)) < 0) +--- netkit-ftp-0.17/ftp/main.c.rasold 2006-01-12 11:24:27.000000000 +0100 ++++ netkit-ftp-0.17/ftp/main.c 2006-01-12 11:27:20.000000000 +0100 +@@ -93,6 +93,7 @@ + printf("\t -n: inhibit auto-login\n"); + printf("\t -e: disable readline support, if present\n"); + printf("\t -g: disable filename globbing\n"); ++ printf("\t -m: don't force data channel interface to the same as control channel\n"); + printf("\t -v: verbose mode\n"); + printf("\t -t: enable packet tracing [nonfunctional]\n"); + printf("\t -d: enable debugging\n"); +@@ -120,6 +121,7 @@ + doglob = 1; + interactive = 1; + autologin = 1; ++ multihome = 1; + passivemode = 1; + + cp = strrchr(argv[0], '/'); +@@ -172,6 +174,10 @@ + rl_inhibit = 1; + break; + ++ case 'm': ++ multihome = 0; ++ break; ++ + case 'h': + usage(); + exit(0); +--- netkit-ftp-0.17/ftp/ftp.1.rasold 2006-01-12 11:14:09.000000000 +0100 ++++ netkit-ftp-0.17/ftp/ftp.1 2006-01-12 11:15:48.000000000 +0100 +@@ -92,6 +92,10 @@ + executable. Otherwise, does nothing. + .It Fl g + Disables file name globbing. ++.It Fl m ++The default requires that ftp explicitly binds to the same interface for the data ++channel as the control channel in passive mode. Useful on multi-homed ++clients. This option disables this behavior. + .It Fl v + Verbose option forces + .Nm ftp diff --git a/netkit-ftp-0.17-multiipv6.patch b/netkit-ftp-0.17-multiipv6.patch new file mode 100644 index 0000000..ee93e32 --- /dev/null +++ b/netkit-ftp-0.17-multiipv6.patch @@ -0,0 +1,66 @@ +--- netkit-ftp-0.17/ftp/ftp.c.multiipv6 2006-08-02 15:03:26.000000000 +0200 ++++ netkit-ftp-0.17/ftp/ftp.c 2006-08-02 15:06:19.000000000 +0200 +@@ -78,9 +78,7 @@ + #include + #include + #include +-#include + #include +- + #include + #include + #include +@@ -132,7 +130,7 @@ + static sigjmp_buf ptabort; + static int ptabflg = 0; + static int abrtflag = 0; +-struct sockaddr_in source; ++struct sockaddr_storage source; + + void lostpeer(int); + extern int connected; +@@ -154,8 +152,8 @@ + char * + hookup(const char *host, const char *port) + { +- int s, tos, error, alen; +- socklen_t len; ++ int s, tos, error; ++ socklen_t len, alen; + static char hostnamebuf[256]; + struct addrinfo hints, *res, *res0; + char hbuf[MAXHOSTNAMELEN], pbuf[NI_MAXSERV]; +@@ -281,7 +279,15 @@ + printf("Connected to %s (%s).\n", hostname, hbuf); + alen = sizeof(source); + getsockname(s,(struct sockaddr*)&source, &alen); +- source.sin_port = 0; /* We just want the addr, not the port */ ++ switch (source.ss_family) { ++ /* We just want the addr, not the port */ ++ case AF_INET: ++ ((struct sockaddr_in *) &source)->sin_port = 0; ++ break; ++ case AF_INET6: ++ ((struct sockaddr_in6 *) &source)->sin6_port = 0; ++ break; ++ } + + if (getreply(0) > 2) { /* read startup message from server */ + if (cin) +@@ -1260,11 +1266,11 @@ + return(1); + } + if((multihome) && +- bind(data, (struct sockaddr*)&source, sizeof(source)) == -1) { +- close(data); +- data = -1; +- perror("ftp multihome bind"); +- return(1); ++ bind(data, (struct sockaddr *)&source, sizeof(source)) == -1) { ++ close(data); ++ data = -1; ++ perror("ftp multihome bind"); ++ return(1); + } + if (options & SO_DEBUG && + setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, diff --git a/netkit-ftp-0.17-nodebug.patch b/netkit-ftp-0.17-nodebug.patch new file mode 100644 index 0000000..520808f --- /dev/null +++ b/netkit-ftp-0.17-nodebug.patch @@ -0,0 +1,11 @@ +--- netkit-ftp-0.17/ftp/Makefile.nodebug 2006-11-14 15:02:36.000000000 +0100 ++++ netkit-ftp-0.17/ftp/Makefile 2007-01-30 13:58:15.000000000 +0100 +@@ -17,7 +17,7 @@ + + install: ftp + install -d $(INSTALLROOT)$(BINDIR) +- install -s -m$(BINMODE) ftp $(INSTALLROOT)$(BINDIR) ++ install -m$(BINMODE) ftp $(INSTALLROOT)$(BINDIR) + ln -sf ftp $(INSTALLROOT)$(BINDIR)/pftp + install -d $(INSTALLROOT)$(MANDIR)/man1 + install -m$(MANMODE) ftp.1 $(INSTALLROOT)$(MANDIR)/man1 diff --git a/netkit-ftp-0.17-out-of-memory.patch b/netkit-ftp-0.17-out-of-memory.patch new file mode 100644 index 0000000..7fe5616 --- /dev/null +++ b/netkit-ftp-0.17-out-of-memory.patch @@ -0,0 +1,29 @@ +diff -up netkit-ftp-0.17/ftp/glob.c.arg_max1 netkit-ftp-0.17/ftp/glob.c +--- netkit-ftp-0.17/ftp/glob.c.arg_max1 2012-01-24 12:59:09.335021131 +0100 ++++ netkit-ftp-0.17/ftp/glob.c 2012-01-24 13:05:27.752028732 +0100 +@@ -55,10 +55,15 @@ char glob_rcsid[] = + #include "ftp_var.h" /* for protos only */ + #include "glob.h" + ++#ifndef LOWEST_ARG_MAX ++ #define LOWEST_ARG_MAX 2621440 /* ARG_MAX for default stack size limit 10240 */ ++#endif ++ + #define QUOTE 0200 + #define TRIM 0177 + #define eq(a,b) (strcmp(a, b)==0) +-#define GAVSIZ (sysconf(_SC_ARG_MAX)/6) ++#define max(a,b) (a > b ? a : b) ++#define GAVSIZ (max((int)sysconf(_SC_ARG_MAX), LOWEST_ARG_MAX)/6) + #define isdir(d) ((d.st_mode & S_IFMT) == S_IFDIR) + + const char *globerr; +@@ -159,7 +164,7 @@ ginit(entry *agargv) + gargv = agargv; + sortbas = agargv; + gargc = 0; +- gnleft = sysconf(_SC_ARG_MAX) - 4; ++ gnleft = max((int)sysconf(_SC_ARG_MAX), LOWEST_ARG_MAX) - 4; + } + + static diff --git a/netkit-ftp-0.17-pre20000412.pasv-security.patch b/netkit-ftp-0.17-pre20000412.pasv-security.patch new file mode 100644 index 0000000..215d826 --- /dev/null +++ b/netkit-ftp-0.17-pre20000412.pasv-security.patch @@ -0,0 +1,49 @@ +diff -urN netkit-ftp-0.17-pre20000412/ftp/ftp.1 netkit-ftp-0.17-pre20000412.new/ftp/ftp.1 +--- netkit-ftp-0.17-pre20000412/ftp/ftp.1 Thu Apr 13 03:56:03 2000 ++++ netkit-ftp-0.17-pre20000412.new/ftp/ftp.1 Wed Aug 16 14:13:10 2000 +@@ -62,8 +62,10 @@ + Use passive mode for data transfers. Allows use of ftp in environments + where a firewall prevents connections from the outside world back to + the client machine. Requires that the ftp server support the PASV +-command. This is the default if invoked as +-.Nm pftp. ++command. This is the default now for ++.Nm all ++clients (ftp and pftp) due to security concerns using the PORT transfer mode. ++The flag is kept for compatibility only and has no effect anymore. + .It Fl i + Turns off interactive prompting during multiple file transfers. + .It Fl n +diff -urN netkit-ftp-0.17-pre20000412/ftp/ftp.c netkit-ftp-0.17-pre20000412.new/ftp/ftp.c +--- netkit-ftp-0.17-pre20000412/ftp/ftp.c Mon Dec 13 21:33:20 1999 ++++ netkit-ftp-0.17-pre20000412.new/ftp/ftp.c Wed Aug 16 14:12:50 2000 +@@ -883,7 +883,7 @@ + } + if (fstat(fileno(fout), &st) < 0 || st.st_blksize == 0) + st.st_blksize = BUFSIZ; +- if (st.st_blksize > bufsize) { ++ if ((unsigned)st.st_blksize > bufsize) { + if (buf) + (void) free(buf); + buf = malloc((unsigned)st.st_blksize); +diff -urN netkit-ftp-0.17-pre20000412/ftp/main.c netkit-ftp-0.17-pre20000412.new/ftp/main.c +--- netkit-ftp-0.17-pre20000412/ftp/main.c Sat Oct 2 15:25:23 1999 ++++ netkit-ftp-0.17-pre20000412.new/ftp/main.c Wed Aug 16 13:58:57 2000 +@@ -87,7 +87,7 @@ + usage(void) + { + printf("\n\tUsage: { ftp | pftp } [-pinegvtd] [hostname]\n"); +- printf("\t -p: enable passive mode (default for pftp)\n"); ++ printf("\t -p: enable passive mode (default for ftp and pftp)\n"); + printf("\t -i: turn off prompting during mget\n"); + printf("\t -n: inhibit auto-login\n"); + printf("\t -e: disable readline support, if present\n"); +@@ -118,7 +118,7 @@ + doglob = 1; + interactive = 1; + autologin = 1; +- passivemode = 0; ++ passivemode = 1; + + cp = strrchr(argv[0], '/'); + cp = (cp == NULL) ? argv[0] : cp+1; diff --git a/netkit-ftp-0.17-printf.patch b/netkit-ftp-0.17-printf.patch new file mode 100644 index 0000000..2d7ecc4 --- /dev/null +++ b/netkit-ftp-0.17-printf.patch @@ -0,0 +1,11 @@ +--- netkit-ftp-0.17/ftp/cmds.c.printf 2005-05-24 22:12:24.000000000 +0200 ++++ netkit-ftp-0.17/ftp/cmds.c 2005-05-24 22:12:37.000000000 +0200 +@@ -2223,7 +2223,7 @@ + printf("restart: offset not specified\n"); + else { + restart_point = atol(argv[1]); +- printf("restarting at %ld. %s\n", restart_point, ++ printf("restarting at %ld. %s\n", (long)restart_point, + "execute get, put or append to initiate transfer"); + } + } diff --git a/netkit-ftp-0.17-remove-nested-include.patch b/netkit-ftp-0.17-remove-nested-include.patch new file mode 100644 index 0000000..97cf136 --- /dev/null +++ b/netkit-ftp-0.17-remove-nested-include.patch @@ -0,0 +1,18 @@ +--- netkit-ftp-0.17/ftp/ftp.c 2012-07-20 07:55:48.545151322 +0200 ++++ netkit-ftp-0.17-new/ftp/ftp.c 2012-07-20 08:05:07.941468914 +0200 +@@ -74,6 +74,7 @@ char ftp_rcsid[] = + #include + #include + #include ++#include + + #include + #include +@@ -820,7 +821,6 @@ sendrequest(const char *cmd, char *local + /* It can be later removed. */ + if (old_code_l == 150 && code == 150 && cpend == 1 + && sunique == 1 && cin != NULL && fileno (cin) >= 0 ) { +- #include + struct pollfd fds_events_l [2] ; + int rc; + diff --git a/netkit-ftp-0.17-runique_mget.patch b/netkit-ftp-0.17-runique_mget.patch new file mode 100644 index 0000000..8ba1152 --- /dev/null +++ b/netkit-ftp-0.17-runique_mget.patch @@ -0,0 +1,13 @@ +--- netkit-ftp-0.17/ftp/ftp.c.runique_mget 2004-12-07 12:05:49.360133092 +0100 ++++ netkit-ftp-0.17/ftp/ftp.c 2004-12-07 12:06:48.480883902 +0100 +@@ -923,7 +923,9 @@ + return; + } + } +- else if (runique && (local = gunique(local)) == NULL) { ++ else if (runique && (strcmp(cmd, "NLST") != 0) && ++ (local = gunique(local)) == NULL) ++ { + (void) signal(SIGINT, oldintr); + code = -1; + return; diff --git a/netkit-ftp-0.17-segv.patch b/netkit-ftp-0.17-segv.patch new file mode 100644 index 0000000..12d5960 --- /dev/null +++ b/netkit-ftp-0.17-segv.patch @@ -0,0 +1,82 @@ +--- netkit-ftp-0.17/ftp/ftp.c.segv 2004-06-14 11:04:38.000000000 -0400 ++++ netkit-ftp-0.17/ftp/ftp.c 2004-06-14 11:06:46.000000000 -0400 +@@ -472,6 +472,8 @@ + return (0); + } + lostpeer(0); ++ fclose(cout); ++ cout = NULL; + if (verbose) { + printf("421 Service not available, remote server has closed connection\n"); + (void) fflush(stdout); +@@ -529,7 +531,14 @@ + cpend = 0; + (void) signal(SIGINT,oldintr); + if (code == 421 || originalcode == 421) ++ { + lostpeer(0); ++ if(cout) ++ { ++ fclose(cout); ++ cout = NULL; ++ } ++ } + if (abrtflag && oldintr != cmdabort && oldintr != SIG_IGN) + (*oldintr)(SIGINT); + return (n - '0'); +@@ -1790,6 +1799,11 @@ + if (ptabflg) + code = -1; + lostpeer(0); ++ if(cout != NULL) ++ { ++ fclose(cout); ++ cout = NULL; ++ } + } + (void) getreply(0); + (void) getreply(0); +@@ -1815,6 +1829,11 @@ + perror("reset"); + code = -1; + lostpeer(0); ++ if(cout != NULL) ++ { ++ fclose(cout); ++ cout = NULL; ++ } + } + else if (nfnd) { + (void) getreply(0); +@@ -1897,6 +1916,11 @@ + if (ptabflg) + code = -1; + lostpeer(0); ++ if(cout != NULL) ++ { ++ fclose(cout); ++ cout = NULL; ++ } + } + if (din && FD_ISSET(fileno(din), &mask)) { + while (read(fileno(din), buf, BUFSIZ) > 0) +--- netkit-ftp-0.17/ftp/main.c.segv 2004-06-14 11:03:18.000000000 -0400 ++++ netkit-ftp-0.17/ftp/main.c 2004-06-14 11:03:42.000000000 -0400 +@@ -235,8 +235,6 @@ + if (connected) { + if (cout != NULL) { + shutdown(fileno(cout), 1+1); +- fclose(cout); +- cout = NULL; + } + if (data >= 0) { + shutdown(data, 1+1); +@@ -249,8 +247,6 @@ + if (connected) { + if (cout != NULL) { + shutdown(fileno(cout), 1+1); +- fclose(cout); +- cout = NULL; + } + connected = 0; + } diff --git a/netkit-ftp-0.17-sigseg.patch b/netkit-ftp-0.17-sigseg.patch new file mode 100644 index 0000000..0972eb1 --- /dev/null +++ b/netkit-ftp-0.17-sigseg.patch @@ -0,0 +1,16 @@ +--- netkit-ftp-0.17-orig/ftp/ftp.c 2007-08-06 23:32:49.000000000 +0200 ++++ netkit-ftp-0.17/ftp/ftp.c 2007-08-06 23:31:06.000000000 +0200 +@@ -483,8 +483,10 @@ getreply(int expecteof) + return (0); + } + lostpeer(0); +- fclose(cout); +- cout = NULL; ++ if (cout) { ++ fclose(cout); ++ cout = NULL; ++ } + if (verbose) { + printf("421 Service not available, remote server has closed connection\n"); + (void) fflush(stdout); + diff --git a/netkit-ftp-0.17-size.patch b/netkit-ftp-0.17-size.patch new file mode 100644 index 0000000..22e0806 --- /dev/null +++ b/netkit-ftp-0.17-size.patch @@ -0,0 +1,12 @@ +diff -up netkit-ftp-0.17/ftp/cmds.c.size netkit-ftp-0.17/ftp/cmds.c +--- netkit-ftp-0.17/ftp/cmds.c.size 2007-10-10 14:17:18.000000000 +0200 ++++ netkit-ftp-0.17/ftp/cmds.c 2007-10-10 14:17:18.000000000 +0200 +@@ -1650,6 +1650,8 @@ quote1(const char *initial, int argc, ch + register int i, len; + char buf[BUFSIZ]; /* must be >= sizeof(line) */ + ++ if (strncmp(argv[1],"size",4) == 0) ++ changetype(TYPE_I, 1); + (void) strcpy(buf, initial); + if (argc > 1) { + len = strlen(buf); diff --git a/netkit-ftp-0.17-stamp.patch b/netkit-ftp-0.17-stamp.patch new file mode 100644 index 0000000..afbb5f2 --- /dev/null +++ b/netkit-ftp-0.17-stamp.patch @@ -0,0 +1,23 @@ +--- netkit-ftp-0.17/ftp/Makefile.stamp 2007-02-07 05:21:13.000000000 -0500 ++++ netkit-ftp-0.17/ftp/Makefile 2007-02-07 05:26:13.453244000 -0500 +@@ -16,14 +16,14 @@ + cmds.o glob.o: glob.h + + install: ftp +- install -d $(INSTALLROOT)$(BINDIR) +- install -m$(BINMODE) ftp $(INSTALLROOT)$(BINDIR) ++ install -p -d $(INSTALLROOT)$(BINDIR) ++ install -p -m$(BINMODE) ftp $(INSTALLROOT)$(BINDIR) + ln -sf ftp $(INSTALLROOT)$(BINDIR)/pftp +- install -d $(INSTALLROOT)$(MANDIR)/man1 +- install -m$(MANMODE) ftp.1 $(INSTALLROOT)$(MANDIR)/man1 ++ install -p -d $(INSTALLROOT)$(MANDIR)/man1 ++ install -p -m$(MANMODE) ftp.1 $(INSTALLROOT)$(MANDIR)/man1 + ln -sf ftp.1 $(INSTALLROOT)$(MANDIR)/man1/pftp.1 +- install -d $(INSTALLROOT)$(MANDIR)/man5 +- install -m$(MANMODE) netrc.5 $(INSTALLROOT)$(MANDIR)/man5 ++ install -p -d $(INSTALLROOT)$(MANDIR)/man5 ++ install -p -m$(MANMODE) netrc.5 $(INSTALLROOT)$(MANDIR)/man5 + + clean: + rm -f *.o ftp diff --git a/netkit-ftp-0.17-token.patch b/netkit-ftp-0.17-token.patch new file mode 100644 index 0000000..d888300 --- /dev/null +++ b/netkit-ftp-0.17-token.patch @@ -0,0 +1,75 @@ +diff -rup netkit-ftp-0.17/ftp/ruserpass.c netkit-ftp-0.17-new/ftp/ruserpass.c +--- netkit-ftp-0.17/ftp/ruserpass.c 2012-10-29 15:11:10.593841089 +0100 ++++ netkit-ftp-0.17-new/ftp/ruserpass.c 2012-10-29 15:13:14.379822697 +0100 +@@ -58,7 +58,8 @@ static int token(void); + #define ID 10 + #define MACH 11 + +-static char tokval[100]; ++#define MAXTOKENLEN 4096 ++static char tokval[MAXTOKENLEN]; + + static struct toktab { + const char *tokstr; +@@ -249,13 +250,16 @@ bad: + return(-1); + } + +-static ++static + int + token(void) + { + char *cp; + int c; + struct toktab *t; ++ size_t toklen = 0; ++ int showwarn = 1; ++ int quote = 0; + + if (feof(cfile)) + return (0); +@@ -266,20 +270,32 @@ token(void) + return (0); + cp = tokval; + if (c == '"') { +- while ((c = getc(cfile)) != EOF && c != '"') { +- if (c == '\\') +- c = getc(cfile); +- *cp++ = c; +- } +- } else { ++ quote = 1; ++ } ++ else { + *cp++ = c; +- while ((c = getc(cfile)) != EOF +- && c != '\n' && c != '\t' && c != ' ' && c != ',') { +- if (c == '\\') +- c = getc(cfile); +- *cp++ = c; ++ toklen++; ++ } ++ while ((c = getc(cfile)) != EOF) { ++ if (c == '"') ++ break; ++ if (c == '\\') ++ c = getc(cfile); ++ if (!quote && (c == '\n' || c == '\t' || c == ' ' || c == ',')) ++ break; ++ if (toklen >= MAXTOKENLEN) { ++ if (showwarn) { ++ fprintf(stderr, ++ "Warning: .netrc token too long, will be trunctated to %zd characters\n", ++ toklen); ++ showwarn = 0; ++ } ++ continue; + } ++ *cp++ = c; ++ toklen++; + } ++ + *cp = 0; + if (tokval[0] == 0) + return (0); diff --git a/netkit-ftp-0.17-volatile.patch b/netkit-ftp-0.17-volatile.patch new file mode 100644 index 0000000..e7a3431 --- /dev/null +++ b/netkit-ftp-0.17-volatile.patch @@ -0,0 +1,39 @@ +--- netkit-ftp-0.17/configure.volatile 2004-06-14 12:08:26.000000000 -0400 ++++ netkit-ftp-0.17/configure 2004-06-14 12:52:41.000000000 -0400 +@@ -193,8 +193,8 @@ + cat <__conftest.c + #include + #include +-int count=0; +-void handle(int foo) { count++; } ++volatile int count=0; ++void handle(int foo) { count++; write(1,"X",1);} + int main() { + int pid=getpid(); + signal(SIGINT, handle); +@@ -209,20 +209,20 @@ + if ( + $CC $CFLAGS __conftest.c -o __conftest || exit 1 + ./__conftest || exit 1 +- ) >/dev/null 2>&1; then ++ ); then + echo 'yes' + else + if ( + $CC $CFLAGS -D__USE_BSD_SIGNAL __conftest.c -o __conftest || exit 1 + ./__conftest || exit 1 +- ) >/dev/null 2>&1; then ++ ); then + echo '-D__USE_BSD_SIGNAL' + CFLAGS="$CFLAGS -D__USE_BSD_SIGNAL" + else + echo 'no' +- echo 'This package needs BSD signal semantics to run.' +- rm -f __conftest* +- exit ++ echo '***WARNING***: This package needs BSD signal semantics to run.' ++ echo '***WARNING***: Assuming its just ia64 buildroot breakage.' ++ CFLAGS="$CFLAGS -D__USE_BSD_SIGNAL" + fi + fi + rm -f __conftest* diff --git a/netkit-ftp-0.17-vsftp165083.patch b/netkit-ftp-0.17-vsftp165083.patch new file mode 100644 index 0000000..8dcd905 --- /dev/null +++ b/netkit-ftp-0.17-vsftp165083.patch @@ -0,0 +1,47 @@ +--- netkit-ftp-0.17/ftp/ftp.c.vsftp 2005-08-29 16:07:35.000000000 +0200 ++++ netkit-ftp-0.17/ftp/ftp.c 2005-08-30 10:58:10.000000000 +0200 +@@ -582,6 +582,7 @@ + volatile long long bytes = 0, hashbytes = HASHBYTES; + char buf[BUFSIZ], *bufp; + const char *volatile lmode; ++ int old_code_l; + + if (verbose && printnames) { + if (local && *local != '-') +@@ -799,7 +800,35 @@ + (void) fclose(dout); + /* closes data as well, so discard it */ + data = -1; +- (void) getreply(0); ++ old_code_l = code; ++ (void) getreply(0); ++ ++ /* Following "if" will avoid a bug #165083 in ftp-server */ ++ /* It can be later removed. */ ++ if (old_code_l == 150 && code == 150 && cpend == 1 ++ && sunique == 1 && cin != NULL && fileno (cin) >= 0 ) { ++ #include ++ struct pollfd fds_events_l [2] ; ++ int rc; ++ ++ fds_events_l [0] .fd = fileno (cin); ++ fds_events_l [0] .events = POLLIN | POLLERR | POLLHUP; ++ ++ rc = poll (fds_events_l, 1, 5000); ++ switch (rc) { ++ case 1: ++ (void) getreply (0); ++ break; ++ case 0: ++ fprintf (stderr, "ftp: no answer from ftp-server " ++ "(more than 5 sec).\n"); ++ break; ++ case -1: ++ perror("ftp: poll"); ++ break; ++ } ++ } ++ + (void) signal(SIGINT, oldintr); + if (oldintp) + (void) signal(SIGPIPE, oldintp); diff --git a/netkit-ftp-0.17.tar.gz b/netkit-ftp-0.17.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..4948a373361c041c21b739e3374480006f5c945d GIT binary patch literal 53934 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 <--- unused? */ + ++#include + #include + #include + #include +@@ -109,6 +110,7 @@ + + tick = 0; + ++ setlocale (LC_ALL, ""); + sp = getservbyname("ftp", "tcp"); + if (sp == 0) { + fprintf(stderr, "ftp: ftp/tcp: unknown service\n"); diff --git a/netkit-ftp.usagi-ipv6.patch b/netkit-ftp.usagi-ipv6.patch new file mode 100644 index 0000000..59a5100 --- /dev/null +++ b/netkit-ftp.usagi-ipv6.patch @@ -0,0 +1,928 @@ +diff -uNr netkit-ftp-0.17/CVS/Entries netkit-ftp/CVS/Entries +diff -uNr netkit-ftp-0.17/ChangeLog netkit-ftp/ChangeLog +--- netkit-ftp-0.17/ChangeLog Sun Jul 23 04:38:08 2000 ++++ netkit-ftp/ChangeLog Tue Nov 28 03:50:10 2000 +@@ -1,3 +1,6 @@ ++28-Nov-2000: ++ IPv6 support. (Hiroyuki YAMAMORI ) ++ + 8-Jul-2000: + Fix misused printf-function call (not %n-exploitable though). + +diff -uNr netkit-ftp-0.17/configure netkit-ftp/configure +--- netkit-ftp-0.17/configure Sat Jul 29 21:00:28 2000 ++++ netkit-ftp/configure Sat Jan 27 06:14:54 2001 +@@ -24,6 +24,7 @@ + --binmode=mode Mode for binaries [755] + --manmode=mode Mode for manual pages [644] + --with-c-compiler=cc Program for compiling C source [guessed] ++ --enable-ipv6 Enable IPv6 support + EOF + exit 0;; + --verbose) ;; +@@ -39,6 +40,11 @@ + --manmode=*) MANMODE=`echo $1 | sed 's/^[^=]*=//'` ;; + --with-c-compiler=*) CC=`echo $1 | sed 's/^[^=]*=//'` ;; + --without-readline|--disable-readline) WITHOUT_READLINE=1;; ++ ++ --disable-ipv6) ENABLE_IPV6=no;; ++ --enable-ipv6=*) ENABLE_IPV6=`echo $1 | sed 's/^[^=]*=//'`;; ++ --enable-ipv6) ENABLE_IPV6=yes;; ++ + *) echo "Unrecognized option: $1"; exit 1;; + esac + shift +@@ -142,6 +148,42 @@ + + LDFLAGS= + LIBS= ++ ++rm -f __conftest* ++ ++################################################## ++## Enable IPv6 ++echo -n "Whether to enable IPv6 support... " ++if [ x"$ENABLE_IPV6" = x"yes" ]; then ++ echo yes ++ CFLAGS="$CFLAGS -DINET6" ++else ++ echo no ++fi ++ ++rm -f __conftest* ++ ++## Search IPv6 Library / Headers ++if [ x"$ENABLE_IPV6" = x"yes" ]; then ++ echo -n "Search for IPv6 library... " ++ inet6libdirs="/usr/local/v6/lib /usr/local/lib /usr /usr/inet6/lib" ++ inet6libs="inet6" ++ inet6found=no ++ for inet6libdir in $inet6libdirs; do ++ for inet6lib in $inet6libs; do ++ if [ -d $inet6libdir ] && [ -f $inet6libdir/lib$inet6lib.a ]; then ++ inet6found=yes ++ break 2 ++ fi ++ done ++ done ++ if [ x"$inet6found" = x"yes" ]; then ++ echo "$inet6libdir/lib$inet6lib.a" ++ LIBS="$LIBS -L$inet6libdir -l$inet6lib" ++ else ++ echo "not found" ++ fi ++fi + + rm -f __conftest* + +diff -uNr netkit-ftp-0.17/ftp/CVS/Entries netkit-ftp/ftp/CVS/Entries +--- netkit-ftp-0.17/ftp/CVS/Entries Thu Jan 1 02:00:00 1970 ++++ netkit-ftp/ftp/CVS/Entries Mon Feb 19 06:50:49 2001 +@@ -0,0 +1,16 @@ ++/.cvsignore/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/Makefile/1.4/Sat Jan 27 05:57:08 2001// ++/cmds.c/1.3/Fri Jan 12 21:36:27 2001// ++/cmds.h/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/cmdtab.c/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/domacro.c/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/ftp.1/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/ftp.c/1.11/Sun Feb 11 12:26:59 2001// ++/ftp_var.h/1.3/Fri Jan 12 21:36:27 2001// ++/glob.c/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/glob.h/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/main.c/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/netrc.5/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/pathnames.h/1.1.1.1/Fri Nov 3 19:18:15 2000// ++/ruserpass.c/1.1.1.1/Fri Nov 3 19:18:15 2000// ++D +diff -uNr netkit-ftp-0.17/ftp/CVS/Repository netkit-ftp/ftp/CVS/Repository +--- netkit-ftp-0.17/ftp/CVS/Repository Thu Jan 1 02:00:00 1970 ++++ netkit-ftp/ftp/CVS/Repository Mon Feb 19 06:50:49 2001 +@@ -0,0 +1 @@ ++usagi/src/netkit-ftp/ftp +diff -uNr netkit-ftp-0.17/ftp/CVS/Root netkit-ftp/ftp/CVS/Root +--- netkit-ftp-0.17/ftp/CVS/Root Thu Jan 1 02:00:00 1970 ++++ netkit-ftp/ftp/CVS/Root Mon Feb 19 06:50:49 2001 +@@ -0,0 +1 @@ ++:pserver:anoncvs@anoncvs.linux-ipv6.org:/cvsroot/usagi +diff -uNr netkit-ftp-0.17/ftp/Makefile netkit-ftp/ftp/Makefile +--- netkit-ftp-0.17/ftp/Makefile Sun Aug 1 09:00:12 1999 ++++ netkit-ftp/ftp/Makefile Sat Jan 27 07:57:08 2001 +@@ -16,10 +16,13 @@ + cmds.o glob.o: glob.h + + install: ftp ++ install -d $(INSTALLROOT)$(BINDIR) + install -s -m$(BINMODE) ftp $(INSTALLROOT)$(BINDIR) + ln -sf ftp $(INSTALLROOT)$(BINDIR)/pftp ++ install -d $(INSTALLROOT)$(MANDIR)/man1 + install -m$(MANMODE) ftp.1 $(INSTALLROOT)$(MANDIR)/man1 + ln -sf ftp.1 $(INSTALLROOT)$(MANDIR)/man1/pftp.1 ++ install -d $(INSTALLROOT)$(MANDIR)/man5 + install -m$(MANMODE) netrc.5 $(INSTALLROOT)$(MANDIR)/man5 + + clean: +diff -uNr netkit-ftp-0.17/ftp/cmds.c netkit-ftp/ftp/cmds.c +--- netkit-ftp-0.17/ftp/cmds.c Sun Jul 23 04:36:59 2000 ++++ netkit-ftp/ftp/cmds.c Fri Jan 12 23:36:27 2001 +@@ -1,3 +1,5 @@ ++/* $USAGI$ */ ++ + /* + * Copyright (c) 1985, 1989 Regents of the University of California. + * All rights reserved. +@@ -35,7 +37,7 @@ + * from: @(#)cmds.c 5.26 (Berkeley) 3/5/91 + */ + char cmds_rcsid[] = +- "$Id: cmds.c,v 1.33 2000/07/23 01:36:59 dholland Exp $"; ++ "$Id: cmds.c,v 1.3 2001/01/12 21:36:27 sekiya Exp $"; + + /* + * FTP User Program -- Command Routines. +@@ -190,7 +192,7 @@ + setpeer(int argc, char *argv[]) + { + char *host; +- unsigned short port; ++ char *port; + + if (connected) { + printf("Already connected to %s, use close first.\n", +@@ -205,22 +207,17 @@ + code = -1; + return; + } +- port = ftp_port; ++ port = NULL; + if (argc > 2) { +- port = atoi(argv[2]); +- if (port < 1) { +- printf("%s: bad port number-- %s\n", argv[1], argv[2]); +- printf ("usage: %s host-name [port]\n", argv[0]); +- code = -1; +- return; +- } +- port = htons(port); ++ port = argv[2]; + } + host = hookup(argv[1], port); + if (host) { + int overbose; + + connected = 1; ++ try_epsv = 1; ++ try_eprt = 1; + /* + * Set up defaults for FTP. + */ +diff -uNr netkit-ftp-0.17/ftp/cmdtab.c netkit-ftp/ftp/cmdtab.c +--- netkit-ftp-0.17/ftp/cmdtab.c Tue Sep 28 18:36:05 1999 ++++ netkit-ftp/ftp/cmdtab.c Fri Nov 3 21:18:15 2000 +@@ -35,7 +35,7 @@ + * from: @(#)cmdtab.c 5.10 (Berkeley) 6/1/90 + */ + char cmdtab_rcsid[] = +- "$Id: cmdtab.c,v 1.8 1999/09/28 15:36:05 dholland Exp $"; ++ "$Id: cmdtab.c,v 1.1.1.1 2000/11/03 19:18:15 mk Exp $"; + + #include /* for NULL */ + #include "ftp_var.h" +diff -uNr netkit-ftp-0.17/ftp/domacro.c netkit-ftp/ftp/domacro.c +--- netkit-ftp-0.17/ftp/domacro.c Thu Aug 15 02:27:28 1996 ++++ netkit-ftp/ftp/domacro.c Fri Nov 3 21:18:15 2000 +@@ -35,7 +35,7 @@ + * from: @(#)domacro.c 1.8 (Berkeley) 9/28/90 + */ + char domacro_rcsid[] = +- "$Id: domacro.c,v 1.4 1996/08/14 23:27:28 dholland Exp $"; ++ "$Id: domacro.c,v 1.1.1.1 2000/11/03 19:18:15 mk Exp $"; + + #include + #include +diff -uNr netkit-ftp-0.17/ftp/ftp.1 netkit-ftp/ftp/ftp.1 +--- netkit-ftp-0.17/ftp/ftp.1 Mon Jul 31 02:56:59 2000 ++++ netkit-ftp/ftp/ftp.1 Fri Nov 3 21:18:15 2000 +@@ -30,7 +30,7 @@ + .\" SUCH DAMAGE. + .\" + .\" from: @(#)ftp.1 6.18 (Berkeley) 7/30/91 +-.\" $Id: ftp.1,v 1.14 2000/07/30 23:56:59 dholland Exp $ ++.\" $Id: ftp.1,v 1.1.1.1 2000/11/03 19:18:15 mk Exp $ + .\" + .Dd August 15, 1999 + .Dt FTP 1 +diff -uNr netkit-ftp-0.17/ftp/ftp.c netkit-ftp/ftp/ftp.c +--- netkit-ftp-0.17/ftp/ftp.c Mon Dec 13 22:33:20 1999 ++++ netkit-ftp/ftp/ftp.c Sun Feb 11 14:26:59 2001 +@@ -1,3 +1,34 @@ ++/* $USAGI$ */ ++ ++/* ++ * Copyright (C) 1997 and 1998 WIDE Project. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ + /* + * Copyright (c) 1985, 1989 Regents of the University of California. + * All rights reserved. +@@ -35,7 +66,7 @@ + * From: @(#)ftp.c 5.38 (Berkeley) 4/22/91 + */ + char ftp_rcsid[] = +- "$Id: ftp.c,v 1.25 1999/12/13 20:33:20 dholland Exp $"; ++ "$Id: ftp.c,v 1.11 2001/02/11 12:26:59 yoshfuji Exp $"; + + #include + #include +@@ -63,14 +94,38 @@ + #include "ftp_var.h" + #include "cmds.h" + ++#ifdef _USAGI ++#include "version.h" ++#else + #include "../version.h" ++#endif ++ ++union sockunion { ++ struct sockinet { ++ u_short si_family; ++ u_short si_port; ++ } su_si; ++ struct sockaddr su_sa; ++ struct sockaddr_in su_sin; ++#ifdef INET6 ++ struct sockaddr_in6 su_sin6; ++#endif ++}; ++#define su_family su_sa.sa_family ++#define su_port su_si.si_port ++ ++#ifdef INET6 ++#define ex_af2prot(a) (a == AF_INET ? 1 : (a == AF_INET6 ? 2 : 0)) ++#else ++#define ex_af2prot(a) (a == AF_INET ? 1 : 0) ++#endif + + int data = -1; + off_t restart_point = 0; + +-static struct sockaddr_in hisctladdr; +-static struct sockaddr_in data_addr; +-static struct sockaddr_in myctladdr; ++static union sockunion hisctladdr; ++static union sockunion data_addr; ++static union sockunion myctladdr; + static int ptflag = 0; + static sigjmp_buf recvabort; + static sigjmp_buf sendabort; +@@ -96,79 +151,119 @@ + static FILE *dataconn(const char *); + + char * +-hookup(char *host, int port) ++hookup(const char *host, const char *port) + { +- register struct hostent *hp = 0; +- int s, tos; ++ int s, tos, error; + socklen_t len; + static char hostnamebuf[256]; +- ++ struct addrinfo hints, *res, *res0; ++ char hbuf[MAXHOSTNAMELEN], pbuf[NI_MAXSERV]; ++ char *cause = "ftp: unknown"; ++ ++ if (port) { ++ strncpy(pbuf, port, sizeof(pbuf) - 1); ++ pbuf[sizeof(pbuf) - 1] = '\0'; ++ } else { ++ sprintf(pbuf, "%d", ntohs(ftp_port)); ++ } + memset(&hisctladdr, 0, sizeof(hisctladdr)); +- if (inet_aton(host, &hisctladdr.sin_addr)) { +- hisctladdr.sin_family = AF_INET; +- strncpy(hostnamebuf, host, sizeof(hostnamebuf)); +- hostnamebuf[sizeof(hostnamebuf)-1]=0; +- } +- else { +- hp = gethostbyname(host); +- if (hp == NULL) { +- fprintf(stderr, "ftp: %s: ", host); +- herror((char *)NULL); +- code = -1; +- return((char *) 0); ++ memset(&hints, 0, sizeof(hints)); ++ hints.ai_flags = AI_CANONNAME; ++ hints.ai_socktype = SOCK_STREAM; ++ error = getaddrinfo(host, pbuf, &hints, &res0); ++ if (error) { ++ if (port) { ++ strcpy(hbuf, " "); ++ } else { ++ hbuf[0] = '\0'; ++ pbuf[0] = '\0'; + } +- hisctladdr.sin_family = hp->h_addrtype; +- if (hp->h_length > (int)sizeof(hisctladdr.sin_addr)) { +- hp->h_length = sizeof(hisctladdr.sin_addr); +- } +- memcpy(&hisctladdr.sin_addr, hp->h_addr_list[0], hp->h_length); +- (void) strncpy(hostnamebuf, hp->h_name, sizeof(hostnamebuf)); +- hostnamebuf[sizeof(hostnamebuf)-1] = 0; +- } +- hostname = hostnamebuf; +- s = socket(hisctladdr.sin_family, SOCK_STREAM, 0); +- if (s < 0) { +- perror("ftp: socket"); ++ fprintf(stderr, "ftp: %s%s%s: %s\n", host, hbuf, pbuf, ++ gai_strerror(error)); + code = -1; + return (0); + } +- hisctladdr.sin_port = port; +- while (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0) { +- if (hp && hp->h_addr_list[1]) { +- int oerrno = errno; +- +- fprintf(stderr, "ftp: connect to address %s: ", +- inet_ntoa(hisctladdr.sin_addr)); +- errno = oerrno; +- perror((char *) 0); +- hp->h_addr_list++; +- memcpy(&hisctladdr.sin_addr, hp->h_addr_list[0], +- hp->h_length); +- fprintf(stdout, "Trying %s...\n", +- inet_ntoa(hisctladdr.sin_addr)); +- (void) close(s); +- s = socket(hisctladdr.sin_family, SOCK_STREAM, 0); +- if (s < 0) { +- perror("ftp: socket"); +- code = -1; +- return (0); ++ ++ if (res0->ai_canonname) { ++ struct addrinfo h, *a; ++ memset(&h, 0, sizeof(h)); ++ h.ai_family = PF_UNSPEC; ++ h.ai_socktype = SOCK_STREAM; ++ h.ai_flags = AI_NUMERICHOST; ++ if (!getaddrinfo(res0->ai_canonname, NULL, &h, &a)) { ++ strncpy(hostnamebuf, res0->ai_canonname, sizeof(hostnamebuf)); ++ freeaddrinfo(a); ++ } else ++ strncpy(hostnamebuf, host, sizeof(hostnamebuf)); ++ } ++ else ++ strncpy(hostnamebuf, host, sizeof(hostnamebuf)); ++ hostnamebuf[sizeof(hostnamebuf) - 1] = '\0'; ++ hostname = hostnamebuf; ++ ++ s = -1; ++ for (res = res0; res; res = res->ai_next) { ++ if (!ex_af2prot(res->ai_family)) { ++ cause = "ftp: mismatch address family"; ++ errno = EPROTONOSUPPORT; ++ continue; ++ } ++ if ((size_t)res->ai_addrlen > sizeof(hisctladdr)) { ++ cause = "ftp: mismatch struct sockaddr size"; ++ errno = EPROTO; ++ continue; ++ } ++ if (getnameinfo(res->ai_addr, res->ai_addrlen, ++ hbuf, sizeof(hbuf), NULL, 0, ++ NI_NUMERICHOST)) ++ strcpy(hbuf, "???"); ++ if (res0->ai_next) /* if we have multiple possibilities */ ++ fprintf(stdout, "Trying %s...\n", hbuf); ++ s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); ++ if (s < 0) { ++ cause = "ftp: socket"; ++ continue; ++ } ++ while ((error = connect(s, res->ai_addr, res->ai_addrlen)) < 0 ++ && errno == EINTR) { ++ ; ++ } ++ if (error) { ++ /* this "if" clause is to prevent print warning twice */ ++ if (res->ai_next) { ++ fprintf(stderr, ++ "ftp: connect to address %s", hbuf); ++ perror(""); + } ++ cause = "ftp: connect"; ++ close(s); ++ s = -1; + continue; + } +- perror("ftp: connect"); ++ /* finally we got one */ ++ break; ++ } ++ if (s < 0) { ++ perror(cause); + code = -1; +- goto bad; ++ freeaddrinfo(res0); ++ return NULL; + } +- len = sizeof (myctladdr); ++ len = res->ai_addrlen; ++ memcpy(&hisctladdr, res->ai_addr, len); ++ freeaddrinfo(res0); + if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) { + perror("ftp: getsockname"); + code = -1; + goto bad; + } + #ifdef IP_TOS ++ if (hisctladdr.su_family == AF_INET) ++ { + tos = IPTOS_LOWDELAY; + if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0) + perror("ftp: setsockopt TOS (ignored)"); ++ } + #endif + cin = fdopen(s, "r"); + cout = fdopen(s, "w"); +@@ -182,7 +277,7 @@ + goto bad; + } + if (verbose) +- printf("Connected to %s.\n", hostname); ++ printf("Connected to %s (%s).\n", hostname, hbuf); + if (getreply(0) > 2) { /* read startup message from server */ + if (cin) + (void) fclose(cin); +@@ -392,8 +487,10 @@ + } + if (dig < 4 && isdigit(c)) + code = code * 10 + (c - '0'); +- if (!pflag && code == 227) ++ if (!pflag && (code == 227 || code == 228)) + pflag = 1; ++ else if (!pflag && code == 229) ++ pflag = 100; + if (dig > 4 && pflag == 1 && isdigit(c)) + pflag = 2; + if (pflag == 2) { +@@ -405,6 +502,8 @@ + pflag = 3; + } + } ++ if (pflag == 100 && c == '(') ++ pflag = 2; + if (dig == 4 && c == '-') { + if (continuation) + code = 0; +@@ -1083,15 +1182,25 @@ + static int + initconn(void) + { +- register char *p, *a; ++ u_char *p, *a; + int result, tmpno = 0; + socklen_t len; + int on = 1; +- int tos; +- u_long a1,a2,a3,a4,p1,p2; +- ++ int tos, error = 0; ++ u_int ad[16], po[2], af, alen, plen; ++ char *pasvcmd = NULL; ++ char hbuf[MAXHOSTNAMELEN], pbuf[NI_MAXSERV]; ++ ++#ifdef INET6 ++ if (myctladdr.su_family == AF_INET6 ++ && (IN6_IS_ADDR_LINKLOCAL(&myctladdr.su_sin6.sin6_addr) ++ || IN6_IS_ADDR_SITELOCAL(&myctladdr.su_sin6.sin6_addr))) { ++ fprintf(stderr, "use of scoped address can be troublesome\n"); ++ } ++#endif + if (passivemode) { +- data = socket(AF_INET, SOCK_STREAM, 0); ++ data_addr = hisctladdr; ++ data = socket(data_addr.su_family, SOCK_STREAM, 0); + if (data < 0) { + perror("ftp: socket"); + return(1); +@@ -1100,52 +1209,203 @@ + setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, + sizeof (on)) < 0) + perror("ftp: setsockopt (ignored)"); +- if (command("PASV") != COMPLETE) { ++ switch (data_addr.su_family) { ++ case AF_INET: ++#if 0 ++ if (try_epsv) { ++ result = command(pasvcmd = "EPSV 1"); ++ if (code / 10 == 22 && code != 229) { ++ fprintf(stderr, ++ "wrong server: return code must be 229\n"); ++ result = COMPLETE + 1; ++ } ++ } else { ++#endif ++ result = COMPLETE + 1; ++ ++ if (result != COMPLETE) { ++ try_epsv = 0; ++ result = command(pasvcmd = "PASV"); ++ } ++ break; ++#ifdef INET6 ++ case AF_INET6: ++ if (try_epsv) { ++ result = command(pasvcmd = "EPSV 2"); ++ if (code / 10 == 22 && code != 229) { ++ fprintf(stderr, ++ "wrong server: return code must be 229\n"); ++ result = COMPLETE + 1; ++ } ++ } else { ++ result = COMPLETE + 1; ++ } ++ if (result != COMPLETE) { ++ try_epsv = 0; ++ result = command(pasvcmd = "LPSV"); ++ } ++ break; ++#endif ++ default: ++ result = COMPLETE + 1; ++ break; ++ } ++ if (result != COMPLETE) { + printf("Passive mode refused.\n"); +- return(1); ++ goto bad; + } + ++#define pack2(var) \ ++ (((var[0] & 0xff) << 8) | ((var[1] & 0xff) << 0)) ++#define pack4(var) \ ++ ((((var)[0] & 0xff) << 24) | (((var)[1] & 0xff) << 16) | \ ++ (((var)[2] & 0xff) << 8) | (((var)[3] & 0xff) << 0)) ++ + /* + * What we've got at this point is a string of comma separated + * one-byte unsigned integer values, separated by commas. +- * The first four are the an IP address. The fifth is the MSB +- * of the port number, the sixth is the LSB. From that we'll +- * prepare a sockaddr_in. + */ +- +- if (sscanf(pasv,"%ld,%ld,%ld,%ld,%ld,%ld", +- &a1,&a2,&a3,&a4,&p1,&p2) +- != 6) +- { +- printf("Passive mode address scan failure. Shouldn't happen!\n"); +- return(1); ++ error = 0; ++ if (strcmp(pasvcmd, "PASV") == 0) { ++ if (data_addr.su_family != AF_INET) { ++ error = 2; ++ goto psv_done; ++ } ++ if (code / 10 == 22 && code != 227) { ++ error = 227; ++ goto psv_done; ++ } ++ if (sscanf(pasv, "%u,%u,%u,%u,%u,%u", ++ &ad[0], &ad[1], &ad[2], &ad[3], ++ &po[0], &po[1]) != 6) { ++ error = 1; ++ goto psv_done; ++ } ++ data_addr.su_sin.sin_addr.s_addr = htonl(pack4(ad)); ++ data_addr.su_port = htons(pack2(po)); ++ } else ++ if (strcmp(pasvcmd, "LPSV") == 0) { ++ if (code / 10 == 22 && code != 228) { ++ error = 228; ++ goto psv_done; ++ } ++ switch (data_addr.su_family) { ++ case AF_INET: ++ if (sscanf(pasv, "%u,%u,%u,%u,%u,%u,%u,%u,%u", ++ &af, &alen, ++ &ad[0], &ad[1], &ad[2], &ad[3], ++ &plen, &po[0], &po[1]) != 9) { ++ error = 1; ++ goto psv_done; ++ } ++ if (af != 4 || alen != 4 || plen != 2) { ++ error = 2; ++ goto psv_done; ++ } ++ data_addr.su_sin.sin_addr.s_addr = ++ htonl(pack4(ad)); ++ data_addr.su_port = htons(pack2(po)); ++ break; ++#ifdef INET6 ++ case AF_INET6: ++ if (sscanf(pasv, ++ "%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u", ++ &af, &alen, ++ &ad[0], &ad[1], &ad[2], &ad[3], ++ &ad[4], &ad[5], &ad[6], &ad[7], ++ &ad[8], &ad[9], &ad[10], &ad[11], ++ &ad[12], &ad[13], &ad[14], &ad[15], ++ &plen, &po[0], &po[1]) != 21) { ++ error = 1; ++ goto psv_done; ++ } ++ if (af != 6 || alen != 16 || plen != 2) { ++ error = 2; ++ goto psv_done; ++ } ++ data_addr.su_sin6.sin6_addr.s6_addr32[0] = ++ htonl(pack4(ad)); ++ data_addr.su_sin6.sin6_addr.s6_addr32[1] = ++ htonl(pack4(ad+4)); ++ data_addr.su_sin6.sin6_addr.s6_addr32[2] = ++ htonl(pack4(ad+8)); ++ data_addr.su_sin6.sin6_addr.s6_addr32[3] = ++ htonl(pack4(ad+12)); ++ data_addr.su_port = htons(pack2(po)); ++ break; ++#endif ++ default: ++ error = 1; ++ } ++ } else if (strncmp(pasvcmd, "EPSV", 4) == 0) { ++ char delim[4]; ++ u_int epsvpo; ++ ++ if (code / 10 == 22 && code != 229) { ++ error = 229; ++ goto psv_done; ++ } ++ if (sscanf(pasv, "%c%c%c%u%c", &delim[0], &delim[1], ++ &delim[2], &epsvpo, &delim[3]) != 5) { ++ error = 1; ++ goto psv_done; ++ } ++ if (delim[0] != delim[1] || delim[0] != delim[2] ++ || delim[0] != delim[3]) { ++ error = 1; ++ goto psv_done; ++ } ++ data_addr.su_port = htons(epsvpo); ++ } else { ++ error = 1; ++ } ++psv_done: ++ switch (error) { ++ case 0: ++ break; ++ case 1: ++ fprintf(stderr, ++ "Passive mode address scan failure. Shouldn't happen!\n"); ++ goto bad; ++ case 2: ++ fprintf(stderr, ++ "Passive mode AF mismatch. Shouldn't happen!\n"); ++ goto bad; ++ case 227: ++ case 228: ++ case 229: ++ fprintf(stderr, ++ "wrong server: return code must be %d\n", error); ++ goto bad; ++ default: ++ fprintf(stderr, "Bug\n"); + } + +- data_addr.sin_family = AF_INET; +- data_addr.sin_addr.s_addr = htonl((a1 << 24) | (a2 << 16) | +- (a3 << 8) | a4); +- data_addr.sin_port = htons((p1 << 8) | p2); +- + if (connect(data, (struct sockaddr *) &data_addr, +- sizeof(data_addr))<0) { ++ (data_addr.su_family == AF_INET ? ++ sizeof(data_addr.su_sin) : ++ sizeof(data_addr.su_sin6)))<0) { + perror("ftp: connect"); + return(1); + } + #ifdef IP_TOS ++ if (data_addr.su_family == AF_INET) ++ { + tos = IPTOS_THROUGHPUT; + if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&tos, + sizeof(tos)) < 0) + perror("ftp: setsockopt TOS (ignored)"); ++ } + #endif + return(0); + } + noport: + data_addr = myctladdr; + if (sendport) +- data_addr.sin_port = 0; /* let system pick one */ ++ data_addr.su_port = 0; /* let system pick one */ + if (data != -1) + (void) close(data); +- data = socket(AF_INET, SOCK_STREAM, 0); ++ data = socket(data_addr.su_family, SOCK_STREAM, 0); + if (data < 0) { + perror("ftp: socket"); + if (tmpno) +@@ -1172,13 +1432,47 @@ + if (listen(data, 1) < 0) + perror("ftp: listen"); + if (sendport) { +- a = (char *)&data_addr.sin_addr; +- p = (char *)&data_addr.sin_port; +-#define UC(b) (((int)b)&0xff) +- result = +- command("PORT %d,%d,%d,%d,%d,%d", +- UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), +- UC(p[0]), UC(p[1])); ++ af = ex_af2prot(data_addr.su_family); ++ if (try_eprt && af > 1) { /* only IPv6 */ ++ if (getnameinfo((struct sockaddr *)&data_addr, len, ++ hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), ++ NI_NUMERICHOST | NI_NUMERICSERV) == 0) { ++ result = command("EPRT |%d|%s|%s|", ++ af, hbuf, pbuf); ++ if (result != COMPLETE) { ++ try_eprt = 0; ++ } ++ } else { ++ result = ERROR; ++ } ++ } else { ++ result = COMPLETE + 1; ++ } ++ if (result == COMPLETE) ++ goto prt_done; ++ ++ p = (u_char *)&data_addr.su_port; ++ switch (data_addr.su_family) { ++ case AF_INET: ++ a = (u_char *)&data_addr.su_sin.sin_addr; ++ result = command("PORT %u,%u,%u,%u,%u,%u", ++ a[0], a[1], a[2], a[3], p[0], p[1]); ++ break; ++#ifdef INET6 ++ case AF_INET6: ++ a = (u_char *)&data_addr.su_sin6.sin6_addr; ++ result = command( ++ "LPRT 6,16,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,2,%d,%d", ++ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], ++ a[8], a[9],a[10],a[11],a[12],a[13],a[14],a[15], ++ p[0], p[1]); ++ break; ++#endif ++ default: ++ result = COMPLETE + 1; /* xxx */ ++ } ++ ++ prt_done: + if (result == ERROR && sendport == -1) { + sendport = 0; + tmpno = 1; +@@ -1189,9 +1483,12 @@ + if (tmpno) + sendport = 1; + #ifdef IP_TOS ++ if (data_addr.su_family == AF_INET) ++ { + on = IPTOS_THROUGHPUT; + if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, sizeof(int)) < 0) + perror("ftp: setsockopt TOS (ignored)"); ++ } + #endif + return (0); + bad: +@@ -1204,7 +1501,7 @@ + static FILE * + dataconn(const char *lmode) + { +- struct sockaddr_in from; ++ union sockunion from; + int s, tos; + socklen_t fromlen = sizeof(from); + +@@ -1220,9 +1517,12 @@ + (void) close(data); + data = s; + #ifdef IP_TOS ++ if (from.su_family == AF_INET) ++ { + tos = IPTOS_THROUGHPUT; + if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0) + perror("ftp: setsockopt TOS (ignored)"); ++ } + #endif + return (fdopen(data, lmode)); + } +@@ -1284,8 +1584,8 @@ + static struct comvars { + int connect; + char name[MAXHOSTNAMELEN]; +- struct sockaddr_in mctl; +- struct sockaddr_in hctl; ++ union sockunion mctl; ++ union sockunion hctl; + FILE *in; + FILE *out; + int tpe; +@@ -1323,7 +1623,7 @@ + connected = op->connect; + if (hostname) { + (void) strncpy(ip->name, hostname, sizeof(ip->name) - 1); +- ip->name[strlen(ip->name)] = '\0'; ++ ip->name[sizeof(ip->name) - 1] = '\0'; + } + else { + ip->name[0] = 0; +@@ -1352,18 +1652,18 @@ + ip->ntflg = ntflag; + ntflag = op->ntflg; + (void) strncpy(ip->nti, ntin, 16); +- (ip->nti)[strlen(ip->nti)] = '\0'; ++ (ip->nti)[16] = '\0'; /* shouldn't use strlen */ + (void) strcpy(ntin, op->nti); + (void) strncpy(ip->nto, ntout, 16); +- (ip->nto)[strlen(ip->nto)] = '\0'; ++ (ip->nto)[16] = '\0'; + (void) strcpy(ntout, op->nto); + ip->mapflg = mapflag; + mapflag = op->mapflg; + (void) strncpy(ip->mi, mapin, MAXPATHLEN - 1); +- (ip->mi)[strlen(ip->mi)] = '\0'; ++ (ip->mi)[MAXPATHLEN - 1] = '\0'; + (void) strcpy(mapin, op->mi); + (void) strncpy(ip->mo, mapout, MAXPATHLEN - 1); +- (ip->mo)[strlen(ip->mo)] = '\0'; ++ (ip->mo)[MAXPATHLEN - 1] = '\0'; + (void) strcpy(mapout, op->mo); + (void) signal(SIGINT, oldintr); + if (abrtflag) { +diff -uNr netkit-ftp-0.17/ftp/ftp_var.h netkit-ftp/ftp/ftp_var.h +--- netkit-ftp-0.17/ftp/ftp_var.h Sat Oct 2 21:39:17 1999 ++++ netkit-ftp/ftp/ftp_var.h Fri Jan 12 23:36:27 2001 +@@ -1,3 +1,5 @@ ++/* $USAGI$ */ ++ + /* + * Copyright (c) 1985, 1989 Regents of the University of California. + * All rights reserved. +@@ -31,7 +33,7 @@ + * SUCH DAMAGE. + * + * from: @(#)ftp_var.h 5.9 (Berkeley) 6/1/90 +- * $Id: ftp_var.h,v 1.12 1999/10/02 18:39:17 dholland Exp $ ++ * $Id: ftp_var.h,v 1.3 2001/01/12 21:36:27 sekiya Exp $ + */ + + /* +@@ -112,6 +114,8 @@ + Extern int mflag; /* flag: if != 0, then active multi command */ + + Extern int options; /* used during socket creation */ ++Extern int try_epsv; /* try EPSV for this session */ ++Extern int try_eprt; /* try EPRT for this session */ + + /* + * Format of command table. +@@ -140,7 +144,7 @@ + Extern char macbuf[4096]; + #define MACBUF_SIZE 4096 + +-char *hookup(char *host, int port); ++char *hookup(const char *host, const char *port); + struct cmd *getcmd(const char *); + char **makeargv(int *pargc, char **parg); + int dologin(const char *host); -- Gitee