Known bug, I'm afraid.  The fix is something like the appended patch
from Felix Schroeter.
-- 
Ian Taylor | ian@airs.com | First to identify quote wins free e-mail message:
``According to [this theory], when [light] reaches the retina, it beats on it,
and, for example, 483B beats a second give red, 727B beats violet, and so on.
So those who are color-blind are those who cannot count the beats, I suppose!''
--- unix/serial.c.orig	Wed Oct 20 18:51:06 1999
+++ unix/serial.c	Wed Oct 20 19:05:19 1999
@@ -2371,8 +2371,17 @@
 	  else
 	    csleepchars = MAX_INPUT - 10;
 
+#ifndef BUG
+	  if (q->ibaud) {
+	    isleep = (int) (((long)  csleepchars * 10000L) / q->ibaud);
+	    isleep -= 10;
+	  } else {
+	    isleep = 1000; /* I hope, a second is right... */
+	  }
+#else
 	  isleep = (int) (((long) csleepchars * 10000L) / q->ibaud);
 	  isleep -= 10;
+#endif
 
 	  if (isleep > 10)
 	    {
@@ -2773,9 +2782,20 @@
 	                        / baud bits/sec)
 			       * 10 bits/byte)
 	     */
+#ifndef BUG
+	  if (q->ibaud) {
+	    stime.tv_sec = (long) 10240 / q->ibaud;
+	    stime.tv_usec = ((((long) 1024000000 / q->ibaud) * (long) 10)
+			     % (long) 1000000);
+	  } else {
+	     stime.tv_sec = 1;
+	     stime.tv_usec = 0;
+	  }
+#else
 	  stime.tv_sec = (long) 10240 / q->ibaud;
 	  stime.tv_usec = ((((long) 1024000000 / q->ibaud) * (long) 10)
 			   % (long) 1000000);
+#endif
 
 	  imask = 1 << q->o;
 	  if (imask == 0)
@@ -2846,7 +2866,14 @@
                  we don't need to use the catch stuff, since we know
                  that HAVE_RESTARTABLE_SYSCALLS is 0.  */
 	      usset_signal (SIGALRM, usalarm, TRUE, (boolean *) NULL);
+#ifndef BUG
+	     if (q->ibaud)
+               alarm ((int) ((long) 10240 / q->ibaud) + 1);
+             else
+               alarm (1);
+#else
 	      alarm ((int) ((long) 10240 / q->ibaud) + 1);
+#endif
 
 	      /* There is a race condition here: on a severely loaded
                  system, we could get the alarm before we start the
