Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site ccivax.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!panda!talcott!harvard!seismo!rochester!ritcv!ccivax!crp From: crp@ccivax.UUCP (Chuck Privitera) Newsgroups: net.bugs.uucp,net.bugs.4bsd Subject: Uucp incorrectly chooses 't' protocol (1 of 2) Message-ID: <242@ccivax.UUCP> Date: Wed, 1-May-85 14:09:08 EDT Article-I.D.: ccivax.242 Posted: Wed May 1 14:09:08 1985 Date-Received: Fri, 3-May-85 04:47:25 EDT Distribution: net Organization: CCI Telephony Systems Group, Rochester NY Lines: 90 Xref: watmath net.bugs.uucp:521 net.bugs.4bsd:1488 Index: usr.bin/uucp/cico.c 4.2BSD FIX Description: The (self proclaimed kludgy) IsTcpIp flag is initialized in uucpdefs.[ch] (depending on what version of uucp you have) to 0 and in cico.c to 1 if the line is determined to be to a TCP/IP host. However, once it is set to 1, it never gets cleared. Thus, running the uucp queue with jobs queued to TCP/IP machines as well as to non-TCP/IP machines AND the TCP/IP machine(s) get called first, when uucico gets to the non-TCP/IP machine it will incorrectly choose the 't' protocol (if the other machine supports it). Repeat-By: Queue a job to a tcp/ip host and to a non-tcp/ip host such that the non-tcp/ip site will be called last. If you don't talk to any TCP/IP machines, you can add a line like: Localhost Any TCP uucp Localhost login: uucp To your L.sys file and a line like: TCP ttyXX unused 9600 TCP To your L-devices file. Then queue something to Localhost (or whatever) and to a non-tcp/ip machine (who is gauranteed to be called second, and supports the 't' protocol) with uucp -r so the job is only queued. Then run uucico by hand with debugging turned on so you can see the protocol selection and everything. Notice that the 't' protocol will also be selected for the non-tcp/ip site. If the non-tcp/ip site has a version of the 't' protocol compatible with yours (there was a substantial change to the 't' protocol sometime around last July), the conversation will probably succeed, if not you will probably get a core dump in trddata() (because previously the total transmission byte count was sent at the beginning of the conversation, and now a byte count is sent at the front of each buffer). Even if the conversation goes OK, the integrity of the data cannot be guaranteed because nobody was checking for integrity (normally, the 'g' protocol or TCP ensures data integrity, but TCP wasn't really the transport mechanism, the tty driver was.) Fix: The fix is simple, just explicitly reset the IsTcpIp flag if it is determined that the new connection is to a non-tcp/ip site. A diff listing of the old and new code follows (line numbers are probably off). See the next article to find out what you can do to protect yourself from remote sites with this problem. RCS file: RCS/cico.c,v retrieving revision 1.30 diff -c3 -r1.30 cico.c *** /tmp/,RCSt1003841 Wed May 1 14:07:27 1985 --- cico.c Wed May 1 10:47:01 1985 *************** *** 1,5 #ifndef lint ! static char *RcsId = "@(#) $Header: cico.c,v 1.30 85/03/17 17:42:51 rick Exp $"; /* from: @(#)cico.c 5.3 (Berkeley) 10/3/83 */ #endif !lint --- 1,5 ----- #ifndef lint ! static char *RcsId = "@(#) $Header: cico.c,v 1.31 85/05/01 10:42:33 root Exp $"; /* from: @(#)cico.c 5.3 (Berkeley) 10/3/83 */ #endif !lint *************** *** 499,505 if (isatty(Ifn) == 0) { IsTcpIp = 1; DEBUG(4, "TCPIP connection -- ioctl-s disabled\n", CNULL); ! } #endif if (setjmp(Sjbuf)) --- 499,506 ----- if (isatty(Ifn) == 0) { IsTcpIp = 1; DEBUG(4, "TCPIP connection -- ioctl-s disabled\n", CNULL); ! } else ! IsTcpIp = 0; #endif if (setjmp(Sjbuf))