Patch originally from Fedora

http://pkgs.fedoraproject.org/cgit/tftp.git/

Upstream-Status: Pending

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')
