1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-24 11:29:10 +00:00

Replace the awkward hackery about strtok(3)

by conventional one-way parsing of ftphosts(5).
Don't let NULL hostname pointers into virtual
host records as well.

PR:		bin/18410
MFC after:	1 month
This commit is contained in:
Yaroslav Tykhiy 2002-07-16 16:30:41 +00:00
parent fe905bcb53
commit 55b54aa791
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=100182

View File

@ -651,10 +651,12 @@ sigquit(int signo)
static void
inithosts(void)
{
int insert;
size_t len;
FILE *fp;
char *cp, *mp, *line;
char *hostname;
char *vhost, *anonuser, *statfile, *welcome, *loginmsg;
struct ftphost *hrp, *lhrp;
struct addrinfo hints, *res, *ai;
@ -708,11 +710,46 @@ inithosts(void)
/* skip empty lines */
if (cp == NULL)
goto nextline;
vhost = cp;
/* set defaults */
anonuser = "ftp";
statfile = _PATH_FTPDSTATFILE;
welcome = _PATH_FTPWELCOME;
loginmsg = _PATH_FTPLOGINMESG;
/*
* Preparse the line so we can use its info
* for all the addresses associated with
* the virtual host name.
* Field 0, the virtual host name, is special:
* it's already parsed off and will be strdup'ed
* later, after we know its canonical form.
*/
for (i = 1; i < 5 && (cp = strtok(NULL, " \t")); i++)
if (*cp != '-' && (cp = strdup(cp)))
switch (i) {
case 1: /* anon user permissions */
anonuser = cp;
break;
case 2: /* statistics file */
statfile = cp;
break;
case 3: /* welcome message */
welcome = cp;
break;
case 4: /* login message */
loginmsg = cp;
break;
default: /* programming error */
abort();
/* NOTREACHED */
}
hints.ai_flags = 0;
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_PASSIVE;
error = getaddrinfo(cp, NULL, &hints, &res);
error = getaddrinfo(vhost, NULL, &hints, &res);
if (error != NULL)
goto nextline;
for (ai = res; ai != NULL && ai->ai_addr != NULL;
@ -737,15 +774,9 @@ inithosts(void)
if (hrp == NULL) {
if ((hrp = malloc(sizeof(struct ftphost))) == NULL)
goto nextline;
/* defaults */
hrp->statfile = _PATH_FTPDSTATFILE;
hrp->welcome = _PATH_FTPWELCOME;
hrp->loginmsg = _PATH_FTPLOGINMESG;
hrp->anonuser = "ftp";
hrp->next = NULL;
lhrp->next = hrp;
lhrp = hrp;
}
insert = 1;
} else
insert = 0; /* host already in the chain */
hrp->hostinfo = res;
/*
@ -774,44 +805,31 @@ inithosts(void)
if ((hp = getipnodebyaddr((char*)addr, addrsize,
hrp->hostinfo->ai_family,
&hp_error)) != NULL) {
if (strcmp(cp, hp->h_name) != 0) {
if (strcmp(vhost, hp->h_name) != 0) {
if (hp->h_aliases == NULL)
cp = hp->h_name;
vhost = hp->h_name;
else {
i = 0;
while (hp->h_aliases[i] &&
strcmp(cp, hp->h_aliases[i]) != 0)
strcmp(vhost, hp->h_aliases[i]) != 0)
++i;
if (hp->h_aliases[i] == NULL)
cp = hp->h_name;
vhost = hp->h_name;
}
}
}
hrp->hostname = strdup(cp);
if ((hrp->hostname = strdup(vhost)) == NULL)
goto nextline;
hrp->anonuser = anonuser;
hrp->statfile = statfile;
hrp->welcome = welcome;
hrp->loginmsg = loginmsg;
if (insert) {
hrp->next = NULL;
lhrp->next = hrp;
lhrp = hrp;
}
freehostent(hp);
/* ok, now we now peel off the rest */
i = 0;
while (i < 4 && (cp = strtok(NULL, " \t")) != NULL) {
if (*cp != '-' && (cp = strdup(cp)) != NULL) {
switch (i) {
case 0: /* anon user permissions */
hrp->anonuser = cp;
break;
case 1: /* statistics file */
hrp->statfile = cp;
break;
case 2: /* welcome message */
hrp->welcome = cp;
break;
case 3: /* login message */
hrp->loginmsg = cp;
break;
}
}
++i;
}
/* XXX: re-initialization for getaddrinfo() loop */
cp = strtok(line, " \t");
}
nextline:
if (mp)