瀏覽代碼

apply a patch from the FreeBSD ports tree which fixes reply code handling for USER command

Ralf S. Engelschall 19 年之前
父節點
當前提交
e25a2f30c0
共有 2 個文件被更改,包括 98 次插入5 次删除
  1. 97 4
      spegla/spegla.patch
  2. 1 1
      spegla/spegla.spec

+ 97 - 4
spegla/spegla.patch

@@ -1,5 +1,6 @@
---- e_err.c.orig	Sun May 14 23:39:39 2000
-+++ e_err.c	Thu Feb  1 15:38:37 2001
+Index: e_err.c
+--- e_err.c.orig	2000-05-14 16:39:39 +0200
++++ e_err.c	2006-03-23 22:22:39 +0100
 @@ -115,6 +115,7 @@
  	}
  
@@ -8,8 +9,100 @@
  	len -= res;
  	p += res;
  
---- spegla.c.orig	Sat May 27 22:38:14 2000
-+++ spegla.c	Thu Feb  1 15:39:24 2001
+Index: jftp.c
+--- jftp.c.orig	2000-05-27 15:47:43 +0200
++++ jftp.c	2006-03-23 22:22:39 +0100
+@@ -40,6 +40,7 @@
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ 
++#include <ctype.h>
+ #include <setjmp.h>
+ #include <signal.h>
+ #include <stdio.h>
+@@ -220,6 +221,7 @@
+ 	int     ftp_status, eol, i, islongtext;
+ 	ssize_t	done, res, size, pos;
+ 	char	*nfmt;
++	char	rescode[5];
+ 
+ 	if (*fmt != ' ') {
+ 		if ((nfmt = alloca(strlen(fmt) + 3)) == NULL) {
+@@ -267,12 +269,28 @@
+ 		pos += done;
+ 		if(eol) {
+ 			ftp_status=0;
+-			res = sscanf(c->ftp_buf, "%3d", &ftp_status);
+-			if ((res == 1) && (ftp_status >= 100) && (ftp_status <= 999)) {
+-				/* We have a line that contains a valid reply code */
+ 
+-				/* This may be the start of a multi line reply */
+-				islongtext = (c->ftp_buf[3] == '-');
++			/* We are interested in the first 4 bytes */
++			(void)memset(rescode, '\0', sizeof(rescode));
++			(void)memcpy(rescode, c->ftp_buf, sizeof(rescode) - 1);
++			
++			if (isdigit(rescode[0])
++			    && isdigit(rescode[1])
++			    && isdigit(rescode[2])) {
++				res = sscanf(rescode, "%3d", &ftp_status);
++
++				E_LOGX_1(3, "ftp_status: %d", ftp_status);
++				E_LOGX_1(3, "c->ftp_buf: %s", c->ftp_buf);
++
++				if ((rescode[3] == '-' || rescode[3] == ' ')
++				    && (res == 1)) {
++					islongtext = (rescode[3] == '-');
++					if (ftp_status < 100) {
++						E_LOGX_1(1, "%s", c->ftp_buf);
++						c->ftp_resp = JFTP_ERR;
++						return -1;
++					}
++				}
+ 			}
+ 			if(islongtext) {
+ 				size = sizeof(c->ftp_buf);
+@@ -423,17 +441,22 @@
+ 		c->ftp_resp = JFTP_ERR;
+ 		return -1;
+ 	}
+-	if (ftp_req(c, "user %s", c->ftp_user_name) < 0 || c->ftp_resp != 331) {
++	if (ftp_req(c, "user %s", c->ftp_user_name) < 0 
++		|| (c->ftp_resp != 331 && c->ftp_resp != 230)) {
+ 		E_LOGX_1(0, "Username %s: failed", c->ftp_user_name);
+ 		FD_CLOSE(c->ftp_com);
+ 		c->ftp_resp = JFTP_ERR;
+ 		return -1;
+ 	}
+-	if (ftp_req(c, "pass %s", c->ftp_password) < 0 || c->ftp_resp != 230) {
+-		E_LOGX(0, "Password xxxxx: failed");
+-		FD_CLOSE(c->ftp_com);
+-		c->ftp_resp = JFTP_ERR;
+-		return -1;
++	/* USER command can respond 230 immediately in some cases */
++	if (c->ftp_resp != 230) {
++		if (ftp_req(c, "pass %s", c->ftp_password) < 0
++			|| c->ftp_resp != 230) {
++			E_LOGX(0, "Password xxxxx: failed");
++			FD_CLOSE(c->ftp_com);
++			c->ftp_resp = JFTP_ERR;
++			return -1;
++		}
+ 	}
+ 	c->ftp_resp = 0;
+ 	if (ftp_req(c, "TYPE I") < 0 || c->ftp_resp != 200) {
+@@ -836,7 +859,7 @@
+ 	/* Late versions of wu-ftpd does some kind of recursive
+ 	 * listing if only a '.' is given as directory.
+ 	 */
+-	if (strcmp(dir, ".") == 0)
++	if ((strcmp(dir, ".") == 0) || !*dir)
+ 		res = ftp_req(c, "list %s", flags);
+ 	else
+ 		res = ftp_req(c, "list %s %s", flags, dir);
+Index: spegla.c
+--- spegla.c.orig	2000-05-27 15:38:14 +0200
++++ spegla.c	2006-03-23 22:22:39 +0100
 @@ -728,7 +728,7 @@
  #ifdef ULTRIX
  	if ((f.fd_req.bfreen * 1024) < minfree)

+ 1 - 1
spegla/spegla.spec

@@ -33,7 +33,7 @@ Class:        EVAL
 Group:        Network
 License:      BSD
 Version:      1.1p4
-Release:      20040604
+Release:      20060323
 
 #   package options
 %option       with_ipv6  no