1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-22 08:58:47 +00:00
freebsd-ports/misc/mc/files/patch-vfs-ftpfs.c
Max Khon 694ecd186a - Fix CAN-2004-0226, CAN-2004-0231, CAN-2004-0232.
- Do not use :: in patch file names.
- Patch for CAN-2003-1023 is now contained in patch-vfs-direntry.c.
- Bump PORTREVISION.

Submitted by:	Jakub Jelinek <jakub@redhat.com>
2004-06-14 20:56:00 +00:00

132 lines
3.5 KiB
C

--- 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;
}