[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Potential Dialnet disaster ($$$)



In Symbolics 3650 Genera 7.1, Mailer 5.13, Print Spooler 3.10,
IP Domain Name Server 4.7, IP-TCP 52.16, ILA-NFS 3.1, ILA 3.0,
microcode 3650-MIC 396, FEP 206, Fep0:>g206-lisp.flod(14),
Fep0:>g206-loaders.flod(14), Fep0:>g206-info.flod(14),
Fep0:>g206-debug.flod(4), Machine serial number 30241,
Make carry-tape a bit less losing. (from ILA:SITE;CARRY-TAPE-FIXES.LISP.1),
Allow distribution tapes to be made when there are links (from ILA:SITE;DISTRIBUTION.LISP.1),
Add a special variable PRINT::*BANNER?* to control printing of banner on LGP2 and LGP1 (from ILA:SITE;NO-BANNER.LISP.1),
Allow a proceed type to skip file if it is a link to a directory (from ILA:SITE;DUMP-ONE-FILE.LISP.1),
Define the SERIAL-PSEUDONET medium to take the correct number of arguments. (from ILA:SITE;SERIAL-PSEUDONET.LISP.1),
Fix Dialnet acknowledgment bug (from F:>File-Server>Fix-Dialnet-Brain-Damage.lisp.1), on F:

Dear SLUGgers:

I have found a potentially disastrous bug in Dialnet which has been
biting various users of that facility for some months.  The symptom is
that you try to use Dialnet, say for mail transfer, and it hangs in such
a way that it leaves the telephone connection open, sometimes for hours
at a time.  The various timeout mechanisms in the Mailer and so forth do
not take care of this case, because they only work after the connection
is established.  This bug happens in the middle of establishing the
connection, after the low-level phone line is connected but before you
can successfully talk at the Mailer level.

This bug is also present in the release 6 versions of Dialnet, as well
as the 7.0 version.  The fix is similar; the text will be slightly
different because of the flavor syntax changes between release 6 and
Genera 7.x.  The change is a one-symbol change in the
1:transmit-output-segment0 method of 1dial:dialnet-interface0.  Here is the
full text of the patch file which fixes the bug.  The change is in the
second line: the "AND" is "OR" in the original code.

-- Richard Lamson, Consultant
   International Lisp Associates
   One Kendall Square, Cambridge, Mass. 02139

;;; -*- Mode: LISP; Syntax: Common-Lisp; Package: ZL-USER; Base: 10; Patch-File: T -*-
;;; Patch file for Private version 0.0
;;; Reason: Function (FLAVOR:METHOD :TRANSMIT-OUTPUT-SEGMENT DIAL:DIALNET-INTERFACE):  Make sure you send
;;; data even if the other end wants just an acknowledgment (this will also send an ACK).
;;; Written by File-Server, 5/13/87 17:15:22
;;; while running on F from FEP0:>ila-7-1-a-ila-server.load.1
;;; with Genera 7.1, Mailer 5.13, Print Spooler 3.10, IP Domain Name Server 4.7,
;;; IP-TCP 52.16, ILA-NFS 3.1, ILA 3.0, microcode 3650-MIC 396, FEP 206,
;;; Fep0:>g206-lisp.flod(14), Fep0:>g206-loaders.flod(14), Fep0:>g206-info.flod(14),
;;; Fep0:>g206-debug.flod(4), Machine serial number 30241,
;;; Make carry-tape a bit less losing. (from ILA:SITE;CARRY-TAPE-FIXES.LISP.1),
;;; Allow distribution tapes to be made when there are links (from ILA:SITE;DISTRIBUTION.LISP.1),
;;; Add a special variable PRINT::*BANNER?* to control printing of banner on LGP2 and LGP1 (from ILA:SITE;NO-BANNER.LISP.1),
;;; Allow a proceed type to skip file if it is a link to a directory (from ILA:SITE;DUMP-ONE-FILE.LISP.1),
;;; Define the SERIAL-PSEUDONET medium to take the correct number of arguments. (from ILA:SITE;SERIAL-PSEUDONET.LISP.1).


(NOTE-PRIVATE-PATCH "Fix Dialnet acknowledgment bug")


;=====================================
(SYSTEM-INTERNALS:BEGIN-PATCH-SECTION)
; From buffer stream.lisp >sys>r7>dialnet F: (163)
(SYSTEM-INTERNALS:PATCH-SECTION-ATTRIBUTES
  "-*- Mode: LISP; Package: DIAL; Base: 8 -*-")

;;; Transmit side, control process
(DEFMETHOD (:TRANSMIT-OUTPUT-SEGMENT DIALNET-INTERFACE) ()
  (LET* ((SEND-NO-DATA (AND (NOT OUTPUT-BUFFER-BEING-TRANSMITTED)     ; was OR, now AND
                                  (EQ FORCE-TRANSMISSION :ACK)))
           (CONTROL (IF SEND-NO-DATA
                          (DPB 1 %%SEGMENT-CONTROL 0)
                          (AREF OUTPUT-BUFFER 0))))
    (SETQ CONTROL (DPB INPUT-SEQUENCE-NUMBER %%SEGMENT-SEQUENCE-EXPECTED CONTROL))
    (WHEN (ZEROP (AREF *PARITY* CONTROL))
      (SETQ CONTROL (DPB 1 %%SEGMENT-PARITY CONTROL)))
    (IF SEND-NO-DATA
          (SEND RAW-STREAM :TYO CONTROL)
      (UNLESS FORCE-TRANSMISSION
          (INCF RETRANSMISSIONS))
      (ASET CONTROL OUTPUT-BUFFER 0)
      (SEND RAW-STREAM :STRING-OUT OUTPUT-BUFFER 0 (+ (AREF OUTPUT-BUFFER 1) 3)))
    (SEND RAW-STREAM :FORCE-OUTPUT))
  (SETQ FORCE-TRANSMISSION NIL
          LAST-TRANSMIT-TIME (TIME))
  (WHEN *DIALNET-TRACE-STREAM*
    (FORMAT *DIALNET-TRACE-STREAM* "~&~A~30TXMT ~S ~O" SELF OUTPUT-BUFFER-BEING-TRANSMITTED
              LAST-TRANSMIT-TIME)))