Date: Wed, 10 Sep 2003 15:45:16 -0400 (EDT) From: Garrett Wollman <wollman@khavrinen.lcs.mit.edu> To: "David E. O'Brien" <obrien@FreeBSD.org> Cc: cvs-all@FreeBSD.org Subject: cvs commit: src/libexec/lukemftpd Makefile Message-ID: <200309101945.h8AJjGD0081268@khavrinen.lcs.mit.edu> In-Reply-To: <200309101903.h8AJ3m8J016531@repoman.freebsd.org> References: <200309101903.h8AJ3m8J016531@repoman.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
<<On Wed, 10 Sep 2003 12:03:48 -0700 (PDT), "David E. O'Brien" <obrien@FreeBSD.org> said:
> [commit message deleted because it was not really relevant]
Here is a patch which makes lukemftpd do the POSIXly correct thing.
I've tested this to the extent of compiling it.
-GAWollman
Index: ftpd.c
===================================================================
RCS file: /home/cvs/src/contrib/lukemftpd/src/ftpd.c,v
retrieving revision 1.3
diff -u -r1.3 ftpd.c
--- ftpd.c 2 Feb 2003 21:03:28 -0000 1.3
+++ ftpd.c 10 Sep 2003 19:35:44 -0000
@@ -200,6 +200,15 @@
static const char *anondir = NULL;
static const char *confdir = _DEFAULT_CONFDIR;
+#ifdef LOGIN_NAME_MAX
+static char curname[LOGIN_NAME_MAX];
+static const size_t curname_len = LOGIN_NAME_MAX;
+#else
+/* Sized and allocated in main() by consulting sysconf(3). */
+static char *curname; /* current USER name */
+static size_t curname_len; /* length of curname buffer */
+#endif
+
#if defined(KERBEROS) || defined(KERBEROS5)
int has_ccache = 0;
int notickets = 1;
@@ -426,6 +435,26 @@
if (EMPTYSTR(confdir))
confdir = _DEFAULT_CONFDIR;
+#ifndef LOGIN_NAME_MAX
+ errno = 0;
+ l = sysconf(_SC_LOGIN_NAME_MAX);
+ if (errno != 0) {
+ syslog(LOG_ERR, "sysconf _SC_LOGIN_NAME_MAX: %m");
+ exit(1);
+ } else if (!(l > 0)) {
+ syslog(LOG_WARNING, "using conservative LOGIN_NAME_MAX value");
+ curname_len = _POSIX_LOGIN_NAME_MAX;
+ } else
+ curname_len = (size_t)l;
+ curname = malloc(curname_len);
+ if (curname == NULL) {
+ syslog(LOG_ERR, "out of memory (requested %zu bytes)",
+ curname_len);
+ exit(1);
+ }
+ curname[0] = '\0'; /* prophylaxis */
+#endif /* !LOGIN_NAME_MAX */
+
memset((char *)&his_addr, 0, sizeof(his_addr));
addrlen = sizeof(his_addr.si_su);
if (getpeername(0, (struct sockaddr *)&his_addr.si_su, &addrlen) < 0) {
@@ -612,7 +641,6 @@
static int login_attempts; /* number of failed login attempts */
static int askpasswd; /* had USER command, ask for PASSwd */
static int permitted; /* USER permitted */
-static char curname[LOGIN_NAME_MAX]; /* current USER name */
/*
* USER command.
@@ -686,7 +714,7 @@
} else
pw = sgetpwnam(name);
- strlcpy(curname, name, sizeof(curname));
+ strlcpy(curname, name, curname_len);
/* check user in /etc/ftpusers, and setup class */
permitted = checkuser(_PATH_FTPUSERS, curname, 1, 0, &class);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309101945.h8AJjGD0081268>
