Allow service alias names from /etc/services to be used when specifying

internal services in inetd.conf .

The inetd(8) manpage used to say that the official name of a service
_must_ be used, yet inetd itself was hardcoded to used a service alias for
the auth service, namely ident!

Rather than change inetd.conf and break existing configurations on next
upgrade, we now allow service aliases as well as official names. This
allows the software to work as expected and still support existing
configurations.

This should not breaking existing wrapped configurations either and the
inetd(8) manpage already states that it is the service name specified in
inetd.conf that is used for calls to hosts_access(3).

PR:	11796
Reported by:	Alex Charalabidis <alex@wnm.net>
Approved by:	des
This commit is contained in:
sheldonh 1999-07-02 16:21:13 +00:00
parent d66e41ba15
commit a145b5f217
2 changed files with 26 additions and 6 deletions

View File

@ -30,7 +30,7 @@
.\" SUCH DAMAGE.
.\"
.\" from: @(#)inetd.8 8.3 (Berkeley) 4/13/94
.\" $Id: inetd.8,v 1.31 1999/06/30 23:47:46 sheldonh Exp $
.\" $Id: inetd.8,v 1.32 1999/07/02 15:58:32 sheldonh Exp $
.\"
.Dd February 7, 1996
.Dt INETD 8
@ -168,7 +168,7 @@ For
.Dq internal
services (discussed below), the service
name
.Em must
should
be the official name of the service (that is, the first entry in
.Pa /etc/services ) .
When used to specify an

View File

@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)from: inetd.c 8.4 (Berkeley) 4/13/94";
#endif
static const char rcsid[] =
"$Id: inetd.c,v 1.55 1999/06/30 23:36:39 sheldonh Exp $";
"$Id: inetd.c,v 1.56 1999/06/30 23:47:46 sheldonh Exp $";
#endif /* not lint */
/*
@ -258,6 +258,7 @@ struct servtab *getconfigent __P((void));
void ident_stream __P((int, struct servtab *));
void machtime_dg __P((int, struct servtab *));
void machtime_stream __P((int, struct servtab *));
int matchservent __P((char *, char *, char *));
char *newstr __P((char *));
char *nextline __P((FILE *));
void print_service __P((char *, struct servtab *));
@ -306,7 +307,7 @@ struct biltin {
{ "tcpmux", SOCK_STREAM, 1, -1, (void (*)())tcpmux },
{ "ident", SOCK_STREAM, 1, -1, ident_stream },
{ "auth", SOCK_STREAM, 1, -1, ident_stream },
{ NULL }
};
@ -1124,6 +1125,23 @@ close_sep(sep)
sep->se_numchild = 0; /* forget about any existing children */
}
int
matchservent(name1, name2, proto)
char *name1, *name2, *proto;
{
char **alias;
struct servent *se;
if ((se = getservbyname(name1, proto)) != NULL) {
if (strcmp(name2, se->s_name) == 0)
return(1);
for (alias = se->s_aliases; *alias; alias++)
if (strcmp(name2, *alias) == 0)
return(1);
}
return(0);
}
struct servtab *
enter(cp)
struct servtab *cp;
@ -1398,8 +1416,10 @@ getconfigent()
struct biltin *bi;
for (bi = biltins; bi->bi_service; bi++)
if (bi->bi_socktype == sep->se_socktype &&
strcmp(bi->bi_service, sep->se_service) == 0)
if ((bi->bi_socktype == sep->se_socktype &&
strcmp(bi->bi_service, sep->se_service) == 0) ||
matchservent(bi->bi_service, sep->se_service,
sep->se_proto))
break;
if (bi->bi_service == 0) {
syslog(LOG_ERR, "internal service %s unknown",