diff options
Diffstat (limited to 'source/n/inetd')
-rw-r--r-- | source/n/inetd/inetd-OpenBSD-1.79.diff | 890 | ||||
-rwxr-xr-x | source/n/inetd/inetd.SlackBuild | 68 | ||||
-rw-r--r-- | source/n/inetd/inetd.loopingdos.diff | 54 | ||||
-rw-r--r-- | source/n/inetd/slack-desc | 19 |
4 files changed, 1031 insertions, 0 deletions
diff --git a/source/n/inetd/inetd-OpenBSD-1.79.diff b/source/n/inetd/inetd-OpenBSD-1.79.diff new file mode 100644 index 00000000..e1550beb --- /dev/null +++ b/source/n/inetd/inetd-OpenBSD-1.79.diff @@ -0,0 +1,890 @@ +--- ./inetd.c.orig Tue Jan 30 20:00:10 2001 ++++ ./inetd.c Tue Feb 6 17:17:14 2001 +@@ -1,3 +1,4 @@ ++/* $Slackware: inetd.c 1.79s 2001/02/06 13:18:00 volkerdi Exp $ */ + /* $OpenBSD: inetd.c,v 1.79 2001/01/30 08:30:57 deraadt Exp $ */ + /* $NetBSD: inetd.c,v 1.11 1996/02/22 11:14:41 mycroft Exp $ */ + /* +@@ -40,8 +41,9 @@ + #endif /* not lint */ + + #ifndef lint +-/*static char sccsid[] = "from: @(#)inetd.c 5.30 (Berkeley) 6/3/91";*/ ++static char sccsid[] = "from: @(#)inetd.c 5.30 (Berkeley) 6/3/91"; + static char rcsid[] = "$OpenBSD: inetd.c,v 1.79 2001/01/30 08:30:57 deraadt Exp $"; ++static char xtraid[] = "$Slackware: inetd.c 1.79s 2001/02/06 13:18:00 volkerdi Exp $"; + #endif /* not lint */ + + /* +@@ -163,7 +165,7 @@ + #include <stdlib.h> + #include <unistd.h> + #include <string.h> +-#include <login_cap.h> ++/* #include <login_cap.h> */ + #include <rpc/rpc.h> + #include <rpc/pmap_clnt.h> + #include <rpcsvc/nfs_prot.h> +@@ -176,17 +178,20 @@ + #define SIGBLOCK (sigmask(SIGCHLD)|sigmask(SIGHUP)|sigmask(SIGALRM)) + + void config __P((int)); +-void doconfig __P((void)); +-void reap __P((int)); +-void doreap __P((void)); ++/* void doconfig __P((void)); */ ++/* void reap __P((int)); */ ++/* void doreap __P((void)); */ ++void reapchild __P ((int)); + void retry __P((int)); +-void doretry __P((void)); ++/* void doretry __P((void)); */ + void goaway __P((int)); + +-int debug = 0; ++static int debug = 0; ++static int global_queuelen = 128; + int nsock, maxsock; +-fd_set *allsockp; +-int allsockn; ++/* fd_set *allsockp; */ ++fd_set allsock; ++/* int allsockn; */ + int toomany = TOOMANY; + int options; + int timingout; +@@ -230,13 +235,13 @@ + struct sockaddr_in se_un_ctrladdr_in; + struct sockaddr_in6 se_un_ctrladdr_in6; + struct sockaddr_un se_un_ctrladdr_un; +- struct sockaddr_storage se_un_ctrladdr_storage; ++ /* struct sockaddr_storage se_un_ctrladdr_storage; */ + } se_un; /* bound address */ + #define se_ctrladdr se_un.se_un_ctrladdr + #define se_ctrladdr_in se_un.se_un_ctrladdr_in + #define se_ctrladdr_in6 se_un.se_un_ctrladdr_in6 + #define se_ctrladdr_un se_un.se_un_ctrladdr_un +-#define se_ctrladdr_storage se_un.se_un_ctrladdr_storage ++/* #define se_ctrladdr_storage se_un.se_un_ctrladdr_storage */ + int se_ctrladdr_size; + int se_max; /* max # of instances of this service */ + int se_count; /* number started since se_time */ +@@ -282,12 +287,12 @@ + { "chargen", SOCK_STREAM, 1, 0, chargen_stream }, + { "chargen", SOCK_DGRAM, 0, 0, chargen_dg }, + +- { 0 } ++ { NULL, 0, 0, 0, NULL } + }; + +-sig_atomic_t wantretry; +-sig_atomic_t wantconfig; +-sig_atomic_t wantreap; ++/* sig_atomic_t wantretry; */ ++/* sig_atomic_t wantconfig; */ ++/* sig_atomic_t wantreap; */ + + #define NUMINT (sizeof(intab) / sizeof(struct inent)) + char *CONFIG = _PATH_INETDCONF; +@@ -297,6 +302,8 @@ + + void logpid __P((void)); + ++/* This function is unused in the Linux port */ ++#ifdef OpenBSD + void + fd_grow(fd_set **fdsp, int *bytes, int fd) + { +@@ -316,24 +323,26 @@ + *bytes = newbytes; + } + } ++#endif + + int + main(argc, argv, envp) + int argc; + char *argv[], *envp[]; + { +- extern char *optarg; +- extern int optind; ++ /* extern char *optarg; */ ++ /* extern int optind; */ + register struct servtab *sep; + register struct passwd *pwd; + register struct group *grp = NULL; + register int tmpint; + struct sigaction sa, sapipe; + int ch, dofork; ++ int nodaemon = 0; + pid_t pid; + char buf[50]; +- fd_set *readablep = NULL; +- int readablen = 0; ++ /* fd_set *readablep = NULL; */ ++ /* int readablen = 0; */ + + Argv = argv; + if (envp == 0 || *envp == 0) +@@ -356,7 +365,7 @@ + int val; + + val = strtoul(optarg, &p, 0); +- if (val >= 1 && *p == NULL) { ++ if (val >= 1 && *p == (char) NULL) { + toomany = val; + break; + } +@@ -385,10 +394,13 @@ + exit(1); + } + +- if (debug == 0) { +- daemon(0, 0); +- if (uid == 0) +- (void) setlogin(""); ++ if (nodaemon == 0) ++ daemon (0, 0); ++ else if (debug == 0) { ++ /* daemon(0, 0); */ ++ /* if (uid == 0) */ ++ /* (void) setlogin(""); */ ++ setsid (); + } + + if (uid == 0) { +@@ -418,10 +430,12 @@ + sigaddset(&sa.sa_mask, SIGHUP); + sa.sa_handler = retry; + sigaction(SIGALRM, &sa, NULL); +- doconfig(); ++ /* doconfig(); */ ++ config (SIGHUP); + sa.sa_handler = config; + sigaction(SIGHUP, &sa, NULL); +- sa.sa_handler = reap; ++ /* sa.sa_handler = reap; */ ++ sa.sa_handler = reapchild; + sigaction(SIGCHLD, &sa, NULL); + sa.sa_handler = goaway; + sigaction(SIGTERM, &sa, NULL); +@@ -443,6 +457,7 @@ + + for (;;) { + int n, ctrl = -1; ++ fd_set readable; + + if (nsock == 0) { + (void) sigblock(SIGBLOCK); +@@ -451,6 +466,8 @@ + (void) sigsetmask(0L); + } + ++ /* Well, this all looks like cruft to me ;^) */ ++#ifdef OpenBSD + if (readablen != allsockn) { + if (readablep) + free(readablep); +@@ -478,8 +495,10 @@ + wantreap = 0; + continue; + } ++#endif + +- if ((n = select(maxsock + 1, readablep, NULL, NULL, NULL)) <= 0) { ++ readable = allsock; ++ if ((n = select(maxsock + 1, &readable, NULL, NULL, NULL)) <= 0) { + if (n < 0 && errno != EINTR) { + syslog(LOG_WARNING, "select: %m"); + sleep(1); +@@ -487,7 +506,7 @@ + continue; + } + for (sep = servtab; n && sep; sep = sep->se_next) +- if (sep->se_fd != -1 && FD_ISSET(sep->se_fd, readablep)) { ++ if (sep->se_fd != -1 && FD_ISSET(sep->se_fd, &readable)) { + n--; + if (debug) + fprintf(stderr, "someone wants %s\n", sep->se_service); +@@ -556,7 +575,7 @@ + if (!sep->se_wait && + sep->se_socktype == SOCK_STREAM) + close(ctrl); +- FD_CLR(sep->se_fd, allsockp); ++ FD_CLR(sep->se_fd, &allsock); + (void) close(sep->se_fd); + sep->se_fd = -1; + sep->se_count = 0; +@@ -581,7 +600,7 @@ + } + if (pid && sep->se_wait) { + sep->se_wait = pid; +- FD_CLR(sep->se_fd, allsockp); ++ FD_CLR(sep->se_fd, &allsock); + nsock--; + } + sigsetmask(0L); +@@ -595,7 +614,7 @@ + sep->se_user); + if (sep->se_socktype != SOCK_STREAM) + recv(0, buf, sizeof (buf), 0); +- exit(1); ++ _exit(1); + } + if (setsid() <0) + syslog(LOG_ERR, "%s: setsid: %m", +@@ -607,27 +626,33 @@ + sep->se_group); + if (sep->se_socktype != SOCK_STREAM) + recv(0, buf, sizeof (buf), 0); +- exit(1); ++ _exit(1); + } + if (uid != 0) { + /* a user running private inetd */ + if (uid != pwd->pw_uid) +- exit(1); +- } else { +- tmpint = LOGIN_SETALL & +- ~(LOGIN_SETGROUP|LOGIN_SETLOGIN); +- if (pwd->pw_uid) +- tmpint |= LOGIN_SETGROUP|LOGIN_SETLOGIN; ++ _exit(1); ++ } else if (pwd->pw_uid) { ++ /* tmpint = LOGIN_SETALL & */ ++ /* ~(LOGIN_SETGROUP|LOGIN_SETLOGIN); */ ++ /* if (pwd->pw_uid) */ ++ /* tmpint |= LOGIN_SETGROUP|LOGIN_SETLOGIN; */ + if (sep->se_group) { + pwd->pw_gid = grp->gr_gid; +- tmpint |= LOGIN_SETGROUP; ++ /* tmpint |= LOGIN_SETGROUP; */ + } +- if (setusercontext(0, pwd, pwd->pw_uid, +- tmpint) < 0) +- syslog(LOG_ERR, +- "%s/%s: setusercontext: %m", +- sep->se_service, +- sep->se_proto); ++ setgid ((gid_t) pwd->pw_gid); ++ initgroups (pwd->pw_name, pwd->pw_gid); ++ setuid ((uid_t) pwd->pw_uid); ++ /* if (setusercontext(0, pwd, pwd->pw_uid, */ ++ /* tmpint) < 0) */ ++ /* syslog(LOG_ERR, */ ++ /* "%s/%s: setusercontext: %m", */ ++ /* sep->se_service, */ ++ /* sep->se_proto); */ ++ } else if (sep->se_group) { ++ setgid (grp->gr_gid); ++ setgroups (1, &grp->gr_gid); + } + if (debug) + fprintf(stderr, "%d execl %s\n", +@@ -636,6 +661,9 @@ + close(ctrl); + dup2(0, 1); + dup2(0, 2); ++ if (rlim_ofile.rlim_cur != rlim_ofile_cur) ++ if (setrlimit (RLIMIT_NOFILE, &rlim_ofile) < 0) ++ syslog (LOG_ERR, "setrlimit: %m"); + closelog(); + for (tmpint = rlim_ofile_cur-1; --tmpint > 2; ) + (void)close(tmpint); +@@ -644,7 +672,7 @@ + if (sep->se_socktype != SOCK_STREAM) + recv(0, buf, sizeof (buf), 0); + syslog(LOG_ERR, "execv %s: %m", sep->se_server); +- exit(1); ++ _exit(1); + } + } + if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) +@@ -654,13 +682,14 @@ + } + + int +-dg_badinput(sa) +- struct sockaddr *sa; ++dg_badinput(sin) ++ struct sockaddr_in *sin; + { + struct in_addr in; + #ifdef INET6 + struct in6_addr *in6; + #endif ++#ifdef OpenBSD + u_int16_t port; + int i; + +@@ -703,28 +732,40 @@ + + if (port < IPPORT_RESERVED || port == NFS_PORT) + goto bad; ++#endif + ++ if (ntohs (sin->sin_port) < IPPORT_RESERVED) ++ return (1); ++ if (sin->sin_addr.s_addr == htonl (INADDR_BROADCAST)) ++ return (1); ++ /* XXX compare against broadcast addresses in SIOCGIFCONF list? */ + return (0); + ++#ifdef OpenBSD + bad: + return (1); ++#endif + } + ++#ifdef OpenBSD + void + reap(int sig) + { + wantreap = 1; + } ++#endif + + void +-doreap(void) ++reapchild(int sig) + { + pid_t pid; + int save_errno = errno, status; + register struct servtab *sep; + ++#ifdef OpenBSD + if (debug) + fprintf(stderr, "reaping asked for\n"); ++#endif + + for (;;) { + pid = wait3(&status, WNOHANG, NULL); +@@ -743,8 +784,8 @@ + "%s: exit signal 0x%x", + sep->se_server, WTERMSIG(status)); + sep->se_wait = 1; +- fd_grow(&allsockp, &allsockn, sep->se_fd); +- FD_SET(sep->se_fd, allsockp); ++ /* fd_grow(&allsockp, &allsockn, sep->se_fd); */ ++ FD_SET(sep->se_fd, &allsock); + nsock++; + if (debug) + fprintf(stderr, "restored %s, fd %d\n", +@@ -766,14 +807,16 @@ + struct servtab *enter __P((struct servtab *)); + int matchconf __P((struct servtab *, struct servtab *)); + ++#ifdef OpenBSD + void + config(int sig) + { + wantconfig = 1; + } ++#endif + + void +-doconfig(void) ++config(int sig) + { + register struct servtab *sep, *cp, **sepp; + int omask; +@@ -887,7 +930,7 @@ + if (port != sep->se_ctrladdr_in.sin_port) { + sep->se_ctrladdr_in.sin_port = port; + if (sep->se_fd != -1) { +- FD_CLR(sep->se_fd, allsockp); ++ FD_CLR(sep->se_fd, &allsock); + nsock--; + (void) close(sep->se_fd); + } +@@ -942,7 +985,7 @@ + if (port != sep->se_ctrladdr_in6.sin6_port) { + sep->se_ctrladdr_in6.sin6_port = port; + if (sep->se_fd != -1) { +- FD_CLR(sep->se_fd, allsockp); ++ FD_CLR(sep->se_fd, &allsock); + nsock--; + (void) close(sep->se_fd); + } +@@ -979,7 +1022,7 @@ + } + *sepp = sep->se_next; + if (sep->se_fd != -1) { +- FD_CLR(sep->se_fd, allsockp); ++ FD_CLR(sep->se_fd, &allsock); + nsock--; + (void) close(sep->se_fd); + } +@@ -995,14 +1038,16 @@ + (void) sigsetmask(omask); + } + ++#ifdef OpenBSD + void + retry(int sig) + { + wantretry = 1; + } ++#endif + + void +-doretry(void) ++retry(int sig) + { + register struct servtab *sep; + +@@ -1046,7 +1091,7 @@ + (void)close(sep->se_fd); + } + (void)unlink(_PATH_INETDPID); +- _exit(0); ++ exit(0); + } + + int bump_nofile __P((void)); +@@ -1102,9 +1147,9 @@ + } else + r = bind(sep->se_fd, &sep->se_ctrladdr, sep->se_ctrladdr_size); + if (r < 0) { +- syslog(LOG_ERR, "%s/%s: bind: %m", +- sep->se_service, sep->se_proto); +- (void) close(sep->se_fd); ++ syslog(LOG_ERR, "%s/%s (%d): bind: %m", ++ sep->se_service, sep->se_proto, sep->se_ctrladdr.sa_family); ++ close(sep->se_fd); + sep->se_fd = -1; + if (!timingout) { + timingout = 1; +@@ -1113,10 +1158,10 @@ + return; + } + if (sep->se_socktype == SOCK_STREAM) +- listen(sep->se_fd, 10); ++ listen(sep->se_fd, global_queuelen); + +- fd_grow(&allsockp, &allsockn, sep->se_fd); +- FD_SET(sep->se_fd, allsockp); ++ /* fd_grow(&allsockp, &allsockn, sep->se_fd); */ ++ FD_SET(sep->se_fd, &allsock); + nsock++; + if (sep->se_fd > maxsock) { + maxsock = sep->se_fd; +@@ -1230,10 +1275,12 @@ + &new->se_ctrladdr_in6.sin6_addr, + sizeof(new->se_ctrladdr_in6.sin6_addr)) != 0) + return (0); ++#ifdef OpenBSD + if (old->se_family == AF_INET6 && new->se_family == AF_INET6 && + old->se_ctrladdr_in6.sin6_scope_id != + new->se_ctrladdr_in6.sin6_scope_id) + return (0); ++#endif + + return (1); + } +@@ -1241,7 +1288,7 @@ + FILE *fconfig = NULL; + char line[1024]; + char *defhost; +-char *skip __P((char **, int)); ++char *skip __P((char **)); + char *nextline __P((FILE *)); + char *newstr __P((char *)); + struct servtab *dupconfig __P((struct servtab *)); +@@ -1277,7 +1324,7 @@ + { + register struct servtab *sep; + int argc; +- char *cp, *arg, *s; ++ char *cp, *arg; + char *hostdelim; + struct servtab *nsep; + struct servtab *psep; +@@ -1288,19 +1335,19 @@ + exit(1); + } + +- memset(sep, 0, sizeof *sep); ++ /* memset(sep, 0, sizeof *sep); */ + more: +- freeconfig(sep); ++ /* freeconfig(sep); */ + + while ((cp = nextline(fconfig)) && *cp == '#') + ; + if (cp == NULL) { +- free(sep); ++ /* free(sep); */ + return (NULL); + } + + memset((char *)sep, 0, sizeof *sep); +- arg = skip(&cp, 0); ++ arg = skip(&cp); + if (arg == NULL) { + /* A blank line. */ + goto more; +@@ -1310,10 +1357,12 @@ + hostdelim = strrchr(arg, ':'); + if (hostdelim) { + *hostdelim = '\0'; ++#ifdef OpenBSD + if (arg[0] == '[' && hostdelim > arg && hostdelim[-1] == ']') { + hostdelim[-1] = '\0'; + sep->se_hostaddr = newstr(arg + 1); + } else ++#endif + sep->se_hostaddr = newstr(arg); + arg = hostdelim + 1; + /* +@@ -1321,10 +1370,10 @@ + * default host for the following lines. + */ + if (*arg == '\0') { +- arg = skip(&cp, 0); ++ arg = skip(&cp); + if (cp == NULL) { + free(defhost); +- defhost = newstr(sep->se_hostaddr); ++ defhost = sep->se_hostaddr; + goto more; + } + } +@@ -1332,8 +1381,11 @@ + sep->se_hostaddr = newstr(defhost); + + sep->se_service = newstr(arg); ++#ifdef OpenBSD + if ((arg = skip(&cp, 1)) == NULL) + goto more; ++#endif ++ arg = skip (&cp); + + if (strcmp(arg, "stream") == 0) + sep->se_socktype = SOCK_STREAM; +@@ -1348,10 +1400,12 @@ + else + sep->se_socktype = -1; + ++#ifdef OpenBSD + if ((arg = skip(&cp, 1)) == NULL) + goto more; ++#endif + +- sep->se_proto = newstr(arg); ++ sep->se_proto = newstr(skip (&cp)); + + if (strcmp(sep->se_proto, "unix") == 0) { + sep->se_family = AF_UNIX; +@@ -1389,10 +1443,11 @@ + goto badafterall; + } + } +- arg = skip(&cp, 1); ++ arg = skip(&cp); + if (arg == NULL) + goto more; + ++#ifdef OpenBSD + s = strchr(arg, '.'); + if (s) { + char *p; +@@ -1406,11 +1461,20 @@ + } + } else + sep->se_max = toomany; ++#endif + ++ { ++ char *s = strchr (arg, '.'); ++ if (s) { ++ *s++ = '\0'; ++ sep->se_max = atoi (s); ++ } else ++ sep->se_max = toomany; ++ } + sep->se_wait = strcmp(arg, "wait") == 0; +- if ((arg = skip(&cp, 1)) == NULL) +- goto more; +- sep->se_user = newstr(arg); ++ /* if ((arg = skip(&cp, 1)) == NULL) */ ++ /* goto more; */ ++ sep->se_user = newstr(skip (&cp)); + arg = strchr(sep->se_user, '.'); + if (arg == NULL) + arg = strchr(sep->se_user, ':'); +@@ -1418,12 +1482,12 @@ + *arg++ = '\0'; + sep->se_group = newstr(arg); + } +- if ((arg = skip(&cp, 1)) == NULL) +- goto more; ++ /* if ((arg = skip(&cp, 1)) == NULL) */ ++ /* goto more; */ + +- sep->se_server = newstr(arg); ++ sep->se_server = newstr(skip (&cp)); + if (strcmp(sep->se_server, "internal") == 0) { +- struct biltin *bi; ++ register struct biltin *bi; + + for (bi = biltins; bi->bi_service; bi++) + if (bi->bi_socktype == sep->se_socktype && +@@ -1439,7 +1503,7 @@ + } else + sep->se_bi = NULL; + argc = 0; +- for (arg = skip(&cp, 0); cp; arg = skip(&cp, 0)) { ++ for (arg = skip(&cp); cp; arg = skip(&cp)) { + if (argc < MAXARGV) + sep->se_argv[argc++] = newstr(arg); + } +@@ -1468,7 +1532,9 @@ + nsep = sep; + while (nsep != NULL) { + nsep->se_checked = 1; +- switch (nsep->se_family) { ++ /* switch (nsep->se_family) { */ ++ if (nsep->se_family == AF_INET) { ++#ifdef OpenBSD + case AF_INET: + case AF_INET6: + { +@@ -1488,7 +1554,13 @@ + goto skip; + } + close(s); ++#endif ++ if (!strcmp (nsep->se_hostaddr, "*")) ++ nsep->se_ctrladdr_in.sin_addr.s_addr = INADDR_ANY; ++ else if (!inet_aton (nsep->se_hostaddr, &nsep->se_ctrladdr_in.sin_addr)) { ++ struct hostent *hp; + ++#ifdef OpenBSD + memset(&hints, 0, sizeof(hints)); + hints.ai_family = nsep->se_family; + hints.ai_socktype = nsep->se_socktype; +@@ -1517,7 +1589,22 @@ + res->ai_addr, res->ai_addrlen); + continue; + } ++#endif ++ hp = gethostbyname (nsep->se_hostaddr); ++ if (hp == 0) { ++ syslog (LOG_ERR, "%s: unknown host", nsep->se_hostaddr); ++ nsep->se_checked = 0; ++ goto skip; ++ } else if (hp->h_addrtype != AF_INET) { ++ syslog (LOG_ERR, ++ "%s: address isn't an Internet " ++ "address", nsep->se_hostaddr); ++ nsep->se_checked = 0; ++ goto skip; ++ } else { ++ int i = 1; + ++#ifdef OpenBSD + psep = dupconfig(nsep); + psep->se_hostaddr = newstr(nsep->se_hostaddr); + psep->se_checked = 1; +@@ -1535,7 +1622,26 @@ + freeaddrinfo(res0); + break; + } ++#endif ++ memmove (&nsep->se_ctrladdr_in.sin_addr, ++ hp->h_addr_list[0], sizeof (struct in_addr)); ++ while (hp->h_addr_list[i] != NULL) { ++ psep = dupconfig (nsep); ++ psep->se_hostaddr = newstr (nsep->se_hostaddr); ++ psep->se_checked = 1; ++ memmove (&psep->se_ctrladdr_in.sin_addr, ++ hp->h_addr_list[i], sizeof (struct in_addr)); ++ psep->se_ctrladdr_size = sizeof (psep->se_ctrladdr_in); ++ i++; ++ /* Prepend to list, don't want to look up its */ ++ /* hostname again. */ ++ psep->se_next = sep; ++ sep = psep; ++ } ++ } ++ } + } ++/* XXX BUG?: is this skip: label supposed to remain? */ + skip: + nsep = nsep->se_next; + } +@@ -1593,17 +1699,17 @@ + } + + char * +-skip(cpp, report) ++skip(cpp) + char **cpp; +- int report; ++ /* int report; */ + { +- char *cp = *cpp; ++ register char *cp = *cpp; + char *start; + +-erp: ++/* erp: */ + if (*cpp == NULL) { +- if (report) +- syslog(LOG_ERR, "syntax error in inetd config file"); ++ /* if (report) */ ++ /* syslog(LOG_ERR, "syntax error in inetd config file"); */ + return (NULL); + } + +@@ -1619,16 +1725,18 @@ + if ((cp = nextline(fconfig))) + goto again; + *cpp = NULL; +- goto erp; ++ /* goto erp; */ ++ return (NULL); + } + start = cp; + while (*cp && *cp != ' ' && *cp != '\t') + cp++; + if (*cp != '\0') + *cp++ = '\0'; +- if ((*cpp = cp) == NULL) +- goto erp; ++ /* if ((*cpp = cp) == NULL) */ ++ /* goto erp; */ + ++ *cpp = cp; + return (start); + } + +@@ -1796,15 +1904,16 @@ + { + char buffer[BUFSIZE]; + int i, size; +- struct sockaddr_storage ss; ++ /* struct sockaddr_storage ss; */ ++ struct sockaddr sa; + +- size = sizeof(ss); +- if ((i = recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr *)&ss, ++ size = sizeof(sa); ++ if ((i = recvfrom(s, buffer, sizeof(buffer), 0, &sa, + &size)) < 0) + return; +- if (dg_badinput((struct sockaddr *)&ss)) ++ if (dg_badinput((struct sockaddr_in *)&sa)) + return; +- (void) sendto(s, buffer, i, 0, (struct sockaddr *)&ss, size); ++ (void) sendto(s, buffer, i, 0, &sa, sizeof(sa)); + } + + /* ARGSUSED */ +@@ -1890,7 +1999,8 @@ + int s; + struct servtab *sep; + { +- struct sockaddr_storage ss; ++ /* struct sockaddr_storage ss; */ ++ struct sockaddr sa; + static char *rs; + int len, size; + char text[LINESIZ+2]; +@@ -1900,11 +2010,11 @@ + rs = ring; + } + +- size = sizeof(ss); +- if (recvfrom(s, text, sizeof(text), 0, (struct sockaddr *)&ss, ++ size = sizeof(sa); ++ if (recvfrom(s, text, sizeof(text), 0, &sa, + &size) < 0) + return; +- if (dg_badinput((struct sockaddr *)&ss)) ++ if (dg_badinput((struct sockaddr_in *)&sa)) + return; + + if ((len = endring - rs) >= LINESIZ) +@@ -1917,7 +2027,7 @@ + rs = ring; + text[LINESIZ] = '\r'; + text[LINESIZ + 1] = '\n'; +- (void) sendto(s, text, sizeof(text), 0, (struct sockaddr *)&ss, size); ++ (void) sendto(s, text, sizeof(text), 0, &sa, sizeof(sa)); + } + + /* +@@ -1959,18 +2069,23 @@ + struct servtab *sep; + { + u_int result; +- struct sockaddr_storage ss; ++ /* struct sockaddr_storage ss; */ ++ struct sockaddr sa; ++ struct sockaddr_in *sin; + int size; + +- size = sizeof(ss); ++ size = sizeof(sa); + if (recvfrom(s, (char *)&result, sizeof(result), 0, +- (struct sockaddr *)&ss, &size) < 0) ++ &sa, &size) < 0) + return; +- if (dg_badinput((struct sockaddr *)&ss)) ++ /* if (dg_badinput((struct sockaddr *)&ss)) */ ++ sin = (struct sockaddr_in *) &sa; ++ if (sin->sin_addr.s_addr == htonl (INADDR_BROADCAST) || ++ ntohs (sin->sin_port) < IPPORT_RESERVED / 2) + return; + result = machtime(); + (void) sendto(s, (char *) &result, sizeof(result), 0, +- (struct sockaddr *)&ss, size); ++ &sa, sizeof(sa)); + } + + /* ARGSUSED */ +@@ -1996,20 +2111,21 @@ + { + char buffer[256]; + time_t time(), clock; +- struct sockaddr_storage ss; ++ /* struct sockaddr_storage ss; */ ++ struct sockaddr sa; + int size; + + clock = time((time_t *) 0); + +- size = sizeof(ss); +- if (recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr *)&ss, ++ size = sizeof(sa); ++ if (recvfrom(s, buffer, sizeof(buffer), 0, &sa, + &size) < 0) + return; +- if (dg_badinput((struct sockaddr *)&ss)) ++ if (dg_badinput((struct sockaddr_in *)&sa)) + return; + (void) sprintf(buffer, "%.24s\r\n", ctime(&clock)); +- (void) sendto(s, buffer, strlen(buffer), 0, (struct sockaddr *)&ss, +- size); ++ (void) sendto(s, buffer, strlen(buffer), 0, &sa, ++ sizeof(sa)); + } + + /* +--- ./Makefile.orig Thu Mar 30 17:00:49 2000 ++++ ./Makefile Tue Feb 6 17:18:05 2001 +@@ -1,7 +1,6 @@ +-# $OpenBSD: Makefile,v 1.3 2000/03/31 01:00:49 deraadt Exp $ ++CC = gcc ++CFLAGS = -O2 ++LDFLAGS = -s + +-PROG= inetd +-MAN= inetd.8 +-MLINKS= inetd.8 inetd.conf.5 +- +-.include <bsd.prog.mk> ++all: ++ $(CC) $(CFLAGS) $(LDFLAGS) -o inetd inetd.c diff --git a/source/n/inetd/inetd.SlackBuild b/source/n/inetd/inetd.SlackBuild new file mode 100755 index 00000000..8a86a350 --- /dev/null +++ b/source/n/inetd/inetd.SlackBuild @@ -0,0 +1,68 @@ +#!/bin/sh + +# Copyright 2008, 2009 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +VERSION=1.79s +ARCH=${ARCH:-x86_64} +BUILD=${BUILD:-8} + +CWD=$(pwd) +TMP=${TMP:-/tmp} +PKG=$TMP/package-inetd + +rm -rf $PKG +mkdir -p $TMP $PKG + +# Explode the package framework: +cd $PKG +explodepkg $CWD/_inetd.tar.gz + +echo "+====================+" +echo "| inetd-OpenBSD-1.79 |" +echo "+====================+" +cd $TMP +rm -rf inetd +tar xvf $CWD/inetd-OpenBSD-1.79.tar.gz || exit 1 +cd inetd +zcat $CWD/inetd-OpenBSD-1.79.diff.gz | patch -p1 --backup --suffix=.orig --verbose -E +zcat $CWD/inetd.loopingdos.diff.gz | patch -p1 --backup --suffix=.orig --verbose -E + +# GCC 4 fix (thanks Fred Emmott) +sed -i 's#(type)\([a-z]\)=(type)\([a-z]\)#\1=(type)\2#g' inetd.c + +make || exit 1 + +strip inetd +cat inetd > $PKG/usr/sbin/inetd +cat inetd.8 | gzip -9c > $PKG/usr/man/man8/inetd.8.gz + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc + +# Build the package: +cd $PKG +/sbin/makepkg -l y -c n $TMP/inetd-$VERSION-$ARCH-$BUILD.txz + +# Clean up the extra stuff: +if [ "$1" = "--cleanup" ]; then + rm -rf $TMP/inetd + rm -rf $PKG +fi diff --git a/source/n/inetd/inetd.loopingdos.diff b/source/n/inetd/inetd.loopingdos.diff new file mode 100644 index 00000000..5bfcc53f --- /dev/null +++ b/source/n/inetd/inetd.loopingdos.diff @@ -0,0 +1,54 @@ +--- ./inetd.c.orig 2003-09-06 15:08:41.000000000 -0700 ++++ ./inetd.c 2003-09-06 16:26:24.000000000 -0700 +@@ -171,7 +171,8 @@ + #include <rpcsvc/nfs_prot.h> + #include "pathnames.h" + +-#define TOOMANY 256 /* don't start more than TOOMANY */ ++#define TOOMANY 0 /* don't start more than TOOMANY */ ++ /* zero disables this stupid "feature" */ + #define CNT_INTVL 60 /* servers in CNT_INTVL sec. */ + #define RETRYTIME (60*10) /* retry after bind or server fail */ + +@@ -365,7 +366,7 @@ + int val; + + val = strtoul(optarg, &p, 0); +- if (val >= 1 && *p == (char) NULL) { ++ if (val >= 0 && *p == (char) NULL) { + toomany = val; + break; + } +@@ -546,7 +547,7 @@ + if (dofork) { + if (sep->se_count++ == 0) + (void)gettimeofday(&sep->se_time, NULL); +- else if (sep->se_count >= sep->se_max) { ++ else if (toomany > 0 && sep->se_count >= sep->se_max) { + struct timeval now; + + (void)gettimeofday(&now, NULL); +--- ./inetd.8.orig 2003-09-06 16:26:50.000000000 -0700 ++++ ./inetd.8 2003-09-06 16:30:27.000000000 -0700 +@@ -68,7 +68,8 @@ + Turns on debugging. + .It Fl R Ar rate + Specify the maximum number of times a service can be invoked +-in one minute; the default is 256. ++in one minute; the default is unlimited. A rate of 0 allows an ++unlimited number of invocations. + .El + .Pp + Upon execution, +@@ -249,9 +250,8 @@ + spawned from + .Nm inetd + within an interval of 60 seconds. +-When omitted, +-.Dq max +-defaults to 256. ++The default is unlimited (setting a limit may actually make it easier for ++an attacker to create a denial-of-service, and is not recommended). + .Pp + Stream servers are usually marked as + .Dq nowait diff --git a/source/n/inetd/slack-desc b/source/n/inetd/slack-desc new file mode 100644 index 00000000..7f5c15c5 --- /dev/null +++ b/source/n/inetd/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +inetd: inetd (Internet super-server) +inetd: +inetd: This is a program to listen for connections on certain Internet +inetd: sockets and invokes a program to service the request. Essentially, +inetd: inetd allows running one daemon to invoke several others, reducing +inetd: load on the system. Many of the network services are run through +inetd: inetd, so you'll probably need it. +inetd: +inetd: This version of inetd was ported from OpenBSD. +inetd: +inetd: |