summaryrefslogtreecommitdiff
path: root/misc/mc/files/patch-vfs-ftpfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/mc/files/patch-vfs-ftpfs.c')
-rw-r--r--misc/mc/files/patch-vfs-ftpfs.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/misc/mc/files/patch-vfs-ftpfs.c b/misc/mc/files/patch-vfs-ftpfs.c
new file mode 100644
index 000000000000..bfd46fef3436
--- /dev/null
+++ b/misc/mc/files/patch-vfs-ftpfs.c
@@ -0,0 +1,131 @@
+--- vfs/ftpfs.c.orig Thu Dec 26 08:21:43 2002
++++ vfs/ftpfs.c Tue Jun 15 03:15:09 2004
+@@ -266,8 +266,7 @@
+ switch (sscanf(answer, "%d", &code)){
+ case 0:
+ if (string_buf) {
+- strncpy (string_buf, answer, string_len - 1);
+- *(string_buf + string_len - 1) = 0;
++ g_strlcpy (string_buf, answer, string_len);
+ }
+ code = 500;
+ return 5;
+@@ -286,8 +285,7 @@
+ }
+ }
+ if (string_buf){
+- strncpy (string_buf, answer, string_len - 1);
+- *(string_buf + string_len - 1) = 0;
++ g_strlcpy (string_buf, answer, string_len);
+ }
+ return code / 100;
+ }
+@@ -321,28 +319,28 @@
+ va_list ap;
+ char *str, *fmt_str;
+ int status;
+- int sock = SUP.sock;
++ int cmdlen;
+
+ va_start (ap, fmt);
+ fmt_str = g_strdup_vprintf (fmt, ap);
+ va_end (ap);
+
+- status = strlen (fmt_str);
+- str = g_realloc (fmt_str, status + 3);
+- strcpy (str + status, "\r\n");
++ cmdlen = strlen (fmt_str);
++ str = g_realloc (fmt_str, cmdlen + 3);
++ strcpy (str + cmdlen, "\r\n");
+
+ if (logfile){
+ if (strncmp (str, "PASS ", 5) == 0){
+ fputs ("PASS <Password not logged>\r\n", logfile);
+ } else
+- fwrite (str, status + 2, 1, logfile);
++ fwrite (str, cmdlen + 2, 1, logfile);
+
+ fflush (logfile);
+ }
+
+ got_sigpipe = 0;
+ enable_interrupt_key ();
+- status = write (SUP.sock, str, status + 2);
++ status = write (SUP.sock, str, cmdlen + 2);
+
+ if (status < 0){
+ code = 421;
+@@ -353,7 +351,7 @@
+ level = 1;
+ status = reconnect (me, super);
+ level = 0;
+- if (status && write (SUP.sock, str, status + 2) > 0)
++ if (status && write (SUP.sock, str, cmdlen + 2) > 0)
+ goto ok;
+ }
+ got_sigpipe = 1;
+@@ -367,7 +365,7 @@
+ disable_interrupt_key ();
+
+ if (wait_reply)
+- return get_reply (me, sock, (wait_reply & WANT_STRING) ? reply_str : NULL, sizeof (reply_str)-1);
++ return get_reply (me, SUP.sock, (wait_reply & WANT_STRING) ? reply_str : NULL, sizeof (reply_str)-1);
+ return COMPLETE;
+ }
+
+@@ -903,23 +901,29 @@
+ int data, len = sizeof(data_addr);
+ struct protoent *pe;
+
+- getsockname(SUP.sock, (struct sockaddr *) &data_addr, &len);
+- data_addr.sin_port = 0;
+-
+ pe = getprotobyname("tcp");
+ if (pe == NULL)
+ ERRNOR (EIO, -1);
++again:
++ if (getsockname(SUP.sock, (struct sockaddr *) &data_addr, &len) == -1)
++ ERRNOR (EIO, -1);
++ data_addr.sin_port = 0;
++
+ data = socket (AF_INET, SOCK_STREAM, pe->p_proto);
+ if (data < 0)
+ ERRNOR (EIO, -1);
+
+ if (SUP.use_passive_connection){
+- if ((SUP.use_passive_connection = setup_passive (me, super, data, &data_addr)))
++ if (setup_passive (me, super, data, &data_addr))
+ return data;
+
+ SUP.use_source_route = 0;
+ SUP.use_passive_connection = 0;
+ print_vfs_message (_("ftpfs: could not setup passive mode"));
++
++ /* data or data_addr may be damaged by setup_passive */
++ close (data);
++ goto again;
+ }
+
+ /* If passive setup fails, fallback to active connections */
+@@ -971,11 +975,12 @@
+ data = s;
+ else {
+ data = accept (s, (struct sockaddr *)&from, &fromlen);
+- close(s);
+ if (data < 0) {
+ my_errno = errno;
++ close(s);
+ return -1;
+ }
++ close(s);
+ }
+ disable_interrupt_key();
+ return data;
+@@ -1019,6 +1024,7 @@
+ gettimeofday (&tim, NULL);
+ if (tim.tv_sec > start_tim.tv_sec + ABORT_TIMEOUT) {
+ /* server keeps sending, drop the connection and reconnect */
++ close (dsock);
+ reconnect (me, super);
+ return;
+ }