1Patch originally from Fedora 2 3http://pkgs.fedoraproject.org/cgit/tftp.git/ 4 5Upstream-Status: Pending 6 7diff -up tftp-hpa-0.49/config.h.cmd_arg tftp-hpa-0.49/config.h 8--- tftp-hpa-0.49/config.h.cmd_arg 2010-04-19 15:29:10.567331454 +0200 9+++ tftp-hpa-0.49/config.h 2010-04-20 07:33:03.133232772 +0200 10@@ -291,6 +291,7 @@ typedef int socklen_t; 11 /* Prototypes for libxtra functions */ 12 13 void *xmalloc(size_t); 14+void *xrealloc(void *, size_t); 15 char *xstrdup(const char *); 16 17 #ifndef HAVE_BSD_SIGNAL 18diff -up tftp-hpa-0.49/configure.in.cmd_arg tftp-hpa-0.49/configure.in 19--- tftp-hpa-0.49/configure.in.cmd_arg 2008-10-21 00:08:31.000000000 +0200 20+++ tftp-hpa-0.49/configure.in 2010-04-19 11:05:12.387340698 +0200 21@@ -152,6 +152,7 @@ OBJROOT=`pwd` 22 23 XTRA=false 24 PA_SEARCH_LIBS_AND_ADD(xmalloc, iberty) 25+PA_SEARCH_LIBS_AND_ADD(xrealloc, iberty) 26 PA_SEARCH_LIBS_AND_ADD(xstrdup, iberty) 27 PA_SEARCH_LIBS_AND_ADD(bsd_signal, bsd, bsdsignal) 28 PA_SEARCH_LIBS_AND_ADD(getopt_long, getopt, getopt_long) 29diff -up tftp-hpa-0.49/lib/xrealloc.c.cmd_arg tftp-hpa-0.49/lib/xrealloc.c 30--- tftp-hpa-0.49/lib/xrealloc.c.cmd_arg 2010-04-19 11:05:12.387340698 +0200 31+++ tftp-hpa-0.49/lib/xrealloc.c 2010-04-19 11:05:12.387340698 +0200 32@@ -0,0 +1,20 @@ 33+/* 34+ * xrealloc.c 35+ * 36+ * Simple error-checking version of realloc() 37+ * 38+ */ 39+ 40+#include "config.h" 41+ 42+void *xrealloc(void *ptr, size_t size) 43+{ 44+ void *p = realloc(ptr, size); 45+ 46+ if (!p) { 47+ fprintf(stderr, "Out of memory!\n"); 48+ exit(128); 49+ } 50+ 51+ return p; 52+} 53diff -up tftp-hpa-0.49/tftp/main.c.cmd_arg tftp-hpa-0.49/tftp/main.c 54--- tftp-hpa-0.49/tftp/main.c.cmd_arg 2008-10-21 00:08:31.000000000 +0200 55+++ tftp-hpa-0.49/tftp/main.c 2010-04-19 11:05:12.389329337 +0200 56@@ -89,11 +89,14 @@ int connected; 57 const struct modes *mode; 58 #ifdef WITH_READLINE 59 char *line = NULL; 60+char *remote_pth = NULL; 61 #else 62 char line[LBUFLEN]; 63+char remote_pth[LBUFLEN]; 64 #endif 65 int margc; 66-char *margv[20]; 67+char **margv; 68+int sizeof_margv=0; 69 const char *prompt = "tftp> "; 70 sigjmp_buf toplevel; 71 void intr(int); 72@@ -379,6 +382,10 @@ static void getmoreargs(const char *part 73 free(line); 74 line = NULL; 75 } 76+ if (remote_pth) { 77+ free(remote_pth); 78+ remote_pth = NULL; 79+ } 80 line = xmalloc(len + elen + 1); 81 strcpy(line, partial); 82 strcpy(line + len, eline); 83@@ -535,6 +542,7 @@ void put(int argc, char *argv[]) 84 int fd; 85 int n, err; 86 char *cp, *targ; 87+ long dirlen, namelen, lastlen=0; 88 89 if (argc < 2) { 90 getmoreargs("send ", "(file) "); 91@@ -588,9 +596,22 @@ void put(int argc, char *argv[]) 92 } 93 /* this assumes the target is a directory */ 94 /* on a remote unix system. hmmmm. */ 95- cp = strchr(targ, '\0'); 96- *cp++ = '/'; 97+ dirlen = strlen(targ)+1; 98+#ifdef WITH_READLINE 99+ remote_pth = xmalloc(dirlen+1); 100+#endif 101+ strcpy(remote_pth, targ); 102+ remote_pth[dirlen-1] = '/'; 103+ cp = remote_pth + dirlen; 104 for (n = 1; n < argc - 1; n++) { 105+#ifdef WITH_READLINE 106+ namelen = strlen(tail(argv[n])) + 1; 107+ if (namelen > lastlen) { 108+ remote_pth = xrealloc(remote_pth, dirlen + namelen + 1); 109+ cp = remote_pth + dirlen; 110+ lastlen = namelen; 111+ } 112+#endif 113 strcpy(cp, tail(argv[n])); 114 fd = open(argv[n], O_RDONLY | mode->m_openflags); 115 if (fd < 0) { 116@@ -600,9 +621,9 @@ void put(int argc, char *argv[]) 117 } 118 if (verbose) 119 printf("putting %s to %s:%s [%s]\n", 120- argv[n], hostname, targ, mode->m_mode); 121+ argv[n], hostname, remote_pth, mode->m_mode); 122 sa_set_port(&peeraddr, port); 123- tftp_sendfile(fd, targ, mode->m_mode); 124+ tftp_sendfile(fd, remote_pth, mode->m_mode); 125 } 126 } 127 128@@ -801,6 +822,10 @@ static void command(void) 129 free(line); 130 line = NULL; 131 } 132+ if (remote_pth) { 133+ free(remote_pth); 134+ remote_pth = NULL; 135+ } 136 line = readline(prompt); 137 if (!line) 138 exit(0); /* EOF */ 139@@ -872,7 +897,13 @@ struct cmd *getcmd(char *name) 140 static void makeargv(void) 141 { 142 char *cp; 143- char **argp = margv; 144+ char **argp; 145+ 146+ if (!sizeof_margv) { 147+ sizeof_margv = 20; 148+ margv = xmalloc(sizeof_margv * sizeof(char *)); 149+ } 150+ argp = margv; 151 152 margc = 0; 153 for (cp = line; *cp;) { 154@@ -882,6 +913,11 @@ static void makeargv(void) 155 break; 156 *argp++ = cp; 157 margc += 1; 158+ if (margc == sizeof_margv) { 159+ sizeof_margv += 20; 160+ margv = xrealloc(margv, sizeof_margv * sizeof(char *)); 161+ argp = margv + margc; 162+ } 163 while (*cp != '\0' && !isspace(*cp)) 164 cp++; 165 if (*cp == '\0') 166