From ari@guinness.syncrontech.com  Mon Nov 18 03:00:48 2002
Return-Path: <ari@guinness.syncrontech.com>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 8727B37B43A
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 18 Nov 2002 03:00:44 -0800 (PST)
Received: from guinness.syncrontech.com (guinness.syncrontech.com [62.71.8.19])
	by mx1.FreeBSD.org (Postfix) with ESMTP id DCF6543E42
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 18 Nov 2002 03:00:42 -0800 (PST)
	(envelope-from ari@guinness.syncrontech.com)
Received: from guinness.syncrontech.com (localhost [127.0.0.1])
	by guinness.syncrontech.com (8.12.6/8.12.6) with ESMTP id gAIB0ej0037530
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 18 Nov 2002 13:00:40 +0200 (EET)
	(envelope-from ari@guinness.syncrontech.com)
Received: (from ari@localhost)
	by guinness.syncrontech.com (8.12.6/8.12.6/Submit) id gAIB0dRY037529;
	Mon, 18 Nov 2002 13:00:39 +0200 (EET)
Message-Id: <200211181100.gAIB0dRY037529@guinness.syncrontech.com>
Date: Mon, 18 Nov 2002 13:00:39 +0200 (EET)
From: Ari Suutari <ari.suutari@syncrontech.com>
Reply-To: Ari Suutari <ari.suutari@syncrontech.com>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: Telnet dumps core when MAKE_KERBEROS5=yes is enabled
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         45397
>Category:       bin
>Synopsis:       Telnet dumps core when MAKE_KERBEROS5=yes is enabled
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    nectar
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Nov 18 03:10:01 PST 2002
>Closed-Date:    Fri Jan 09 06:43:22 PST 2004
>Last-Modified:  Fri Jan 09 06:43:22 PST 2004
>Originator:     Ari Suutari
>Release:        FreeBSD 4.7-STABLE i386
>Organization:
Syncron Tech Oy
>Environment:
System: FreeBSD guinness.syncrontech.com 4.7-STABLE FreeBSD 4.7-STABLE #3: Fri Nov 15 15:26:45 EET 2002 ari@pommac.syncrontech.com:/usr/obj/usr/src/sys/GUINNESS i386


>Description:

	When system is build with MAKE_KERBEROS5 and MAKE_KERBEROS4 set
	to yes in /etc/make.conf, the resulting telnet dumps core on systems
	that have kerberos 5 configured.

>How-To-Repeat:

	$ k5init myusername
	myusername@REALM's Password:
	$ telnet host
	Trying x.x.x.x...
	Connected to host.somedomain.com.
	Escape character is '^]'.
	[ Trying mutual KERBEROS5 (host/host.somedomain.com@REALM)... ]
 	zsh: bus error (core dumped) 

>Fix:

	Browsing around the sources reveals that there are multiple
	sources for function called 'net_write'. One is inside telnet
	application itself and has 2 parameters. Another is inside
	/usr/src/crypto/heimdal/lib/roken, which has 3 parameters.
  	Original telnet sources with heimdal distribution seem
	to handle this by renaming the function in telnet from
	net_write to telnet_net_write, which seems to fix the core dump.



>Release-Note:
>Audit-Trail:

From: Peter Pentchev <roam@ringlet.net>
To: Ari Suutari <ari.suutari@syncrontech.com>
Cc: bug-followup@FreeBSD.org
Subject: Re: bin/45397: Telnet dumps core when MAKE_KERBEROS5=yes is enabled
Date: Tue, 19 Nov 2002 16:48:22 +0200

 On Mon, Nov 18, 2002 at 01:00:39PM +0200, Ari Suutari wrote:
 > 
 > >Number:         45397
 > >Category:       bin
 > >Synopsis:       Telnet dumps core when MAKE_KERBEROS5=yes is enabled
 > >Originator:     Ari Suutari
 > >Release:        FreeBSD 4.7-STABLE i386
 > >Organization:
 > Syncron Tech Oy
 > >Environment:
 > System: FreeBSD guinness.syncrontech.com 4.7-STABLE FreeBSD 4.7-STABLE #3: Fri Nov 15 15:26:45 EET 2002 ari@pommac.syncrontech.com:/usr/obj/usr/src/sys/GUINNESS i386
 > 
 > 
 > >Description:
 > 
 > 	When system is build with MAKE_KERBEROS5 and MAKE_KERBEROS4 set
 > 	to yes in /etc/make.conf, the resulting telnet dumps core on systems
 > 	that have kerberos 5 configured.
 
 Can you try the following patch?  It prevents the core dump here,
 although the authentication hangs after the 'Trying mutual KERBEROS5'
 message, but then again, the hang could be the result of my
 misconfiguration: this is my first time trying to configure Kerberos
 after all :)
 
 G'luck,
 Peter
 
 -- 
 Peter Pentchev	roam@ringlet.net	roam@FreeBSD.org
 PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
 Key fingerprint	FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
 Hey, out there - is it *you* reading me, or is it someone else?
 
 Index: src/crypto/telnet/libtelnet/auth.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/auth.c,v
 retrieving revision 1.3.2.5
 diff -u -r1.3.2.5 auth.c
 --- src/crypto/telnet/libtelnet/auth.c	13 Apr 2002 10:59:07 -0000	1.3.2.5
 +++ src/crypto/telnet/libtelnet/auth.c	19 Nov 2002 14:35:16 -0000
 @@ -359,7 +359,7 @@
  		}
  		*e++ = IAC;
  		*e++ = SE;
 -		net_write(str_request, e - str_request);
 +		telnet_net_write(str_request, e - str_request);
  		printsub('>', &str_request[2], e - str_request - 2);
  	}
  }
 @@ -444,7 +444,7 @@
  		}
  		auth_send_data += 2;
  	}
 -	net_write(str_none, sizeof(str_none));
 +	telnet_net_write(str_none, sizeof(str_none));
  	printsub('>', &str_none[2], sizeof(str_none) - 2);
  	if (auth_debug_mode)
  		printf(">>>%s: Sent failure message\r\n", Name);
 @@ -537,7 +537,7 @@
  	}
  	*e++ = IAC;
  	*e++ = SE;
 -	net_write(str_request, e - str_request);
 +	telnet_net_write(str_request, e - str_request);
  	printsub('>', &str_request[2], e - &str_request[2]);
  	return(1);
  }
 Index: src/crypto/telnet/libtelnet/enc_des.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/enc_des.c,v
 retrieving revision 1.3.2.1
 diff -u -r1.3.2.1 enc_des.c
 --- src/crypto/telnet/libtelnet/enc_des.c	13 Apr 2002 10:59:07 -0000	1.3.2.1
 +++ src/crypto/telnet/libtelnet/enc_des.c	19 Nov 2002 14:35:22 -0000
 @@ -225,7 +225,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  		break;
  	default:
  		return(FAILED);
 @@ -284,7 +284,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  
  		state = fbp->state[DIR_DECRYPT-1] = IN_PROGRESS;
  		break;
 @@ -309,7 +309,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  
  		break;
  	}
 Index: src/crypto/telnet/libtelnet/encrypt.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/encrypt.c,v
 retrieving revision 1.3.2.2
 diff -u -r1.3.2.2 encrypt.c
 --- src/crypto/telnet/libtelnet/encrypt.c	13 Apr 2002 10:59:07 -0000	1.3.2.2
 +++ src/crypto/telnet/libtelnet/encrypt.c	19 Nov 2002 14:35:29 -0000
 @@ -427,7 +427,7 @@
  		 */
  		if (!Server && autodecrypt)
  			encrypt_send_request_start();
 -		net_write(str_send, str_suplen);
 +		telnet_net_write(str_send, str_suplen);
  		printsub('>', &str_send[2], str_suplen - 2);
  		str_suplen = 0;
  	}
 @@ -773,7 +773,7 @@
  	}
  	*strp++ = IAC;
  	*strp++ = SE;
 -	net_write(str_keyid, strp - str_keyid);
 +	telnet_net_write(str_keyid, strp - str_keyid);
  	printsub('>', &str_keyid[2], strp - str_keyid - 2);
  }
  
 @@ -832,7 +832,7 @@
  	}
  	*p++ = IAC;
  	*p++ = SE;
 -	net_write(str_start, p - str_start);
 +	telnet_net_write(str_start, p - str_start);
  	net_encrypt();
  	printsub('>', &str_start[2], p - &str_start[2]);
  	/*
 @@ -858,7 +858,7 @@
  		return;
  
  	str_end[3] = ENCRYPT_END;
 -	net_write(str_end, sizeof(str_end));
 +	telnet_net_write(str_end, sizeof(str_end));
  	net_encrypt();
  	printsub('>', &str_end[2], sizeof(str_end) - 2);
  	/*
 @@ -886,7 +886,7 @@
  	}
  	*p++ = IAC;
  	*p++ = SE;
 -	net_write(str_start, p - str_start);
 +	telnet_net_write(str_start, p - str_start);
  	printsub('>', &str_start[2], p - &str_start[2]);
  	if (encrypt_debug_mode)
  		printf(">>>%s: Request input to be encrypted\r\n", Name);
 @@ -896,7 +896,7 @@
  encrypt_send_request_end(void)
  {
  	str_end[3] = ENCRYPT_REQEND;
 -	net_write(str_end, sizeof(str_end));
 +	telnet_net_write(str_end, sizeof(str_end));
  	printsub('>', &str_end[2], sizeof(str_end) - 2);
  
  	if (encrypt_debug_mode)
 Index: src/crypto/telnet/libtelnet/kerberos.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/kerberos.c,v
 retrieving revision 1.3.2.1
 diff -u -r1.3.2.1 kerberos.c
 --- src/crypto/telnet/libtelnet/kerberos.c	13 Apr 2002 10:59:07 -0000	1.3.2.1
 +++ src/crypto/telnet/libtelnet/kerberos.c	19 Nov 2002 14:35:33 -0000
 @@ -126,7 +126,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 Index: src/crypto/telnet/libtelnet/kerberos5.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/kerberos5.c,v
 retrieving revision 1.1.1.1.8.1
 diff -u -r1.1.1.1.8.1 kerberos5.c
 --- src/crypto/telnet/libtelnet/kerberos5.c	13 Apr 2002 10:59:07 -0000	1.1.1.1.8.1
 +++ src/crypto/telnet/libtelnet/kerberos5.c	19 Nov 2002 14:35:38 -0000
 @@ -128,7 +128,7 @@
      *p++ = SE;
      if (str_data[3] == TELQUAL_IS)
  	printsub('>', &str_data[2], p - &str_data[2]);
 -    return(net_write(str_data, p - str_data));
 +    return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 Index: src/crypto/telnet/libtelnet/krb4encpwd.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/krb4encpwd.c,v
 retrieving revision 1.3.2.1
 diff -u -r1.3.2.1 krb4encpwd.c
 --- src/crypto/telnet/libtelnet/krb4encpwd.c	13 Apr 2002 10:59:07 -0000	1.3.2.1
 +++ src/crypto/telnet/libtelnet/krb4encpwd.c	19 Nov 2002 14:35:42 -0000
 @@ -146,7 +146,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  	int
 Index: src/crypto/telnet/libtelnet/misc-proto.h
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/misc-proto.h,v
 retrieving revision 1.1.1.1.8.1
 diff -u -r1.1.1.1.8.1 misc-proto.h
 --- src/crypto/telnet/libtelnet/misc-proto.h	13 Apr 2002 10:59:07 -0000	1.1.1.1.8.1
 +++ src/crypto/telnet/libtelnet/misc-proto.h	19 Nov 2002 14:35:46 -0000
 @@ -71,7 +71,7 @@
  /*
   * These functions are imported from the application
   */
 -int net_write(unsigned char *, int);
 +int telnet_net_write(unsigned char *, int);
  void net_encrypt(void);
  int telnet_spin(void);
  char *telnet_getenv(char *);
 Index: src/crypto/telnet/libtelnet/rsaencpwd.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/rsaencpwd.c,v
 retrieving revision 1.1.1.1.8.1
 diff -u -r1.1.1.1.8.1 rsaencpwd.c
 --- src/crypto/telnet/libtelnet/rsaencpwd.c	13 Apr 2002 10:59:07 -0000	1.1.1.1.8.1
 +++ src/crypto/telnet/libtelnet/rsaencpwd.c	19 Nov 2002 14:35:51 -0000
 @@ -142,7 +142,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  	int
 Index: src/crypto/telnet/libtelnet/sra.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/libtelnet/sra.c,v
 retrieving revision 1.1.2.7
 diff -u -r1.1.2.7 sra.c
 --- src/crypto/telnet/libtelnet/sra.c	16 May 2002 08:46:49 -0000	1.1.2.7
 +++ src/crypto/telnet/libtelnet/sra.c	19 Nov 2002 14:35:56 -0000
 @@ -106,7 +106,7 @@
          *p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -        return(net_write(str_data, p - str_data));
 +        return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 Index: src/crypto/telnet/telnet/authenc.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/telnet/authenc.c,v
 retrieving revision 1.2.8.2
 diff -u -r1.2.8.2 authenc.c
 --- src/crypto/telnet/telnet/authenc.c	13 Apr 2002 10:59:08 -0000	1.2.8.2
 +++ src/crypto/telnet/telnet/authenc.c	19 Nov 2002 14:36:02 -0000
 @@ -55,7 +55,7 @@
  #include "types.h"
  
  int
 -net_write(unsigned char *str, int len)
 +telnet_net_write(unsigned char *str, int len)
  {
  	if (NETROOM() > len) {
  		ring_supply_data(&netoring, str, len);
 Index: src/crypto/telnet/telnetd/authenc.c
 ===================================================================
 RCS file: /home/ncvs/src/crypto/telnet/telnetd/authenc.c,v
 retrieving revision 1.4.2.2
 diff -u -r1.4.2.2 authenc.c
 --- src/crypto/telnet/telnetd/authenc.c	13 Apr 2002 10:59:08 -0000	1.4.2.2
 +++ src/crypto/telnet/telnetd/authenc.c	19 Nov 2002 14:36:05 -0000
 @@ -47,7 +47,7 @@
  #include <libtelnet/misc.h>
  
  int
 -net_write(unsigned char *str, int len)
 +telnet_net_write(unsigned char *str, int len)
  {
  	if (nfrontp + len < netobuf + BUFSIZ) {
  		output_datalen(str, len);

From: Ari Suutari <ari.suutari@syncrontech.com>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Fwd: Re: bin/45397: Telnet dumps core when MAKE_KERBEROS5=yes is enabled
Date: Mon, 25 Nov 2002 08:51:07 +0200

 No more core dump after your patch. However, I suspect
 that there is another problem in telnetd, since it either core
 dumps now or I get '[ Kerberos V5 refuses authentication because Read req
 failed: Key table entry not found ]'. Maybe this is kerberos configuratio=
 n
 problem (I doubt it because ktutil list shows all hosts I have...), I
 cannot be sure because I'm just started using kerberos5....
 
 I'll try to do more testing. Anyway, your patch is good because
 now something at least tries to work...
 
 =09Ari S.
 

From: Ari Suutari <ari.suutari@syncrontech.com>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/45397: Telnet dumps core when MAKE_KERBEROS5=yes is enabled
Date: Mon, 25 Nov 2002 09:14:19 +0200

 telnetd seems to crash in crypto/telnet/libtelnet/kerberos5.c:438
 It looks like the pointer being used is NULL. Reason
 for that is beyond my knowledge currently....
 =20
 (it tried to add test for pointer being null, which makes
 telnetd to work, kerberos even accepted me sometimes,
 but after that telnet dumps core on similar place as telnetd)
 
 =09Ari S.
 

From: Bjorn Gronvall <bg@effnet.com>
To: freebsd-gnats-submit@FreeBSD.org, ari.suutari@syncrontech.com,
	roam@ringlet.net, bug-followup@FreeBSD.org, markm@FreeBSD.org
Cc:  
Subject: Re: bin/45397: Telnet dumps core when MAKE_KERBEROS5=yes is enabled
Date: Thu, 02 Jan 2003 20:16:36 +0100

 This is a multi-part message in MIME format.
 --------------D1C7367BBBD2CF5FAB51F35F
 Content-Type: text/plain; charset=iso-8859-1
 Content-Transfer-Encoding: 8bit
 
 This patch also renames net_write to telnet_net_write (as Peter
 suggested). It also includes changes to
 crypto/telnet/libtelnet/kerberos5.c to ensure that subkeys are
 properly used (incorporated from heimdal).
 
 After these two changes my telnet and telnetd interoperates
 correctly with the heimdal ditos and and also with the old
 FreeBSD telnetd.
 
 Cheers,
 Bjrn
 --------------D1C7367BBBD2CF5FAB51F35F
 Content-Type: text/plain; charset=us-ascii;
  name="telnet.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="telnet.patch"
 
 diff -ur crypto/telnet.orig/libtelnet/auth.c crypto/telnet/libtelnet/auth.c
 --- crypto/telnet.orig/libtelnet/auth.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/auth.c	Thu Jan  2 18:06:48 2003
 @@ -359,7 +359,7 @@
  		}
  		*e++ = IAC;
  		*e++ = SE;
 -		net_write(str_request, e - str_request);
 +		telnet_net_write(str_request, e - str_request);
  		printsub('>', &str_request[2], e - str_request - 2);
  	}
  }
 @@ -444,7 +444,7 @@
  		}
  		auth_send_data += 2;
  	}
 -	net_write(str_none, sizeof(str_none));
 +	telnet_net_write(str_none, sizeof(str_none));
  	printsub('>', &str_none[2], sizeof(str_none) - 2);
  	if (auth_debug_mode)
  		printf(">>>%s: Sent failure message\r\n", Name);
 @@ -537,7 +537,7 @@
  	}
  	*e++ = IAC;
  	*e++ = SE;
 -	net_write(str_request, e - str_request);
 +	telnet_net_write(str_request, e - str_request);
  	printsub('>', &str_request[2], e - &str_request[2]);
  	return(1);
  }
 diff -ur crypto/telnet.orig/libtelnet/enc_des.c crypto/telnet/libtelnet/enc_des.c
 --- crypto/telnet.orig/libtelnet/enc_des.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/enc_des.c	Thu Jan  2 18:06:50 2003
 @@ -225,7 +225,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  		break;
  	default:
  		return(FAILED);
 @@ -284,7 +284,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  
  		state = fbp->state[DIR_DECRYPT-1] = IN_PROGRESS;
  		break;
 @@ -309,7 +309,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  
  		break;
  	}
 diff -ur crypto/telnet.orig/libtelnet/encrypt.c crypto/telnet/libtelnet/encrypt.c
 --- crypto/telnet.orig/libtelnet/encrypt.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/encrypt.c	Thu Jan  2 18:06:50 2003
 @@ -427,7 +427,7 @@
  		 */
  		if (!Server && autodecrypt)
  			encrypt_send_request_start();
 -		net_write(str_send, str_suplen);
 +		telnet_net_write(str_send, str_suplen);
  		printsub('>', &str_send[2], str_suplen - 2);
  		str_suplen = 0;
  	}
 @@ -773,7 +773,7 @@
  	}
  	*strp++ = IAC;
  	*strp++ = SE;
 -	net_write(str_keyid, strp - str_keyid);
 +	telnet_net_write(str_keyid, strp - str_keyid);
  	printsub('>', &str_keyid[2], strp - str_keyid - 2);
  }
  
 @@ -832,7 +832,7 @@
  	}
  	*p++ = IAC;
  	*p++ = SE;
 -	net_write(str_start, p - str_start);
 +	telnet_net_write(str_start, p - str_start);
  	net_encrypt();
  	printsub('>', &str_start[2], p - &str_start[2]);
  	/*
 @@ -858,7 +858,7 @@
  		return;
  
  	str_end[3] = ENCRYPT_END;
 -	net_write(str_end, sizeof(str_end));
 +	telnet_net_write(str_end, sizeof(str_end));
  	net_encrypt();
  	printsub('>', &str_end[2], sizeof(str_end) - 2);
  	/*
 @@ -886,7 +886,7 @@
  	}
  	*p++ = IAC;
  	*p++ = SE;
 -	net_write(str_start, p - str_start);
 +	telnet_net_write(str_start, p - str_start);
  	printsub('>', &str_start[2], p - &str_start[2]);
  	if (encrypt_debug_mode)
  		printf(">>>%s: Request input to be encrypted\r\n", Name);
 @@ -896,7 +896,7 @@
  encrypt_send_request_end(void)
  {
  	str_end[3] = ENCRYPT_REQEND;
 -	net_write(str_end, sizeof(str_end));
 +	telnet_net_write(str_end, sizeof(str_end));
  	printsub('>', &str_end[2], sizeof(str_end) - 2);
  
  	if (encrypt_debug_mode)
 diff -ur crypto/telnet.orig/libtelnet/kerberos.c crypto/telnet/libtelnet/kerberos.c
 --- crypto/telnet.orig/libtelnet/kerberos.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/kerberos.c	Thu Jan  2 18:06:51 2003
 @@ -126,7 +126,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 diff -ur crypto/telnet.orig/libtelnet/kerberos5.c crypto/telnet/libtelnet/kerberos5.c
 --- crypto/telnet.orig/libtelnet/kerberos5.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/kerberos5.c	Thu Jan  2 18:06:51 2003
 @@ -128,7 +128,7 @@
      *p++ = SE;
      if (str_data[3] == TELQUAL_IS)
  	printsub('>', &str_data[2], p - &str_data[2]);
 -    return(net_write(str_data, p - str_data));
 +    return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 @@ -193,6 +193,8 @@
      else
  	ap_opts = 0;
      
 +    ap_opts |= AP_OPTS_USE_SUBKEY;
 +
      ret = krb5_auth_con_init (context, &auth_context);
      if (ret) {
  	if (auth_debug_mode) {
 @@ -406,6 +408,29 @@
  		printf("Kerberos V5: "
  		       "krb5_auth_con_getremotesubkey failed (%s)\r\n",
  		       krb5_get_err_text(context, ret));
 +	    return;
 +	}
 +
 +	if (key_block == NULL) {
 +	    ret = krb5_auth_con_getkey(context,
 +				       auth_context,
 +				       &key_block);
 +	}
 +	if (ret) {
 +	    Data(ap, KRB_REJECT, "krb5_auth_con_getkey failed", -1);
 +	    auth_finished(ap, AUTH_REJECT);
 +	    if (auth_debug_mode)
 +		printf("Kerberos V5: "
 +		       "krb5_auth_con_getkey failed (%s)\r\n",
 +		       krb5_get_err_text(context, ret));
 +	    return;
 +	}
 +	if (key_block == NULL) {
 +	    Data(ap, KRB_REJECT, "no subkey received", -1);
 +	    auth_finished(ap, AUTH_REJECT);
 +	    if (auth_debug_mode)
 +		printf("Kerberos V5: "
 +		       "krb5_auth_con_getremotesubkey returned NULL key\r\n");
  	    return;
  	}
  
 diff -ur crypto/telnet.orig/libtelnet/krb4encpwd.c crypto/telnet/libtelnet/krb4encpwd.c
 --- crypto/telnet.orig/libtelnet/krb4encpwd.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/krb4encpwd.c	Thu Jan  2 18:06:52 2003
 @@ -146,7 +146,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  	int
 diff -ur crypto/telnet.orig/libtelnet/misc-proto.h crypto/telnet/libtelnet/misc-proto.h
 --- crypto/telnet.orig/libtelnet/misc-proto.h	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/misc-proto.h	Thu Jan  2 18:06:52 2003
 @@ -71,7 +71,7 @@
  /*
   * These functions are imported from the application
   */
 -int net_write(unsigned char *, int);
 +int telnet_net_write(unsigned char *, int);
  void net_encrypt(void);
  int telnet_spin(void);
  char *telnet_getenv(char *);
 diff -ur crypto/telnet.orig/libtelnet/rsaencpwd.c crypto/telnet/libtelnet/rsaencpwd.c
 --- crypto/telnet.orig/libtelnet/rsaencpwd.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/rsaencpwd.c	Thu Jan  2 18:06:52 2003
 @@ -142,7 +142,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  	int
 diff -ur crypto/telnet.orig/libtelnet/sra.c crypto/telnet/libtelnet/sra.c
 --- crypto/telnet.orig/libtelnet/sra.c	Thu May 16 10:46:49 2002
 +++ crypto/telnet/libtelnet/sra.c	Thu Jan  2 18:06:53 2003
 @@ -106,7 +106,7 @@
          *p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -        return(net_write(str_data, p - str_data));
 +        return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 diff -ur crypto/telnet.orig/telnet/authenc.c crypto/telnet/telnet/authenc.c
 --- crypto/telnet.orig/telnet/authenc.c	Sat Apr 13 12:59:08 2002
 +++ crypto/telnet/telnet/authenc.c	Thu Jan  2 18:06:53 2003
 @@ -55,7 +55,7 @@
  #include "types.h"
  
  int
 -net_write(unsigned char *str, int len)
 +telnet_net_write(unsigned char *str, int len)
  {
  	if (NETROOM() > len) {
  		ring_supply_data(&netoring, str, len);
 diff -ur crypto/telnet.orig/telnetd/authenc.c crypto/telnet/telnetd/authenc.c
 --- crypto/telnet.orig/telnetd/authenc.c	Sat Apr 13 12:59:08 2002
 +++ crypto/telnet/telnetd/authenc.c	Thu Jan  2 18:06:54 2003
 @@ -47,7 +47,7 @@
  #include <libtelnet/misc.h>
  
  int
 -net_write(unsigned char *str, int len)
 +telnet_net_write(unsigned char *str, int len)
  {
  	if (nfrontp + len < netobuf + BUFSIZ) {
  		output_datalen(str, len);
 
 --------------D1C7367BBBD2CF5FAB51F35F--
 

From: Bjorn Gronvall <bg@effnet.com>
To: freebsd-gnats-submit@FreeBSD.org, ari.suutari@syncrontech.com,
	roam@ringlet.net, bug-followup@FreeBSD.org, markm@FreeBSD.org
Cc:  
Subject: Re: bin/45397: Telnet dumps core when MAKE_KERBEROS5=yes is enabled
Date: Thu, 02 Jan 2003 20:16:36 +0100

 This is a multi-part message in MIME format.
 --------------D1C7367BBBD2CF5FAB51F35F
 Content-Type: text/plain; charset=iso-8859-1
 Content-Transfer-Encoding: 8bit
 
 This patch also renames net_write to telnet_net_write (as Peter
 suggested). It also includes changes to
 crypto/telnet/libtelnet/kerberos5.c to ensure that subkeys are
 properly used (incorporated from heimdal).
 
 After these two changes my telnet and telnetd interoperates
 correctly with the heimdal ditos and and also with the old
 FreeBSD telnetd.
 
 Cheers,
 Bjrn
 --------------D1C7367BBBD2CF5FAB51F35F
 Content-Type: text/plain; charset=us-ascii;
  name="telnet.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="telnet.patch"
 
 diff -ur crypto/telnet.orig/libtelnet/auth.c crypto/telnet/libtelnet/auth.c
 --- crypto/telnet.orig/libtelnet/auth.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/auth.c	Thu Jan  2 18:06:48 2003
 @@ -359,7 +359,7 @@
  		}
  		*e++ = IAC;
  		*e++ = SE;
 -		net_write(str_request, e - str_request);
 +		telnet_net_write(str_request, e - str_request);
  		printsub('>', &str_request[2], e - str_request - 2);
  	}
  }
 @@ -444,7 +444,7 @@
  		}
  		auth_send_data += 2;
  	}
 -	net_write(str_none, sizeof(str_none));
 +	telnet_net_write(str_none, sizeof(str_none));
  	printsub('>', &str_none[2], sizeof(str_none) - 2);
  	if (auth_debug_mode)
  		printf(">>>%s: Sent failure message\r\n", Name);
 @@ -537,7 +537,7 @@
  	}
  	*e++ = IAC;
  	*e++ = SE;
 -	net_write(str_request, e - str_request);
 +	telnet_net_write(str_request, e - str_request);
  	printsub('>', &str_request[2], e - &str_request[2]);
  	return(1);
  }
 diff -ur crypto/telnet.orig/libtelnet/enc_des.c crypto/telnet/libtelnet/enc_des.c
 --- crypto/telnet.orig/libtelnet/enc_des.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/enc_des.c	Thu Jan  2 18:06:50 2003
 @@ -225,7 +225,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  		break;
  	default:
  		return(FAILED);
 @@ -284,7 +284,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  
  		state = fbp->state[DIR_DECRYPT-1] = IN_PROGRESS;
  		break;
 @@ -309,7 +309,7 @@
  		*p++ = IAC;
  		*p++ = SE;
  		printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]);
 -		net_write(fbp->fb_feed, p - fbp->fb_feed);
 +		telnet_net_write(fbp->fb_feed, p - fbp->fb_feed);
  
  		break;
  	}
 diff -ur crypto/telnet.orig/libtelnet/encrypt.c crypto/telnet/libtelnet/encrypt.c
 --- crypto/telnet.orig/libtelnet/encrypt.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/encrypt.c	Thu Jan  2 18:06:50 2003
 @@ -427,7 +427,7 @@
  		 */
  		if (!Server && autodecrypt)
  			encrypt_send_request_start();
 -		net_write(str_send, str_suplen);
 +		telnet_net_write(str_send, str_suplen);
  		printsub('>', &str_send[2], str_suplen - 2);
  		str_suplen = 0;
  	}
 @@ -773,7 +773,7 @@
  	}
  	*strp++ = IAC;
  	*strp++ = SE;
 -	net_write(str_keyid, strp - str_keyid);
 +	telnet_net_write(str_keyid, strp - str_keyid);
  	printsub('>', &str_keyid[2], strp - str_keyid - 2);
  }
  
 @@ -832,7 +832,7 @@
  	}
  	*p++ = IAC;
  	*p++ = SE;
 -	net_write(str_start, p - str_start);
 +	telnet_net_write(str_start, p - str_start);
  	net_encrypt();
  	printsub('>', &str_start[2], p - &str_start[2]);
  	/*
 @@ -858,7 +858,7 @@
  		return;
  
  	str_end[3] = ENCRYPT_END;
 -	net_write(str_end, sizeof(str_end));
 +	telnet_net_write(str_end, sizeof(str_end));
  	net_encrypt();
  	printsub('>', &str_end[2], sizeof(str_end) - 2);
  	/*
 @@ -886,7 +886,7 @@
  	}
  	*p++ = IAC;
  	*p++ = SE;
 -	net_write(str_start, p - str_start);
 +	telnet_net_write(str_start, p - str_start);
  	printsub('>', &str_start[2], p - &str_start[2]);
  	if (encrypt_debug_mode)
  		printf(">>>%s: Request input to be encrypted\r\n", Name);
 @@ -896,7 +896,7 @@
  encrypt_send_request_end(void)
  {
  	str_end[3] = ENCRYPT_REQEND;
 -	net_write(str_end, sizeof(str_end));
 +	telnet_net_write(str_end, sizeof(str_end));
  	printsub('>', &str_end[2], sizeof(str_end) - 2);
  
  	if (encrypt_debug_mode)
 diff -ur crypto/telnet.orig/libtelnet/kerberos.c crypto/telnet/libtelnet/kerberos.c
 --- crypto/telnet.orig/libtelnet/kerberos.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/kerberos.c	Thu Jan  2 18:06:51 2003
 @@ -126,7 +126,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 diff -ur crypto/telnet.orig/libtelnet/kerberos5.c crypto/telnet/libtelnet/kerberos5.c
 --- crypto/telnet.orig/libtelnet/kerberos5.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/kerberos5.c	Thu Jan  2 18:06:51 2003
 @@ -128,7 +128,7 @@
      *p++ = SE;
      if (str_data[3] == TELQUAL_IS)
  	printsub('>', &str_data[2], p - &str_data[2]);
 -    return(net_write(str_data, p - str_data));
 +    return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 @@ -193,6 +193,8 @@
      else
  	ap_opts = 0;
      
 +    ap_opts |= AP_OPTS_USE_SUBKEY;
 +
      ret = krb5_auth_con_init (context, &auth_context);
      if (ret) {
  	if (auth_debug_mode) {
 @@ -406,6 +408,29 @@
  		printf("Kerberos V5: "
  		       "krb5_auth_con_getremotesubkey failed (%s)\r\n",
  		       krb5_get_err_text(context, ret));
 +	    return;
 +	}
 +
 +	if (key_block == NULL) {
 +	    ret = krb5_auth_con_getkey(context,
 +				       auth_context,
 +				       &key_block);
 +	}
 +	if (ret) {
 +	    Data(ap, KRB_REJECT, "krb5_auth_con_getkey failed", -1);
 +	    auth_finished(ap, AUTH_REJECT);
 +	    if (auth_debug_mode)
 +		printf("Kerberos V5: "
 +		       "krb5_auth_con_getkey failed (%s)\r\n",
 +		       krb5_get_err_text(context, ret));
 +	    return;
 +	}
 +	if (key_block == NULL) {
 +	    Data(ap, KRB_REJECT, "no subkey received", -1);
 +	    auth_finished(ap, AUTH_REJECT);
 +	    if (auth_debug_mode)
 +		printf("Kerberos V5: "
 +		       "krb5_auth_con_getremotesubkey returned NULL key\r\n");
  	    return;
  	}
  
 diff -ur crypto/telnet.orig/libtelnet/krb4encpwd.c crypto/telnet/libtelnet/krb4encpwd.c
 --- crypto/telnet.orig/libtelnet/krb4encpwd.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/krb4encpwd.c	Thu Jan  2 18:06:52 2003
 @@ -146,7 +146,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  	int
 diff -ur crypto/telnet.orig/libtelnet/misc-proto.h crypto/telnet/libtelnet/misc-proto.h
 --- crypto/telnet.orig/libtelnet/misc-proto.h	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/misc-proto.h	Thu Jan  2 18:06:52 2003
 @@ -71,7 +71,7 @@
  /*
   * These functions are imported from the application
   */
 -int net_write(unsigned char *, int);
 +int telnet_net_write(unsigned char *, int);
  void net_encrypt(void);
  int telnet_spin(void);
  char *telnet_getenv(char *);
 diff -ur crypto/telnet.orig/libtelnet/rsaencpwd.c crypto/telnet/libtelnet/rsaencpwd.c
 --- crypto/telnet.orig/libtelnet/rsaencpwd.c	Sat Apr 13 12:59:07 2002
 +++ crypto/telnet/libtelnet/rsaencpwd.c	Thu Jan  2 18:06:52 2003
 @@ -142,7 +142,7 @@
  	*p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -	return(net_write(str_data, p - str_data));
 +	return(telnet_net_write(str_data, p - str_data));
  }
  
  	int
 diff -ur crypto/telnet.orig/libtelnet/sra.c crypto/telnet/libtelnet/sra.c
 --- crypto/telnet.orig/libtelnet/sra.c	Thu May 16 10:46:49 2002
 +++ crypto/telnet/libtelnet/sra.c	Thu Jan  2 18:06:53 2003
 @@ -106,7 +106,7 @@
          *p++ = SE;
  	if (str_data[3] == TELQUAL_IS)
  		printsub('>', &str_data[2], p - (&str_data[2]));
 -        return(net_write(str_data, p - str_data));
 +        return(telnet_net_write(str_data, p - str_data));
  }
  
  int
 diff -ur crypto/telnet.orig/telnet/authenc.c crypto/telnet/telnet/authenc.c
 --- crypto/telnet.orig/telnet/authenc.c	Sat Apr 13 12:59:08 2002
 +++ crypto/telnet/telnet/authenc.c	Thu Jan  2 18:06:53 2003
 @@ -55,7 +55,7 @@
  #include "types.h"
  
  int
 -net_write(unsigned char *str, int len)
 +telnet_net_write(unsigned char *str, int len)
  {
  	if (NETROOM() > len) {
  		ring_supply_data(&netoring, str, len);
 diff -ur crypto/telnet.orig/telnetd/authenc.c crypto/telnet/telnetd/authenc.c
 --- crypto/telnet.orig/telnetd/authenc.c	Sat Apr 13 12:59:08 2002
 +++ crypto/telnet/telnetd/authenc.c	Thu Jan  2 18:06:54 2003
 @@ -47,7 +47,7 @@
  #include <libtelnet/misc.h>
  
  int
 -net_write(unsigned char *str, int len)
 +telnet_net_write(unsigned char *str, int len)
  {
  	if (nfrontp + len < netobuf + BUFSIZ) {
  		output_datalen(str, len);
 
 --------------D1C7367BBBD2CF5FAB51F35F--
 

From: Bjorn Gronvall <bg@sics.se>
To: freebsd-gnats-submit@FreeBSD.org, ari.suutari@syncrontech.com
Cc:  
Subject: Re: bin/45397: Telnet dumps core when MAKE_KERBEROS5=yes is enabled
Date: Thu, 02 Jan 2003 20:29:53 +0100

 There is no user bg@effnet.com!
 
 Please reply to bg@sics.se.
 
 Sorry for the inconvenience,
 Bjrn
Responsible-Changed-From-To: freebsd-bugs->nectar 
Responsible-Changed-By: nectar 
Responsible-Changed-When: Tue Feb 4 19:11:42 PST 2003 
Responsible-Changed-Why:  
I'll look at this while I'm overhauling the rest of the Kerberos 5 
stuff. 

Hmm, this sounds very familiar ... I thought I already fixed this 
bug (net_(read|write) symbol conflict with libroken). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=45397 
State-Changed-From-To: open->closed 
State-Changed-By: nectar 
State-Changed-When: Fri Jan 9 05:46:26 PST 2004 
State-Changed-Why:  
This was fixed prior to FreeBSD 4.9: 

nectar      2003/04/24 12:14:00 PDT 

FreeBSD src repository 

Modified files:        (Branch: RELENG_4) 
crypto/telnet/libtelnet kerberos5.c  
kerberos5/lib/libtelnet Makefile  
kerberos5/libexec/telnetd Makefile  
kerberos5/usr.bin/telnet Makefile  
Log: 
MFC 1.7  src/crypto/telnet/libtelnet/kerberos5.c 
1.17 src/kerberos5/lib/libtelnet/Makefile 
1.16 src/kerberos5/libexec/telnetd/Makefile 
1.17 src/kerberos5/usr.bin/telnet/Makefile: 
Unbreak Kerberos 5 authentication in telnet. 

Requested by:   Tim Kientzle <kientzle@acm.org> 

Revision     Changes    Path 
1.1.1.1.8.2  +25 -1     src/crypto/telnet/libtelnet/kerberos5.c 
1.14.2.4     +1 -0      src/kerberos5/lib/libtelnet/Makefile 
1.15.2.2     +1 -1      src/kerberos5/libexec/telnetd/Makefile 
1.16.2.2     +1 -1      src/kerberos5/usr.bin/telnet/Makefile 


http://www.freebsd.org/cgi/query-pr.cgi?pr=45397 
>Unformatted:
