[net.unix-wizards] sundry 4.2 bugs

RWS%mit-xx@sri-unix.UUCP (11/03/83)

Despite claims to the contrary, the block number sign extension problem still
exists.  Berkeley put in a fix that should have worked, but a C compiler bug
apparently keeps it from working.  In /sys/sys/vm_mem.c in memall() the code
      swapdev : mount[c->c_mdev].m_dev, (daddr_t)(u_long)c->c_blkno
should be changed to
      swapdev : mount[c->c_mdev].m_dev, c->c_blkno
and in /sys/vax/vm_machdep.c in chgprot() the code
          munhash(mount[c->c_mdev].m_dev, (daddr_t)(u_long)c->c_blkno);
should be changed to
          munhash(mount[c->c_mdev].m_dev, c->c_blkno);
because the C compiler apparently incorrectly folds the (daddr_t) and (u_long)
together and sign extends anyway.  Simply taking out the (daddr_t)(u_long)
works, although lint will probably complain about it.

There is a magic number (0x3ffff8) representing USRSTACK/NBPG built in to
Fastreclaim in /sys/vax/locore.s.  However, USRSTACK depends on UPAGES,
so this magic number has UPAGES=8 built in, which is bogus.  If you change
UPAGES, your system will panic: trap.  The fix
is to change
          subl3     P_SSIZE(r5),$0x3ffff8,r0
to
          subl3     P_SSIZE(r5),$(0x400000-UPAGES),r0
and to change
          subl2     $(0x3ffff8+UPAGES),r4
to
          subl2     $0x400000,r4

UDP checksumming is turned off, and with good cause, since bad checksums
are produced on output.  In /sys/netinet/udp_usrreq.c in udp_output(),
the code
          ui->ui_ulen = htons((u_short)ui->ui_len);
should be changed to
          ui->ui_len = htons((u_short)ui->ui_len);
          ui->ui_ulen = ui->ui_len;
Then
          int       udpcksum;
can be changed to
          int       udpcksum = 1;


In /sys/netinet/tcp_input.c in tcp_intput(), the code
                    sbdrop(&so->so_snd, so->so_snd.sb_cc);
                    tp->snd_wnd -= so->so_snd.sb_cc;
should be
                    tp->snd_wnd -= so->so_snd.sb_cc;
                    sbdrop(&so->so_snd, so->so_snd.sb_cc);

In /sys/netinet/tcp_output.c in tcp_output() the code
          if (SEQ_GT(tp->snd_nxt, tp->snd_max))
                    tp->snd_max = tp->snd_nxt;
          if (SEQ_GT(tp->snd_nxt, tp->snd_max) && tp->t_rtt == 0) {
                    tp->t_rtt = 1;
                    tp->t_rtseq = tp->snd_nxt - len;
          }
should be
          if (SEQ_GT(tp->snd_nxt, tp->snd_max)) {
                    tp->snd_max = tp->snd_nxt;
                    if (tp->t_rtt == 0) {
                              tp->t_rtt = 1;
                              tp->t_rtseq = tp->snd_nxt - len;
                    }
          }

-------

cak@PURDUE.ARPA (11/03/83)

From:  Christopher A Kent <cak@PURDUE.ARPA>

Berkeley seems to be uninterested in supporting its "clients" in any
way any more. It used to be that you could get hold of the bug reports,
IF you knew the right person to get onto the mailing list; even that
has gone away. Now, we can only hope that reported bugs make it into
the ever-awaited next release.

On the other hand, bug reports that only exist in Unix-Wizards don't
always seem to make it into said release. I would encourage all 4.2
hackers to send their fixes to Berkeley AND this list; I would further
encourage Berkeley to remail the bug fixes to a wider forum. I realize
that there are licensing problems, but I tend to believe that this is a
very thin shroud that is being hidden behind; we all know about
public-key encrytion now; implementations exist for Unix, and there is
no reason that a registered letter with a password couldn't be
exchanged between UCB and licensees, and bug fixes mailed to registered
systems administrators on a regular basis.

I found the UDP problems in the 4.2 pre-release, too, but it seems that
they didn't make it back in time to make it onto the tape. tftp is
pretty much botched, too. I'm really tired of having to reinvent the
wheel again and again...

Cheers,
chris
----------