Date: Thu, 2 Jan 2003 11:20:04 -0800 (PST) From: Bjorn Gronvall <bg@effnet.com> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/45397: Telnet dumps core when MAKE_KERBEROS5=yes is enabled Message-ID: <200301021920.h02JK40B069513@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/45397; it has been noted by GNATS. 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, Björn --------------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-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200301021920.h02JK40B069513>