diff options
Diffstat (limited to 'misc/mc/files/patch-vfs-ftpfs.c')
-rw-r--r-- | misc/mc/files/patch-vfs-ftpfs.c | 131 |
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; + } |