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 @@
 	}
 
 	res = vsnprintf(p, len, fmt, args);
+	if (res >= len) res = len - 1;
 	len -= res;
 	p += res;
 
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)
 #else
-	if ((f.f_bsize * f.f_bavail) < minfree)
+	if (((long long)f.f_bsize * f.f_bavail) < minfree)
 #endif
 		e_errx(1, "%s: Not enough space left", path);
 
@@ -953,6 +953,7 @@
 		}
 		buf[i] = p[j];
 	}
+	buf[i] = '\0';
 	*val = buf;
 ret:
 	if (show)
