telnet: new addon

This commit is contained in:
Daniel Weismueller
2012-08-09 16:59:31 +02:00
parent 19b630e4ca
commit b52f6eb2bd
18 changed files with 2967 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
usr/bin/telnet
#usr/man/man1/telnet.1
#usr/man/man5/issue.net.5

106
lfs/telnet Normal file
View File

@@ -0,0 +1,106 @@
###############################################################################
# #
# IPFire.org - A linux based firewall #
# Copyright (C) 2007 Michael Tremer & Christian Schmidt #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
###############################################################################
###############################################################################
# Definitions
###############################################################################
include Config
VER = 0.17
THISAPP = netkit-telnet-$(VER)
DL_FILE = $(THISAPP).tar.gz
DL_FROM = $(URL_IPFIRE)
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
PROG = telnet
PAK_VER = 1
DEPS = ""
###############################################################################
# Top-level Rules
###############################################################################
objects = $(DL_FILE) \
telnet-client.tar.gz
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
telnet-client.tar.gz = $(DL_FROM)/telnet-client.tar.gz
$(DL_FILE)_MD5 = d6beabaaf53fe6e382c42ce3faa05a36
telnet-client.tar.gz_MD5 = d74983062470c5a3e7ae14f34c489e00
install : $(TARGET)
check : $(patsubst %,$(DIR_CHK)/%,$(objects))
download :$(patsubst %,$(DIR_DL)/%,$(objects))
md5 : $(subst %,%_MD5,$(objects))
dist:
@$(PAK)
###############################################################################
# Downloading, checking, md5sum
###############################################################################
$(patsubst %,$(DIR_CHK)/%,$(objects)) :
@$(CHECK)
$(patsubst %,$(DIR_DL)/%,$(objects)) :
@$(LOAD)
$(subst %,%_MD5,$(objects)) :
@$(MD5)
###############################################################################
# Installation Details
###############################################################################
$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
cd ${DIR_APP} && mv telnet telnet-netkit
cd ${DIR_APP} && tar zxf $(DIR_DL)/telnet-client.tar.gz
cd $(DIR_APP) && patch -Np0 -i $(DIR_SRC)/src/patches/telnet-client-cvs.patch0
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-env.patch
cd $(DIR_APP) && patch -Np0 -i $(DIR_SRC)/src/patches/telnet-0.17-pek.patch0
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-issue.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-sa-01-49.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-8bit.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-argv.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-conf.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-cleanup_race.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-CAN-2005-468_469.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-gethostbyname.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/netkit-telnet-0.17-ipv6.diff
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/netkit-telnet-0.17-nodns.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/telnet-0.17-errno_test_sys_bsd.patch
cd $(DIR_APP) && patch -Np1 -i $(DIR_SRC)/src/patches/netkit-telnet-0.17-reallynodns.patch
cd $(DIR_APP) && ./configure --prefix=/usr
cd $(DIR_APP) && make
cd $(DIR_APP) && make install
rm -f /usr/sbin/telnetd
rm -f /usr/man/man8/in.telnetd.8
rm -f /usr/man/man8/telnetd.8
@rm -rf $(DIR_APP)
@$(POSTBUILD)

View File

@@ -767,6 +767,7 @@ buildipfire() {
ipfiremake lcd4linux
ipfiremake mtr
ipfiremake tcpick
ipfiremake telnet
echo Build on $HOSTNAME > $BASEDIR/build/var/ipfire/firebuild
cat /proc/version >> $BASEDIR/build/var/ipfire/firebuild
echo >> $BASEDIR/build/var/ipfire/firebuild

View File

@@ -0,0 +1,265 @@
diff -uNr netkit-telnet-0.17/telnetd/telnetd.c netkit-telnet-0.17.ipv6/telnetd/telnetd.c
--- netkit-telnet-0.17/telnetd/telnetd.c 2006-07-13 08:37:18.000000000 +0200
+++ netkit-telnet-0.17.ipv6/telnetd/telnetd.c 2006-07-14 08:36:11.000000000 +0200
@@ -49,6 +49,7 @@
/* #include <netinet/ip.h> */ /* Don't think this is used at all here */
#include <arpa/inet.h>
#include <assert.h>
+#include <sys/poll.h>
#include "telnetd.h"
#include "pathnames.h"
#include "setproctitle.h"
@@ -68,7 +69,7 @@
#define HAS_IPPROTO_IP
#endif
-static void doit(struct sockaddr_in *who);
+static void doit(struct sockaddr *who, socklen_t wholen);
static int terminaltypeok(const char *s);
/*
@@ -90,7 +91,7 @@
int
main(int argc, char *argv[], char *env[])
{
- struct sockaddr_in from;
+ struct sockaddr from;
int on = 1;
socklen_t fromlen;
register int ch;
@@ -248,64 +249,89 @@
argc -= optind;
argv += optind;
- if (debug) {
- int s, ns;
- socklen_t foo;
- struct servent *sp;
- struct sockaddr_in sn;
+ int s = 0;
- memset(&sn, 0, sizeof(sn));
- sn.sin_family = AF_INET;
+ if (debug) {
+ struct addrinfo *ai;
+ unsigned int nfds = 0;
+ struct pollfd fds[2];
if (argc > 1) {
- usage();
- /* NOTREACHED */
- } else if (argc == 1) {
- if ((sp = getservbyname(*argv, "tcp"))!=NULL) {
- sn.sin_port = sp->s_port;
- }
- else {
- int pt = atoi(*argv);
- if (pt <= 0) {
- fprintf(stderr, "telnetd: %s: bad port number\n",
- *argv);
- usage();
- /* NOTREACHED */
- }
- sn.sin_port = htons(pt);
- }
+ usage();
+ /* NOTREACHED */
} else {
- sp = getservbyname("telnet", "tcp");
- if (sp == 0) {
- fprintf(stderr, "telnetd: tcp/telnet: unknown service\n");
- exit(1);
- }
- sn.sin_port = sp->s_port;
- }
+ struct addrinfo hints;
+
+ memset (&hints, '\0', sizeof (hints));
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
+ hints.ai_protocol = IPPROTO_TCP;
+
+ if (argc == 0) {
+ if (getaddrinfo(NULL, "telnet", &hints, &ai) != 0) {
+ fprintf(stderr, "telnetd: %s: bad port number\n", *argv);
+ usage();
+ /* NOTREACHED */
+ }
+ } else {
+ if (getaddrinfo(NULL, *argv, &hints, &ai) != 0) {
+ fprintf(stderr, "telnetd: %s: bad port number\n", *argv);
+ usage();
+ /* NOTREACHED */
+ }
+ }
+ }
- s = socket(AF_INET, SOCK_STREAM, 0);
- if (s < 0) {
+ struct addrinfo *runp;
+ int b = 0;
+ for (runp = ai; ((runp != NULL) && (nfds < sizeof (fds) / sizeof (fds[0]))); runp = runp->ai_next) {
+ fds[nfds].fd = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol);
+ if (fds[nfds].fd < 0) {
perror("telnetd: socket");;
- exit(1);
+ exit(1);
+ }
+ fds[nfds].events = POLLIN;
+ (void) setsockopt(fds[nfds].fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+
+ if (bind(fds[nfds].fd, runp->ai_addr, runp->ai_addrlen) != 0) {
+ // Unable to bind to given port. One of the reason can be
+ // that we can't bind to both IPv4 and IPv6
+ break;
+ } else {
+ b++;
+ }
+
+ if (listen(fds[nfds].fd, 1) < 0) {
+ perror("listen");
+ exit(1);
+ }
+ nfds++;
}
- (void) setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
- if (bind(s, (struct sockaddr *)&sn, sizeof(sn)) < 0) {
- perror("bind");
- exit(1);
- }
- if (listen(s, 1) < 0) {
- perror("listen");
- exit(1);
+ freeaddrinfo(ai);
+
+ if (b == 0) {
+ perror("bind");
+ exit(1);
}
- foo = sizeof(sn);
- ns = accept(s, (struct sockaddr *)&sn, &foo);
- if (ns < 0) {
- perror("accept");
- exit(1);
+
+ int n = poll (fds, nfds, -1);
+ if (n > 0) {
+ unsigned int i;
+ for (i = 0; i < nfds; i++) {
+ if (fds[i].revents & POLLIN) {
+ struct sockaddr_storage rem;
+ socklen_t remlen = sizeof(rem);
+ int fd = accept(fds[i].fd, (struct sockaddr *) &rem, &remlen);
+
+ if (fd < 0) {
+ perror("accept");
+ exit(1);
+ }
+
+ s = fd;
+ }
+ }
}
- (void) dup2(ns, 0);
- (void) close(ns);
- (void) close(s);
} else if (argc > 0) {
usage();
/* NOT REACHED */
@@ -313,13 +339,13 @@
openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
fromlen = sizeof (from);
- if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0) {
+ if (getpeername(s, &from, &fromlen) < 0) {
fprintf(stderr, "%s: ", progname);
perror("getpeername");
_exit(1);
}
if (keepalive &&
- setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) {
+ setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) {
syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m");
}
@@ -333,13 +359,13 @@
if (tos < 0)
tos = 020; /* Low Delay bit */
if (tos
- && (setsockopt(0, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
+ && (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
&& (errno != ENOPROTOOPT) )
syslog(LOG_WARNING, "setsockopt (IP_TOS): %m");
}
#endif /* defined(HAS_IPPROTO_IP) && defined(IP_TOS) */
- net = 0;
- doit(&from);
+ net = s;
+ doit(&from, fromlen);
/* NOTREACHED */
return 0;
} /* end of main */
@@ -608,10 +634,9 @@
* Get a pty, scan input lines.
*/
static void
-doit(struct sockaddr_in *who)
+doit(struct sockaddr *who, socklen_t wholen)
{
const char *host;
- struct hostent *hp;
int level;
char user_name[256];
@@ -623,12 +648,18 @@
fatal(net, "All network ports in use");
/* get name of connected client */
- hp = gethostbyaddr((char *)&who->sin_addr, sizeof (struct in_addr),
- who->sin_family);
- if (hp)
- host = hp->h_name;
- else
- host = inet_ntoa(who->sin_addr);
+ int error = -1;
+ char namebuf[255];
+
+ error = getnameinfo(who, wholen, namebuf, sizeof(namebuf), NULL, 0, 0);
+
+ if (error) {
+ perror("getnameinfo: localhost");
+ perror(gai_strerror(error));
+ exit(1);
+ }
+
+ host = namebuf;
/*
* We must make a copy because Kerberos is probably going
@@ -649,13 +680,21 @@
/* Get local host name */
{
- struct hostent *h;
+ struct addrinfo hints;
+ struct addrinfo *res;
+ int e;
+
+ memset(&hints, '\0', sizeof(hints));
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_ADDRCONFIG;
+
gethostname(host_name, sizeof(host_name));
- h = gethostbyname(host_name);
- if (h) {
- strncpy(host_name, h->h_name, sizeof(host_name));
- host_name[sizeof(host_name)-1] = 0;
+ if ((e = getaddrinfo(host_name, NULL, &hints, &res)) != 0) {
+ perror("getaddrinfo: localhost");
+ perror(gai_strerror(e));
+ exit(1);
}
+ freeaddrinfo(res);
}
#if defined(AUTHENTICATE) || defined(ENCRYPT)

View File

@@ -0,0 +1,43 @@
--- netkit-telnet-0.17.orig/telnetd/telnetd.c 2007-03-13 16:31:20.000000000 +0000
+++ netkit-telnet-0.17.orig/telnetd/telnetd.c 2007-03-13 16:31:26.000000000 +0000
@@ -653,6 +653,11 @@ doit(struct sockaddr *who, socklen_t who
error = getnameinfo(who, wholen, namebuf, sizeof(namebuf), NULL, 0, 0);
+ /* if we can't get a hostname now, settle for an address */
+ if(error == EAI_AGAIN)
+ error = getnameinfo(who, wholen, namebuf, sizeof(namebuf),
+ NULL, 0, NI_NUMERICHOST);
+
if (error) {
perror("getnameinfo: localhost");
perror(gai_strerror(error));
@@ -681,7 +686,7 @@ doit(struct sockaddr *who, socklen_t who
/* Get local host name */
{
struct addrinfo hints;
- struct addrinfo *res;
+ struct addrinfo *res = 0;
int e;
memset(&hints, '\0', sizeof(hints));
@@ -690,11 +695,14 @@ doit(struct sockaddr *who, socklen_t who
gethostname(host_name, sizeof(host_name));
if ((e = getaddrinfo(host_name, NULL, &hints, &res)) != 0) {
- perror("getaddrinfo: localhost");
- perror(gai_strerror(e));
- exit(1);
+ if(e != EAI_AGAIN) {
+ fprintf(stderr, "getaddrinfo: localhost %s\n",
+ gai_strerror(e));
+ exit(1);
+ }
}
- freeaddrinfo(res);
+ if(res)
+ freeaddrinfo(res);
}
#if defined(AUTHENTICATE) || defined(ENCRYPT)

View File

@@ -0,0 +1,88 @@
--- netkit-telnet-0.17.orig/telnetd/telnetd.c.reallynodns 2009-03-12 14:32:29.000000000 -0700
+++ netkit-telnet-0.17.orig/telnetd/telnetd.c 2009-03-12 14:51:59.000000000 -0700
@@ -85,6 +85,7 @@
int keepalive = 1;
char *loginprg = _PATH_LOGIN;
char *progname;
+int lookupself = 1;
extern void usage(void);
@@ -111,7 +112,7 @@
progname = *argv;
- while ((ch = getopt(argc, argv, "d:a:e:lhnr:I:D:B:sS:a:X:L:")) != EOF) {
+ while ((ch = getopt(argc, argv, "d:a:e:lhnr:I:D:B:sS:a:X:L:N")) != EOF) {
switch(ch) {
#ifdef AUTHENTICATE
@@ -210,6 +211,10 @@
keepalive = 0;
break;
+ case 'N':
+ lookupself = 0;
+ break;
+
#ifdef SecurID
case 's':
/* SecurID required */
@@ -393,6 +398,7 @@
#endif
fprintf(stderr, " [-L login_program]");
fprintf(stderr, " [-n]");
+ fprintf(stderr, " [-N]");
#ifdef SecurID
fprintf(stderr, " [-s]");
#endif
@@ -691,15 +697,20 @@
memset(&hints, '\0', sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_ADDRCONFIG;
+ hints.ai_flags = AI_CANONNAME;
gethostname(host_name, sizeof(host_name));
- if ((e = getaddrinfo(host_name, NULL, &hints, &res)) != 0) {
- if(e != EAI_AGAIN) {
- fprintf(stderr, "getaddrinfo: localhost %s\n",
- gai_strerror(e));
- exit(1);
- }
+ /*
+ * Optionally canonicalize the local host name, in case
+ * gethostname() returns foo, we want foo.example.com
+ */
+ if (lookupself &&
+ (e = getaddrinfo(host_name, NULL, &hints, &res)) == 0) {
+ if (res->ai_canonname) {
+ strncpy(host_name, res->ai_canonname,
+ sizeof(host_name)-1);
+ host_name[sizeof(host_name)-1] = 0;
+ }
}
if(res)
freeaddrinfo(res);
--- netkit-telnet-0.17.orig/telnetd/telnetd.8.reallynodns 2009-03-12 14:54:54.000000000 -0700
+++ netkit-telnet-0.17.orig/telnetd/telnetd.8 2009-03-12 14:56:58.000000000 -0700
@@ -42,7 +42,7 @@
protocol server
.Sh SYNOPSIS
.Nm /usr/sbin/in.telnetd
-.Op Fl hns
+.Op Fl hnNs
.Op Fl a Ar authmode
.Op Fl D Ar debugmode
.Op Fl L Ar loginprg
@@ -175,6 +175,10 @@
if the client is still there, so that idle connections
from machines that have crashed or can no longer
be reached may be cleaned up.
+.It Fl N
+Do not use DNS to canonicalize the local hostname;
+.Fn gethostname 2
+returns a fully qualified name.
.It Fl s
This option is only enabled if
.Nm telnetd

View File

@@ -0,0 +1,33 @@
diff -ru netkit-telnet-0.17.orig/telnet/main.c netkit-telnet-0.17/telnet/main.c
--- netkit-telnet-0.17.orig/telnet/main.c 2003-05-15 20:07:40.000000000 +0200
+++ netkit-telnet-0.17/telnet/main.c 2003-05-16 00:18:28.000000000 +0200
@@ -143,7 +143,7 @@
while ((ch = getopt(argc, argv, "78DEKLS:X:ab:cde:fFk:l:n:rt:x")) != -1) {
switch(ch) {
case '8':
- eight = 3; /* binary output and input */
+ binary = 3; /* send TELNET BINARY option for output and input */
break;
case '7':
eight = 0;
@@ -165,7 +165,7 @@
#endif
break;
case 'L':
- eight |= 2; /* binary output only */
+ binary = 2; /* send TELNET BINARY option for output only */
break;
case 'S':
{
diff -ru netkit-telnet-0.17.orig/telnet/telnet.1 netkit-telnet-0.17/telnet/telnet.1
--- netkit-telnet-0.17.orig/telnet/telnet.1 2003-05-15 20:07:40.000000000 +0200
+++ netkit-telnet-0.17/telnet/telnet.1 2003-05-15 23:38:37.000000000 +0200
@@ -76,6 +76,8 @@
.Pp
The options are as follows:
.Bl -tag -width Ds
+.It Fl 7
+Strip 8th bit on input and output. Telnet is 8-bit clean by default but doesn't send the TELNET BINARY option unless forced.
.It Fl 8
Specifies an 8-bit data path.
This causes an attempt to negotiate the

View File

@@ -0,0 +1,179 @@
--- netkit-telnet-0.17/telnet/telnet.c.CAN-2005-468_469 2005-03-17 13:48:58.000000000 +0100
+++ netkit-telnet-0.17/telnet/telnet.c 2005-03-17 14:02:27.000000000 +0100
@@ -1310,22 +1310,66 @@
}
-unsigned char slc_reply[128];
+#define SLC_REPLY_SIZE 128
+unsigned char *slc_reply;
unsigned char *slc_replyp;
+unsigned char *slc_replyend;
void
slc_start_reply(void)
{
+ slc_reply = (unsigned char *)malloc(SLC_REPLY_SIZE);
+ if (slc_reply == NULL) {
+/*@*/ printf("slc_start_reply: malloc()/realloc() failed!!!\n");
+ slc_reply = slc_replyp = slc_replyend = NULL;
+ return;
+ }
+
slc_replyp = slc_reply;
+ slc_replyend = slc_reply + SLC_REPLY_SIZE;
*slc_replyp++ = IAC;
*slc_replyp++ = SB;
*slc_replyp++ = TELOPT_LINEMODE;
*slc_replyp++ = LM_SLC;
}
+static int
+slc_assure_buffer(int want_len);
+
+ static int
+slc_assure_buffer(int want_len)
+{
+ if ((slc_replyp + want_len) >= slc_replyend) {
+ int len;
+ int old_len = slc_replyp - slc_reply;
+ unsigned char *p;
+
+ len = old_len
+ + (want_len / SLC_REPLY_SIZE + 1) * SLC_REPLY_SIZE;
+ p = (unsigned char *)realloc(slc_reply, len);
+ if (p == NULL)
+ free(slc_reply);
+ slc_reply = p;
+ if (slc_reply == NULL) {
+/*@*/ printf("slc_add_reply: realloc() failed!!!\n");
+ slc_reply = slc_replyp = slc_replyend = NULL;
+ return 1;
+ }
+ slc_replyp = slc_reply + old_len;
+ slc_replyend = slc_reply + len;
+ }
+ return 0;
+}
+
void
slc_add_reply(unsigned char func, unsigned char flags, cc_t value)
{
+ if (slc_assure_buffer(6))
+ return;
+
+ if (slc_replyp == NULL)
+ return;
+
if ((*slc_replyp++ = func) == IAC)
*slc_replyp++ = IAC;
if ((*slc_replyp++ = flags) == IAC)
@@ -1339,6 +1383,12 @@
{
int len;
+ if (slc_assure_buffer(2))
+ return;
+
+ if (slc_replyp == NULL)
+ return;
+
*slc_replyp++ = IAC;
*slc_replyp++ = SE;
len = slc_replyp - slc_reply;
@@ -1456,7 +1506,7 @@
}
}
-#define OPT_REPLY_SIZE 256
+#define OPT_REPLY_SIZE 1024
unsigned char *opt_reply;
unsigned char *opt_replyp;
unsigned char *opt_replyend;
@@ -1490,10 +1540,38 @@
env_opt_start_info(void)
{
env_opt_start();
- if (opt_replyp)
+ if (opt_replyp && (opt_replyp > opt_reply))
opt_replyp[-1] = TELQUAL_INFO;
}
+static int
+env_opt_assure_buffer(int want_len);
+
+ static int
+env_opt_assure_buffer(int want_len)
+{
+ if ((opt_replyp + want_len) >= opt_replyend) {
+ int len;
+ unsigned char *p;
+ int old_len = opt_replyp - opt_reply;
+
+ len = old_len
+ + (want_len / OPT_REPLY_SIZE + 1) * OPT_REPLY_SIZE;
+ p = (unsigned char *)realloc(opt_reply, len);
+ if (p == NULL)
+ free(opt_reply);
+ opt_reply = p;
+ if (opt_reply == NULL) {
+/*@*/ printf("env_opt_add: realloc() failed!!!\n");
+ opt_reply = opt_replyp = opt_replyend = NULL;
+ return 1;
+ }
+ opt_replyp = opt_reply + old_len;
+ opt_replyend = opt_reply + len;
+ }
+ return 0;
+}
+
void
env_opt_add(unsigned char *ep)
{
@@ -1515,25 +1593,12 @@
return;
}
vp = env_getvalue(ep, 1);
- if (opt_replyp + (vp ? strlen((char *)vp) : 0) +
- strlen((char *)ep) + 6 > opt_replyend)
- {
- int len;
- unsigned char *p;
- opt_replyend += OPT_REPLY_SIZE;
- len = opt_replyend - opt_reply;
- p = (unsigned char *)realloc(opt_reply, len);
- if (p == NULL)
- free(opt_reply);
- opt_reply = p;
- if (opt_reply == NULL) {
-/*@*/ printf("env_opt_add: realloc() failed!!!\n");
- opt_reply = opt_replyp = opt_replyend = NULL;
- return;
- }
- opt_replyp = opt_reply + len - (opt_replyend - opt_replyp);
- opt_replyend = opt_reply + len;
- }
+
+ /* use the double length in case it gots escaped */
+ if (env_opt_assure_buffer((vp ? strlen((char *)vp)*2 : 0) +
+ strlen((char *)ep)*2 + 6))
+ return;
+
if (opt_welldefined((char *)ep))
#ifdef OLD_ENVIRON
if (telopt_environ == TELOPT_OLD_ENVIRON)
@@ -1588,8 +1653,14 @@
{
int len;
+ if (opt_reply == NULL) /*XXX*/
+ return; /*XXX*/
+
+
len = opt_replyp - opt_reply + 2;
if (emptyok || len > 6) {
+ if (env_opt_assure_buffer(2))
+ return;
*opt_replyp++ = IAC;
*opt_replyp++ = SE;
if (NETROOM() > len) {

View File

@@ -0,0 +1,12 @@
diff -ur netkit-telnet-0.17/telnetd/setproctitle.c netkit-telnet-0.17.new/telnetd/setproctitle.c
--- netkit-telnet-0.17/telnetd/setproctitle.c 1999-12-11 00:06:39.000000000 +0100
+++ netkit-telnet-0.17.new/telnetd/setproctitle.c 2004-06-28 16:48:51.153514392 +0200
@@ -139,7 +139,7 @@
(void) strcpy(Argv[0], buf);
p = &Argv[0][i];
while (p < LastArgv)
- *p++ = ' ';
+ *p++ = '\0';
Argv[1] = NULL;
}

View File

@@ -0,0 +1,11 @@
--- netkit-telnet-0.17/telnetd/telnetd.c.cleanup_race 2005-01-11 18:39:49.578123000 -0500
+++ netkit-telnet-0.17/telnetd/telnetd.c 2005-01-11 18:42:45.909616000 -0500
@@ -1081,6 +1081,8 @@
if (FD_ISSET(p, &obits) && (pfrontp - pbackp) > 0)
ptyflush();
}
+ /* to avoid a race for wtmp lock */
+ signal(SIGCHLD, SIG_IGN);
cleanup(0);
} /* end of telnet */

View File

@@ -0,0 +1,23 @@
--- netkit-telnet-0.17/configure.confverb 2000-07-29 20:00:29.000000000 +0200
+++ netkit-telnet-0.17/configure 2004-07-05 10:50:36.492963840 +0200
@@ -263,14 +263,19 @@
cat <<EOF >__conftest.cc
#include <unistd.h>
#include <signal.h>
-int count=0;
+volatile int count=0;
void handle(int foo) { count++; }
int main() {
+ sigset_t sset;
int pid=getpid();
+ sigemptyset(&sset);
+ sigaddset(&sset, SIGINT);
+ sigprocmask(SIG_UNBLOCK, &sset, NULL);
signal(SIGINT, handle);
kill(pid,SIGINT);
kill(pid,SIGINT);
kill(pid,SIGINT);
+ sleep(1);
if (count!=3) return 1;
return 0;
}

View File

@@ -0,0 +1,84 @@
--- netkit-telnet-0.17-pre-20000204/telnet/commands.c.env Thu Apr 8 19:30:20 1999
+++ netkit-telnet-0.17-pre-20000204/telnet/commands.c Tue May 16 17:19:47 2000
@@ -1815,11 +1815,11 @@
}
unsigned char *
-env_getvalue(unsigned char *var)
+env_getvalue(unsigned char *var, int exported_only)
{
- struct env_lst *ep;
+ struct env_lst *ep = env_find(var);
- if ((ep = env_find(var)))
+ if (ep && (!exported_only || ep->export))
return(ep->value);
return(NULL);
}
--- netkit-telnet-0.17-pre-20000204/telnet/telnet.c.env Tue May 16 17:19:47 2000
+++ netkit-telnet-0.17-pre-20000204/telnet/telnet.c Tue May 16 17:19:47 2000
@@ -438,7 +438,7 @@
#endif
case TELOPT_XDISPLOC: /* X Display location */
- if (env_getvalue((unsigned char *)"DISPLAY"))
+ if (env_getvalue((unsigned char *)"DISPLAY", 0))
new_state_ok = 1;
break;
@@ -693,7 +693,7 @@
resettermname = 0;
if (tnamep && tnamep != unknown)
free(tnamep);
- if ((tname = (char *)env_getvalue((unsigned char *)"TERM")) &&
+ if ((tname = (char *)env_getvalue((unsigned char *)"TERM", 0)) &&
(setupterm(tname, 1, &errret) == 0)) {
tnamep = mklist(ttytype, tname);
} else {
@@ -870,7 +870,7 @@
unsigned char temp[50], *dp;
int len;
- if ((dp = env_getvalue((unsigned char *)"DISPLAY")) == NULL) {
+ if ((dp = env_getvalue((unsigned char *)"DISPLAY", 0)) == NULL) {
/*
* Something happened, we no longer have a DISPLAY
* variable. So, turn off the option.
@@ -1527,7 +1527,7 @@
env_opt_add(ep);
return;
}
- vp = env_getvalue(ep);
+ vp = env_getvalue(ep, 1);
if (opt_replyp + (vp ? strlen((char *)vp) : 0) +
strlen((char *)ep) + 6 > opt_replyend)
{
@@ -2170,7 +2170,7 @@
send_will(TELOPT_LINEMODE, 1);
send_will(TELOPT_NEW_ENVIRON, 1);
send_do(TELOPT_STATUS, 1);
- if (env_getvalue((unsigned char *)"DISPLAY"))
+ if (env_getvalue((unsigned char *)"DISPLAY", 0))
send_will(TELOPT_XDISPLOC, 1);
if (binary)
tel_enter_binary(binary);
--- netkit-telnet-0.17-pre-20000204/telnet/externs.h.env Mon Feb 8 15:56:11 1999
+++ netkit-telnet-0.17-pre-20000204/telnet/externs.h Tue May 16 17:19:47 2000
@@ -203,7 +203,7 @@
void env_send (unsigned char *);
void env_list (void);
unsigned char * env_default(int init, int welldefined);
-unsigned char * env_getvalue(unsigned char *var);
+unsigned char * env_getvalue(unsigned char *var, int exported_only);
void set_escape_char(char *s);
unsigned long sourceroute(char *arg, char **cpp, int *lenp);
@@ -335,7 +335,7 @@
void env_opt_end (int);
unsigned char *env_default (int, int);
-unsigned char *env_getvalue (unsigned char *);
+unsigned char *env_getvalue (unsigned char *, int);
int get_status (void);
int dosynch (void);

View File

@@ -0,0 +1,24 @@
diff -up netkit-telnet-0.17/telnet/sys_bsd.c.errnosysbsd netkit-telnet-0.17/telnet/sys_bsd.c
--- netkit-telnet-0.17/telnet/sys_bsd.c.errnosysbsd 2007-09-20 10:57:58.000000000 +0200
+++ netkit-telnet-0.17/telnet/sys_bsd.c 2007-09-20 11:10:08.000000000 +0200
@@ -375,6 +375,7 @@ TerminalNewMode(int f)
int onoff;
int old;
cc_t esc;
+ int err;
globalmode = f&~MODE_FORCE;
if (prevmode == f)
@@ -407,6 +408,12 @@ TerminalNewMode(int f)
tcsetattr(tin, TCSADRAIN, &tmp_tc);
#endif /* USE_TERMIO */
old = ttyflush(SYNCHing|flushout);
+ if (old < 0) {
+ err = errno;
+ if (! ((err == EINTR) || (err == EAGAIN) || (err == ENOSPC))) {
+ break;
+ }
+ }
} while (old < 0 || old > 1);
}

View File

@@ -0,0 +1,81 @@
--- netkit-telnet-0.17/telnetd/utility.c.issue Sun Dec 12 09:59:45 1999
+++ netkit-telnet-0.17/telnetd/utility.c Wed Jul 18 11:14:11 2001
@@ -460,13 +460,13 @@
putlocation = where;
while (*cp) {
- if (*cp != '%') {
+ if (*cp != '%' && *cp != '\\') {
putchr(*cp++);
continue;
}
switch (*++cp) {
- case 't':
+ case 'l':
slash = strrchr(line, '/');
if (slash == NULL)
putstr(line);
@@ -474,21 +474,28 @@
putstr(slash+1);
break;
+ case 'n':
case 'h':
putstr(editedhost);
break;
+ case 't':
case 'd':
(void)time(&t);
(void)strftime(db, sizeof(db), fmtstr, localtime(&t));
putstr(db);
break;
+ case '\\':
+ putchr('\\');
+ break;
+
case '%':
putchr('%');
break;
case 'D':
+ case 'o':
{
char buff[128];
@@ -515,7 +522,7 @@
c = fgetc(fp);
} while (c != EOF && c != '\n');
continue;
- } else if (c == '%') {
+ } else if (c == '%' || c == '\\') {
buff[0] = c;
c = fgetc(fp);
if (c == EOF) break;
--- netkit-telnet-0.17/telnetd/issue.net.5.issue Sun Jul 30 19:57:09 2000
+++ netkit-telnet-0.17/telnetd/issue.net.5 Wed Jul 18 11:03:09 2001
@@ -15,16 +15,17 @@
.Pa /etc/issue.net
is a text file which contains a message or system identification to be
printed before the login prompt of a telnet session. It may contain
-various `%-char' sequences. The following sequences are supported by
+various `%-char' (or, alternatively, '\\-char') sequences. The following
+sequences are supported by
.Ic telnetd :
.Bl -tag -offset indent -compact -width "abcde"
-.It %t
+.It %l
- show the current tty
-.It %h
+.It %h, %n
- show the system node name (FQDN)
-.It %D
+.It %D, %o
- show the name of the NIS domain
-.It %d
+.It %d, %t
- show the current time and date
.It %s
- show the name of the operating system

View File

@@ -0,0 +1,37 @@
diff -u telnet/commands.c telnet.new/commands.c
--- telnet/commands.c Sat Sep 1 12:55:18 2001
+++ telnet.new/commands.c Sat Sep 1 12:54:36 2001
@@ -2354,6 +2354,7 @@
hints.ai_flags = AI_CANONNAME;
if (portp == NULL) {
portp = "telnet";
+ telnetport = 1;
} else if (*portp == '-') {
portp++;
telnetport = 1;
@@ -2397,7 +2398,6 @@
if (error) {
warn("%s: %s", aliasp, gai_strerror(error));
close(net);
- freeaddrinfo(ares);
continue;
}
if (bind(net, ares->ai_addr, ares->ai_addrlen) < 0) {
@@ -2414,7 +2414,7 @@
perror("setsockopt (IP_OPTIONS)");
#endif
#if defined(IPPROTO_IP) && defined(IP_TOS)
- {
+ if (res->ai_family == AF_INET) {
# if defined(HAS_GETTOS)
struct tosent *tp;
if (tos < 0 && (tp = gettosbyname("telnet", "tcp")))
@@ -2438,7 +2438,7 @@
char hbuf[NI_MAXHOST];
if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
- NULL, 0, NI_NUMERICHOST) != 0) {
+ NULL, 0, niflags) != 0) {
strcpy(hbuf, "(invalid)");
}
fprintf(stderr, "telnet: connect to address %s: %s\n", hbuf,

View File

@@ -0,0 +1,208 @@
diff -up netkit-telnet-0.17/telnetd/ext.h.sa-01-49 netkit-telnet-0.17/telnetd/ext.h
--- netkit-telnet-0.17/telnetd/ext.h.sa-01-49 1999-12-12 15:59:44.000000000 +0100
+++ netkit-telnet-0.17/telnetd/ext.h 2011-01-20 22:39:54.000000000 +0100
@@ -86,7 +86,10 @@ extern char *neturg; /* one past last b
extern int pcc, ncc;
/* printf into netobuf */
-void netoprintf(const char *fmt, ...) __attribute((format (printf, 1, 2)));
+/* void netoprintf(const char *fmt, ...) __attribute((format (printf, 1, 2))); */
+#define netoprintf output_data
+int output_data(const char *, ...) __attribute((format (printf, 1, 2)));
+void output_datalen(const char *, int);
extern int pty, net;
extern char *line;
@@ -182,7 +185,10 @@ void tty_setsofttab(int);
void tty_tspeed(int);
void willoption(int);
void wontoption(int);
+
+#if 0
void writenet(unsigned char *, int);
+#endif
#if defined(ENCRYPT)
extern void (*encrypt_output)(unsigned char *, int);
diff -up netkit-telnet-0.17/telnetd/slc.c.sa-01-49 netkit-telnet-0.17/telnetd/slc.c
--- netkit-telnet-0.17/telnetd/slc.c.sa-01-49 1999-12-12 15:59:44.000000000 +0100
+++ netkit-telnet-0.17/telnetd/slc.c 2011-01-20 22:39:54.000000000 +0100
@@ -183,7 +183,7 @@ int end_slc(unsigned char **bufp) {
else {
snprintf(slcbuf+slcoff, sizeof(slcbuf)-slcoff, "%c%c", IAC, SE);
slcoff += 2;
- writenet(slcbuf, slcoff);
+ output_datalen(slcbuf, slcoff);
netflush(); /* force it out immediately */
}
}
diff -up netkit-telnet-0.17/telnetd/state.c.sa-01-49 netkit-telnet-0.17/telnetd/state.c
--- netkit-telnet-0.17/telnetd/state.c.sa-01-49 1999-12-12 20:41:44.000000000 +0100
+++ netkit-telnet-0.17/telnetd/state.c 2011-01-20 22:43:34.000000000 +0100
@@ -37,6 +37,7 @@
char state_rcsid[] =
"$Id: state.c,v 1.12 1999/12/12 19:41:44 dholland Exp $";
+#include <stdarg.h>
#include "telnetd.h"
int not42 = 1;
@@ -1365,7 +1366,7 @@ void send_status(void) {
ADD(IAC);
ADD(SE);
- writenet(statusbuf, ncp - statusbuf);
+ output_datalen(statusbuf, ncp - statusbuf);
netflush(); /* Send it on its way */
DIAG(TD_OPTIONS, {printsub('>', statusbuf, ncp - statusbuf); netflush();});
diff -up netkit-telnet-0.17/telnetd/termstat.c.sa-01-49 netkit-telnet-0.17/telnetd/termstat.c
--- netkit-telnet-0.17/telnetd/termstat.c.sa-01-49 1999-12-12 15:59:45.000000000 +0100
+++ netkit-telnet-0.17/telnetd/termstat.c 2011-01-20 22:39:54.000000000 +0100
@@ -128,7 +128,6 @@ static int _terminit = 0;
void
localstat()
{
- void netflush();
int need_will_echo = 0;
/*
diff -up netkit-telnet-0.17/telnetd/utility.c.sa-01-49 netkit-telnet-0.17/telnetd/utility.c
--- netkit-telnet-0.17/telnetd/utility.c.sa-01-49 2011-01-20 22:39:54.000000000 +0100
+++ netkit-telnet-0.17/telnetd/utility.c 2011-01-20 22:48:02.000000000 +0100
@@ -38,8 +38,10 @@ char util_rcsid[] =
"$Id: utility.c,v 1.11 1999/12/12 14:59:45 dholland Exp $";
#define PRINTOPTIONS
+#define _GNU_SOURCE
#include <stdarg.h>
+#include <stdio.h>
#include <sys/utsname.h>
#ifdef AUTHENTICATE
@@ -52,6 +54,53 @@ char util_rcsid[] =
* utility functions performing io related tasks
*/
+/*
+ * This function appends data to nfrontp and advances nfrontp.
+ * Returns the number of characters written altogether (the
+ * buffer may have been flushed in the process).
+ */
+
+int
+output_data(const char *format, ...)
+{
+ va_list args;
+ int len;
+ char *buf;
+
+ va_start(args, format);
+ if ((len = vasprintf(&buf, format, args)) == -1)
+ return -1;
+ output_datalen(buf, len);
+ va_end(args);
+ free(buf);
+ return (len);
+}
+
+void
+output_datalen(const char *buf, int len)
+{
+ int remaining, copied;
+
+ remaining = BUFSIZ - (nfrontp - netobuf);
+ while (len > 0) {
+ /* Free up enough space if the room is too low*/
+ if ((len > BUFSIZ ? BUFSIZ : len) > remaining) {
+ netflush();
+ remaining = BUFSIZ - (nfrontp - netobuf);
+ }
+
+ /* Copy out as much as will fit */
+ copied = remaining > len ? len : remaining;
+ memmove(nfrontp, buf, copied);
+ nfrontp += copied;
+ len -= copied;
+ remaining -= copied;
+ buf += copied;
+ }
+ return;
+}
+
+/**
void
netoprintf(const char *fmt, ...)
{
@@ -67,7 +116,7 @@ netoprintf(const char *fmt, ...)
va_end(ap);
if (len<0 || len==maxsize) {
- /* didn't fit */
+ / * did not fit * /
netflush();
}
else {
@@ -76,6 +125,7 @@ netoprintf(const char *fmt, ...)
}
nfrontp += len;
}
+*/
/*
* ttloop
@@ -273,10 +323,15 @@ netflush(void)
int n;
if ((n = nfrontp - nbackp) > 0) {
+
+#if 0
+ /* XXX This causes output_data() to recurse and die */
DIAG(TD_REPORT,
{ netoprintf("td: netflush %d chars\r\n", n);
n = nfrontp - nbackp; /* update count */
});
+#endif
+
#if defined(ENCRYPT)
if (encrypt_output) {
char *s = nclearto ? nclearto : nbackp;
@@ -310,11 +365,14 @@ netflush(void)
}
}
}
- if (n < 0) {
- if (errno == EWOULDBLOCK || errno == EINTR)
- return;
- cleanup(0);
- }
+
+ if (n == -1) {
+ if (errno == EWOULDBLOCK || errno == EINTR)
+ return;
+ cleanup(0);
+ /* NOTREACHED */
+ }
+
nbackp += n;
#if defined(ENCRYPT)
if (nbackp > nclearto)
@@ -332,7 +390,7 @@ netflush(void)
return;
} /* end of netflush */
-
+#if 0
/*
* writenet
*
@@ -355,7 +413,7 @@ void writenet(register unsigned char *pt
nfrontp += len;
} /* end of writenet */
-
+#endif
/*
* miscellaneous functions doing a variety of little jobs follow ...

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
--- netkit-telnet-0.17/telnet/commands.c.old 2006-04-30 10:24:49.000000000 -0700
+++ netkit-telnet-0.17/telnet/commands.c 2006-04-30 10:37:10.000000000 -0700
@@ -1669,9 +1669,15 @@
/* If this is not the full name, try to get it via DNS */
if (strchr(hbuf, '.') == 0) {
- struct hostent *he = gethostbyname(hbuf);
- if (he != 0)
- strncpy(hbuf, he->h_name, sizeof hbuf-1);
+ struct addrinfo hints;
+ struct addrinfo *res;
+ memset (&hints, '\0', sizeof (hints));
+ hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME;
+ if (getaddrinfo (hbuf, NULL, &hints, &res) == 0) {
+ if (res->ai_canonname != NULL)
+ strncpy(hbuf, res->ai_canonname, sizeof hbuf-1);
+ freeaddrinfo (res);
+ }
hbuf[sizeof hbuf-1] = '\0';
}
@@ -2832,17 +2838,15 @@
if (!c)
cp2 = 0;
- if ((tmp = inet_addr(cp)) != -1) {
- sin_addr.s_addr = tmp;
- } else if ((host = gethostbyname(cp))) {
-#if defined(h_addr)
- memmove((caddr_t)&sin_addr,
- host->h_addr_list[0],
- sizeof(sin_addr));
-#else
- memmove((caddr_t)&sin_addr, host->h_addr,
- sizeof(sin_addr));
-#endif
+ struct addrinfo hints;
+ memset (&hints, '\0', sizeof (hints));
+ // XXX The code here seems to allow only IPv4 addresses.
+ hints.ai_family = AF_INET;
+ hints.ai_flags = AI_ADDRCONFIG;
+ struct addrinfo *aires;
+ if (getaddrinfo (cp, NULL, &hints, &aires) == 0) {
+ sin_addr = ((struct sockaddr_in *) aires->ai_addr)->sin_addr;
+ freeaddrinfo (aires);
} else {
*cpp = cp;
return(0);