2cc4303
Don't open a new socket without closing a possibly already-open one. RT#5597.
2cc4303
diff -uNr krb5/src/appl/gssftp/ftp/ftp.c krb5/src/appl/gssftp/ftp/ftp.c
2cc4303
--- krb5/src/appl/gssftp/ftp/ftp.c
2cc4303
+++ krb5/src/appl/gssftp/ftp/ftp.c
2cc4303
@@ -196,7 +196,7 @@ char *
2cc4303
 hookup(char* host, int port)
2cc4303
 {
2cc4303
 	register struct hostent *hp = 0;
2cc4303
-	int s;
2cc4303
+	int s, t;
2cc4303
 	socklen_t len;
2cc4303
 #ifdef IP_TOS
2cc4303
 #ifdef IPTOS_LOWDELAY
2cc4303
@@ -274,8 +274,13 @@ hookup(char* host, int port)
2cc4303
 	}
2cc4303
 #endif
2cc4303
 #endif
2cc4303
+#ifndef _WIN32
2cc4303
+	t = dup(s);
2cc4303
+#else
2cc4303
+	t = s;
2cc4303
+#endif
2cc4303
 	cin = FDOPEN_SOCKET(s, "r");
2cc4303
-	cout = FDOPEN_SOCKET(s, "w");
2cc4303
+	cout = FDOPEN_SOCKET(t, "w");
2cc4303
 	if (cin == NULL || cout == NULL) {
2cc4303
 		fprintf(stderr, "ftp: fdopen failed.\n");
2cc4303
 		if (cin) {
2cc4303
@@ -1448,6 +1453,8 @@
2cc4303
 	int a1,a2,a3,a4,p1,p2;
2cc4303
 
2cc4303
 	if (passivemode) {
2cc4303
+		if (data != INVALID_SOCKET)
2cc4303
+			(void) closesocket(data);
2cc4303
 		data = socket(AF_INET, SOCK_STREAM, 0);
2cc4303
 		if (data == INVALID_SOCKET) {
2cc4303
 			PERROR_SOCKET("ftp: socket");
2cc4303
@@ -2366,4 +2371,16 @@ FILE* fdopen_socket(SOCKET s, char* mode
2cc4303
 
2cc4303
 	return f;
2cc4303
 }
2cc4303
+#else
2cc4303
+/* Non-Win32 case takes the address of the variable so that we can "take
2cc4303
+ * ownership" of the descriptor number. */
2cc4303
+FILE* fdopen_socket(int *s, char* mode)
2cc4303
+{
2cc4303
+	FILE *fp;
2cc4303
+	fp = fdopen(*s, mode);
2cc4303
+	if (fp) {
2cc4303
+		*s = INVALID_SOCKET;
2cc4303
+	}
2cc4303
+	return fp;
2cc4303
+}
2cc4303
 #endif /* _WIN32 */
2cc4303
diff -up krb5-1.3.4/src/appl/gssftp/ftp/ftp_var.h krb5-1.3.4/src/appl/gssftp/ftp/ftp_var.h
2cc4303
--- krb5-1.3.4/src/appl/gssftp/ftp/ftp_var.h	2007-08-03 00:53:35.000000000 -0400
2cc4303
+++ krb5-1.3.4/src/appl/gssftp/ftp/ftp_var.h	2007-08-03 00:53:39.000000000 -0400
2cc4303
@@ -48,7 +48,8 @@ FILE* fdopen_socket(SOCKET s, char* mode
2cc4303
 #define PERROR_SOCKET(str) do { errno = SOCKET_ERRNO; perror(str); } while(0)
2cc4303
 #else
2cc4303
 #define FCLOSE_SOCKET(f) fclose(f)
2cc4303
-#define FDOPEN_SOCKET(s, mode) fdopen(s, mode)
2cc4303
+FILE* fdopen_socket(int *s, char* mode);
2cc4303
+#define FDOPEN_SOCKET(s, mode) fdopen_socket(&s, mode)
2cc4303
 #define SOCKETNO(fd) (fd)
2cc4303
 #define PERROR_SOCKET(str) perror(str)
2cc4303
 #endif