+++ /dev/null
-diff -up tftp-hpa-0.49/tftpd/remap.c.zero tftp-hpa-0.49/tftpd/remap.c
---- tftp-hpa-0.49/tftpd/remap.c.zero 2008-10-20 18:08:31.000000000 -0400
-+++ tftp-hpa-0.49/tftpd/remap.c 2008-11-25 11:41:09.000000000 -0500
-@@ -286,6 +286,7 @@ struct rule *parserulefile(FILE * f)
- int lineno = 0;
- int err = 0;
-
-+ memset(this_rule, '\0', sizeof(struct rule));
- while (lineno++, fgets(line, MAXLINE, f)) {
- rv = parseline(line, this_rule, lineno);
- if (rv < 0)
-@@ -294,6 +295,7 @@ struct rule *parserulefile(FILE * f)
- *last_rule = this_rule;
- last_rule = &this_rule->next;
- this_rule = tfmalloc(sizeof(struct rule));
-+ memset(this_rule, '\0', sizeof(struct rule));
- }
- }
-
+++ /dev/null
-diff -up tftp-hpa-0.48/tftp-xinetd.tftpboot tftp-hpa-0.48/tftp-xinetd
---- tftp-hpa-0.48/tftp-xinetd.tftpboot 2007-01-31 00:51:05.000000000 +0100
-+++ tftp-hpa-0.48/tftp-xinetd 2008-05-20 12:05:53.000000000 +0200
-@@ -10,7 +10,7 @@ service tftp
- wait = yes
- user = root
- server = /usr/sbin/in.tftpd
-- server_args = -s /tftpboot
-+ server_args = -s /var/lib/tftpboot
- disable = yes
- per_source = 11
- cps = 100 2
-diff -up tftp-hpa-0.48/README.security.tftpboot tftp-hpa-0.48/README.security
---- tftp-hpa-0.48/README.security.tftpboot 2008-05-29 17:36:32.000000000 +0200
-+++ tftp-hpa-0.48/README.security 2008-05-29 17:37:21.000000000 +0200
-@@ -17,10 +17,10 @@ probably the following:
-
- 1. Create a separate "tftpd" user and group only used for tftpd;
- 2. Have all your boot files in a single directory tree (usually called
-- /tftpboot).
--3. Specify "-p -u tftpd -s /tftpboot" on the tftpd command line; if
-+ /var/lib/tftpboot).
-+3. Specify "-p -u tftpd -s /var/lib/tftpboot" on the tftpd command line; if
- you want clients to be able to create files use
-- "-p -c -U 002 -u tftpd -s /tftpboot" (replace 002 with whatever
-+ "-p -c -U 002 -u tftpd -s /var/lib/tftpboot" (replace 002 with whatever
- umask is appropriate for your setup.)
-
- =======================================
-@@ -40,12 +40,12 @@ directly. Thus, if your /etc/inetd.conf
- line):
-
- tftp dgram udp wait root /usr/sbin/tcpd
--/usr/sbin/in.tftpd -s /tftpboot -r blksize
-+/usr/sbin/in.tftpd -s /var/lib/tftpboot -r blksize
-
- ... it's better to change to ...
-
- tftp dgram udp wait root /usr/sbin/in.tftpd
--in.tftpd -s /tftpboot -r blksize
-+in.tftpd -s /var/lib/tftpboot -r blksize
-
- You should make sure that you are using "wait" option in tftpd; you
- also need to have tftpd spawned as root in order for chroot (-s) to
-diff -up tftp-hpa-0.48/tftpd/sample.rules.tftpboot tftp-hpa-0.48/tftpd/sample.rules
---- tftp-hpa-0.48/tftpd/sample.rules.tftpboot 2008-05-29 17:38:46.000000000 +0200
-+++ tftp-hpa-0.48/tftpd/sample.rules 2008-05-29 17:38:05.000000000 +0200
-@@ -30,5 +30,5 @@ rg \\ / # Convert backslashes to slash
- rg \# @ # Convert hash marks to @ signs
- rg /../ /..no../ # Convert /../ to /..no../
- e ^ok/ # These are always ok
--r ^[^/] /tftpboot/\0 # Convert non-absolute files
-+r ^[^/] /var/lib/tftpboot/\0 # Convert non-absolute files
- a \.pvt$ # Reject requests for private files
+++ /dev/null
-diff -up tftp-hpa-0.49/tftpd/tftpd.c.chk_retcodes tftp-hpa-0.49/tftpd/tftpd.c
---- tftp-hpa-0.49/tftpd/tftpd.c.chk_retcodes 2009-01-15 15:28:50.000000000 +0100
-+++ tftp-hpa-0.49/tftpd/tftpd.c 2009-01-15 15:31:36.000000000 +0100
-@@ -932,7 +932,10 @@ int main(int argc, char **argv)
- exit(EX_OSERR);
- }
- #ifdef __CYGWIN__
-- chdir("/"); /* Cygwin chroot() bug workaround */
-+ if (chdir("/") < 0) { /* Cygwin chroot() bug workaround */
-+ syslog(LOG_ERR, "chroot: %m");
-+ exit(EX_OSERR);
-+ }
- #endif
- }
- #ifdef HAVE_SETREGID
+++ /dev/null
-diff -up tftp-hpa-0.49/config.h.cmd_arg tftp-hpa-0.49/config.h
---- tftp-hpa-0.49/config.h.cmd_arg 2010-04-19 15:29:10.567331454 +0200
-+++ tftp-hpa-0.49/config.h 2010-04-20 07:33:03.133232772 +0200
-@@ -291,6 +291,7 @@ typedef int socklen_t;
- /* Prototypes for libxtra functions */
-
- void *xmalloc(size_t);
-+void *xrealloc(void *, size_t);
- char *xstrdup(const char *);
-
- #ifndef HAVE_BSD_SIGNAL
-diff -up tftp-hpa-0.49/configure.in.cmd_arg tftp-hpa-0.49/configure.in
---- tftp-hpa-0.49/configure.in.cmd_arg 2008-10-21 00:08:31.000000000 +0200
-+++ tftp-hpa-0.49/configure.in 2010-04-19 11:05:12.387340698 +0200
-@@ -152,6 +152,7 @@ OBJROOT=`pwd`
-
- XTRA=false
- PA_SEARCH_LIBS_AND_ADD(xmalloc, iberty)
-+PA_SEARCH_LIBS_AND_ADD(xrealloc, iberty)
- PA_SEARCH_LIBS_AND_ADD(xstrdup, iberty)
- PA_SEARCH_LIBS_AND_ADD(bsd_signal, bsd, bsdsignal)
- PA_SEARCH_LIBS_AND_ADD(getopt_long, getopt, getopt_long)
-diff -up tftp-hpa-0.49/lib/xrealloc.c.cmd_arg tftp-hpa-0.49/lib/xrealloc.c
---- tftp-hpa-0.49/lib/xrealloc.c.cmd_arg 2010-04-19 11:05:12.387340698 +0200
-+++ tftp-hpa-0.49/lib/xrealloc.c 2010-04-19 11:05:12.387340698 +0200
-@@ -0,0 +1,20 @@
-+/*
-+ * xrealloc.c
-+ *
-+ * Simple error-checking version of realloc()
-+ *
-+ */
-+
-+#include "config.h"
-+
-+void *xrealloc(void *ptr, size_t size)
-+{
-+ void *p = realloc(ptr, size);
-+
-+ if (!p) {
-+ fprintf(stderr, "Out of memory!\n");
-+ exit(128);
-+ }
-+
-+ return p;
-+}
-diff -up tftp-hpa-0.49/tftp/main.c.cmd_arg tftp-hpa-0.49/tftp/main.c
---- tftp-hpa-0.49/tftp/main.c.cmd_arg 2008-10-21 00:08:31.000000000 +0200
-+++ tftp-hpa-0.49/tftp/main.c 2010-04-19 11:05:12.389329337 +0200
-@@ -89,11 +89,14 @@ int connected;
- const struct modes *mode;
- #ifdef WITH_READLINE
- char *line = NULL;
-+char *remote_pth = NULL;
- #else
- char line[LBUFLEN];
-+char remote_pth[LBUFLEN];
- #endif
- int margc;
--char *margv[20];
-+char **margv;
-+int sizeof_margv=0;
- const char *prompt = "tftp> ";
- sigjmp_buf toplevel;
- void intr(int);
-@@ -379,6 +382,10 @@ static void getmoreargs(const char *part
- free(line);
- line = NULL;
- }
-+ if (remote_pth) {
-+ free(remote_pth);
-+ remote_pth = NULL;
-+ }
- line = xmalloc(len + elen + 1);
- strcpy(line, partial);
- strcpy(line + len, eline);
-@@ -535,6 +542,7 @@ void put(int argc, char *argv[])
- int fd;
- int n, err;
- char *cp, *targ;
-+ long dirlen, namelen, lastlen=0;
-
- if (argc < 2) {
- getmoreargs("send ", "(file) ");
-@@ -588,9 +596,22 @@ void put(int argc, char *argv[])
- }
- /* this assumes the target is a directory */
- /* on a remote unix system. hmmmm. */
-- cp = strchr(targ, '\0');
-- *cp++ = '/';
-+ dirlen = strlen(targ)+1;
-+#ifdef WITH_READLINE
-+ remote_pth = xmalloc(dirlen+1);
-+#endif
-+ strcpy(remote_pth, targ);
-+ remote_pth[dirlen-1] = '/';
-+ cp = remote_pth + dirlen;
- for (n = 1; n < argc - 1; n++) {
-+#ifdef WITH_READLINE
-+ namelen = strlen(tail(argv[n])) + 1;
-+ if (namelen > lastlen) {
-+ remote_pth = xrealloc(remote_pth, dirlen + namelen + 1);
-+ cp = remote_pth + dirlen;
-+ lastlen = namelen;
-+ }
-+#endif
- strcpy(cp, tail(argv[n]));
- fd = open(argv[n], O_RDONLY | mode->m_openflags);
- if (fd < 0) {
-@@ -600,9 +621,9 @@ void put(int argc, char *argv[])
- }
- if (verbose)
- printf("putting %s to %s:%s [%s]\n",
-- argv[n], hostname, targ, mode->m_mode);
-+ argv[n], hostname, remote_pth, mode->m_mode);
- sa_set_port(&peeraddr, port);
-- tftp_sendfile(fd, targ, mode->m_mode);
-+ tftp_sendfile(fd, remote_pth, mode->m_mode);
- }
- }
-
-@@ -801,6 +822,10 @@ static void command(void)
- free(line);
- line = NULL;
- }
-+ if (remote_pth) {
-+ free(remote_pth);
-+ remote_pth = NULL;
-+ }
- line = readline(prompt);
- if (!line)
- exit(0); /* EOF */
-@@ -872,7 +897,13 @@ struct cmd *getcmd(char *name)
- static void makeargv(void)
- {
- char *cp;
-- char **argp = margv;
-+ char **argp;
-+
-+ if (!sizeof_margv) {
-+ sizeof_margv = 20;
-+ margv = xmalloc(sizeof_margv * sizeof(char *));
-+ }
-+ argp = margv;
-
- margc = 0;
- for (cp = line; *cp;) {
-@@ -882,6 +913,11 @@ static void makeargv(void)
- break;
- *argp++ = cp;
- margc += 1;
-+ if (margc == sizeof_margv) {
-+ sizeof_margv += 20;
-+ margv = xrealloc(margv, sizeof_margv * sizeof(char *));
-+ argp = margv + margc;
-+ }
- while (*cp != '\0' && !isspace(*cp))
- cp++;
- if (*cp == '\0')
+++ /dev/null
---- tftp-hpa-5.2/tftp/main.c 2013-04-19 09:34:09.737410319 +0200
-+++ tftp-hpa-5.2/tftp/main.c 2013-04-19 09:42:53.559946374 +0200
-@@ -195,9 +195,11 @@
- {
- fprintf(stderr,
- #ifdef HAVE_IPV6
-- "Usage: %s [-4][-6][-v][-l][-m mode] [host [port]] [-c command]\n",
-+ "Usage: %s [-4][-6][-v][-V][-l][-m mode] [-R port:port] "
-+ "[host [port]] [-c command]\n",
- #else
-- "Usage: %s [-v][-l][-m mode] [host [port]] [-c command]\n",
-+ "Usage: %s [-v][-V][-l][-m mode] [-R port:port] "
-+ "[host [port]] [-c command]\n",
- #endif
- program);
- exit(errcode);
---- tftp-hpa-5.2/tftpd/tftpd.8.in 2012-11-20 09:43:46.000000000 +0100
-+++ tftp-hpa-5.2/tftpd/tftpd.8.in 2013-04-19 09:44:37.399057279 +0200
-@@ -155,7 +155,7 @@
- .B utimeout
- option is negotiated. The default is 1000000 (1 second.)
- .TP
--\fB\-\-mapfile\fP \fIremap-file\fP, \fB\-m\fP \fIremap-file\fP
-+\fB\-\-map\-file\fP \fIremap-file\fP, \fB\-m\fP \fIremap-file\fP
- Specify the use of filename remapping. The
- .I remap-file
- is a file containing the remapping rules. See the section on filename
+++ /dev/null
-diff -up tftp-hpa-0.49/tftpd/tftpd.c.tzfix tftp-hpa-0.49/tftpd/tftpd.c
---- tftp-hpa-0.49/tftpd/tftpd.c.tzfix 2008-10-20 18:08:31.000000000 -0400
-+++ tftp-hpa-0.49/tftpd/tftpd.c 2008-11-25 11:45:27.000000000 -0500
-@@ -350,6 +350,14 @@ int main(int argc, char **argv)
- const char *pidfile = NULL;
- u_short tp_opcode;
-
-+ time_t my_time = 0;
-+ struct tm* p_tm;
-+ char envtz[10];
-+ my_time = time(NULL);
-+ p_tm = localtime(&my_time);
-+ snprintf(envtz, sizeof(envtz) - 1, "UTC%+d", (p_tm->tm_gmtoff * -1)/3600);
-+ setenv("TZ", envtz, 0);
-+
- /* basename() is way too much of a pain from a portability standpoint */
-
- p = strrchr(argv[0], '/');
+++ /dev/null
-diff -urN tftp-hpa-0.49.orig/tftp/tftp.c tftp-hpa-0.49/tftp/tftp.c
---- tftp-hpa-0.49.orig/tftp/tftp.c 2008-10-20 18:08:31.000000000 -0400
-+++ tftp-hpa-0.49/tftp/tftp.c 2009-08-05 09:47:18.072585848 -0400
-@@ -279,15 +279,16 @@
- struct tftphdr *tp, const char *mode)
- {
- char *cp;
-+ size_t len;
-
- tp->th_opcode = htons((u_short) request);
- cp = (char *)&(tp->th_stuff);
-- strcpy(cp, name);
-- cp += strlen(name);
-- *cp++ = '\0';
-- strcpy(cp, mode);
-- cp += strlen(mode);
-- *cp++ = '\0';
-+ len = strlen(name) + 1;
-+ memcpy(cp, name, len);
-+ cp += len;
-+ len = strlen(mode) + 1;
-+ memcpy(cp, mode, len);
-+ cp += len;
- return (cp - (char *)tp);
- }
-
+++ /dev/null
-diff -up tftp-hpa-0.49/tftp/tftp.c.stats tftp-hpa-0.49/tftp/tftp.c
---- tftp-hpa-0.49/tftp/tftp.c.stats 2011-01-03 15:38:34.217918067 +0100
-+++ tftp-hpa-0.49/tftp/tftp.c 2011-01-03 15:38:37.498917014 +0100
-@@ -400,8 +400,8 @@ static void printstats(const char *direc
- {
- double delta;
-
-- delta = (tstop.tv_sec + (tstop.tv_usec / 100000.0)) -
-- (tstart.tv_sec + (tstart.tv_usec / 100000.0));
-+ delta = (tstop.tv_sec + (tstop.tv_usec / 1000000.0)) -
-+ (tstart.tv_sec + (tstart.tv_usec / 1000000.0));
- if (verbose) {
- printf("%s %lu bytes in %.1f seconds", direction, amount, delta);
- printf(" [%.0f bit/s]", (amount * 8.) / delta);
+++ /dev/null
-diff -up tftp-hpa-5.2/tftpd/recvfrom.c.test tftp-hpa-5.2/tftpd/recvfrom.c
---- tftp-hpa-5.2/tftpd/recvfrom.c.test 2011-12-11 23:13:52.000000000 +0100
-+++ tftp-hpa-5.2/tftpd/recvfrom.c 2012-01-04 10:05:17.852042256 +0100
-@@ -149,16 +149,16 @@ myrecvfrom(int s, void *buf, int len, un
-
- /* Try to enable getting the return address */
- #ifdef IP_RECVDSTADDR
-- if (from->sa_family == AF_INET)
-+ if (from->sa_family == AF_INET || !from->sa_family)
- setsockopt(s, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on));
- #endif
- #ifdef IP_PKTINFO
-- if (from->sa_family == AF_INET)
-+ if (from->sa_family == AF_INET || !from->sa_family)
- setsockopt(s, IPPROTO_IP, IP_PKTINFO, &on, sizeof(on));
- #endif
- #ifdef HAVE_IPV6
- #ifdef IPV6_RECVPKTINFO
-- if (from->sa_family == AF_INET6)
-+ if (from->sa_family == AF_INET6 || !from->sa_family)
- setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on));
- #endif
- #endif
+++ /dev/null
-[Unit]
-Description=Tftp Server
-
-[Service]
-ExecStart=/usr/sbin/in.tftpd -u tftp -s /var/lib/tftpboot
-StandardInput=socket
+++ /dev/null
-[Unit]
-Description=Tftp Server Activation Socket
-
-[Socket]
-ListenDatagram=69
-
-[Install]
-WantedBy=sockets.target
+++ /dev/null
-###############################################################################
-# IPFire.org - An Open Source Firewall Solution #
-# Copyright (C) - IPFire Development Team <info@ipfire.org> #
-###############################################################################
-
-name = tftp
-version = 5.2
-release = 1
-
-groups = Applications/Network
-url = http://www.kernel.org/pub/software/network/tftp/
-license = BSD
-summary = Client and server for the Trivial File Transfer Protocol (TFTP).
-
-description
- The Trivial File Transfer Protocol (TFTP) is normally used only for
- booting diskless workstations.
-end
-
-thisapp = %{name}-hpa-%{version}
-
-source_dl = http://www.kernel.org/pub/software/network/tftp/tftp-hpa/
-
-
-build
- requires
- autoconf
- readline-devel
- shadow-utils
- end
-
- prepare_cmds
- autoreconf -vfi
- %{create_user}
- end
-
- make_install_targets += \
- INSTALLROOT=%{BUILDROOT}
-
- install_cmds
- mkdir -pv %{BUILDROOT}%{sharedstatedir}/tftpboot
- chown tftp:tftp %{BUILDROOT}%{sharedstatedir}/tftpboot
- end
-end
-
-create_user
- getent group tftp >/dev/null || /usr/sbin/groupadd -r tftp
- getent passwd tftp >/dev/null || /usr/sbin/useradd -r -g tftp \
- -d %{sharedstatedir}/tftpboot -s /sbin/nologin tftp
-end
-
-packages
- package %{name}
- requires
- %{name}-client = %{thisver}
- %{name}-server = %{thisver}
- end
- end
-
- package %{name}-client
- summary = A client programm for the Trivial File Transfer Protocol (TFTP).
- description
- The tftp-client package provides the user
- interface for TFTP, which allows users to transfer files to and from a
- remote machine. This program and TFTP provide very little security,
- and should not be enabled unless it is expressly needed.
- end
-
- files
- %{bindir}/tftp
- %{mandir}/man1/tftp*
- end
- end
-
- package %{name}-server
- summary = A Trivial File Transfer Protocol (TFTP) server.
- description
- The tftp-server package provides the
- server for TFTP, which allows users to transfer files to and from a
- remote machine. TFTP provides very little security, and should not be
- enabled unless it is expressly needed.
- end
-
- prerequires += \
- shadow-utils
-
- datafiles
- %{sharedstatedir}/tftpboot
- end
-
- files
- %{sbindir}/in.tftpd
- %{mandir}/man8/*
- %{unitdir}/tftp.*
- %{sharedstatedir}/tftpboot
- end
-
- script prein
- %{create_user}
- end
-
- script postin
- systemctl daemon-reload >/dev/null 2>&1 || :
- end
-
- script preun
- systemctl --no-reload disable tftp.socket >/dev/null 2>&1 || :
- systemctl stop tftp.socket >/dev/null 2>&1 || :
- systemctl stop tftp.service >/dev/null 2>&1 || :
- end
-
- script postun
- systemctl daemon-reload >/dev/null 2>&1 || :
- end
-
- script postup
- systemctl daemon-reload >/dev/null 2>&1 || :
- systemctl try-restart tftp.service >/dev/null 2>&1 || :
- end
- end
-
- package %{name}-debuginfo
- template DEBUGINFO
- end
-end