[comp.windows.x] STREAMSCONN writev/readv bug

randy@erik.UUCP (Randy Brown) (02/13/91)

This was posted to xbugs.

			  X Window System Bug Report
			    xbugs@expo.lcs.mit.edu


VERSION:
    R4

CLIENT MACHINE and OPERATING SYSTEM:
    any with -DSTREAMSCONN--first seen on Motorola Delta 3600 with
    Unix System V Release 3.0 version SVR5.

DISPLAY TYPE:
    irrelevant--first seen on a server connected through the loopback
    TCP/IP address 127.1, which used Streams on the cited OS.

WINDOW MANAGER:
    irrelevant

AREA:
    Xlib (./mit/lib/X/XlibInt.c)

SYNOPSIS:
    The routines in lib/X/XlibInt.c for emulation of readv/writev, 
    _XReadV() and _XWriteV(), can deliver data out of sequence when
    an error occurs, especially when blocking would occur.

DESCRIPTION:
    When the STREAMSCONN versions of readv/writev encounter an error in
    one of the individual reads or writes used to perform the emulation,
    instead of returning the number of bytes transferred so far, the 
    current iovec element is skipped.  No return occurs until all
    elements of iovec have been attempted.  Then the number of bytes
    (total) transferred is returned.  The next attempt at data transfer
    will begin at this offset from the beginning of the catenated data in
    the iovec;  some of this data may not have been transferred, and some
    of the data requested to be transferred may have been transferred
    previously.  

    As blocking (EWOULDBLOCK) is a common transitory error, it is
    particularly likely to evoke this bug.  During a large transfer, a
    stream can block and unblock several times, wreaking havoc with the
    data transmission.

REPEAT BY:
    This occurred when transferring an image large enough to cause
    blocking to occur by filling all available Streams data blocks.

SAMPLE FIX:
    
*** XlibInt.c-	Mon Dec 11 20:00:00 1989
--- XlibInt.c	Wed Sep 26 09:13:51 1990
***************
*** 1725,1731 ****
  		len -= rc;
  		size += rc;
  	    } else if (rc < 0) {
! 		break;
  	    }
  	}
      }
--- 1725,1735 ----
  		len -= rc;
  		size += rc;
  	    } else if (rc < 0) {
! #ifdef DEBUG
! 		if (i != n) 
! 		  fprintf (stderr, "_XReadV: avoiding sequence error\n" );
! #endif
! 		return (size > 0) ? size : rc;
  	    }
  	}
      }
***************
*** 1762,1768 ****
  		len -= rc;
  		size += rc;
  	    } else if (rc < 0) {
! 		break;
  	    }
  	}
      }
--- 1766,1776 ----
  		len -= rc;
  		size += rc;
  	    } else if (rc < 0) {
! #ifdef DEBUG
! 		if (i != n) 
! 		  fprintf (stderr, "_XWriteV: avoiding sequence error\n" );
! #endif
! 		return (size > 0) ? size : rc;
  	    }
  	}
      }

luj@gus19.ecn.purdue.edu (Jun Lu) (02/14/91)

In article <9102122238.AA18585@erik.uucp> randy@erik.UUCP (Randy Brown) writes:
>
>REPEAT BY:
>    This occurred when transferring an image large enough to cause
>    blocking to occur by filling all available Streams data blocks.

Great. It explains why I got server crashes when using xloadimage and 
hitting 'n' too quickly on a Sun3/sparc !
--
-- Jun Lu                          Internet:luj@ecn.purdue.edu          --
-- Aeronautics & Astronautics      Bitnet:  luj%ecn.purdue.edu@purccvm  --
-- Purdue University		   UUCP:    pur-ee!luj                  -- 
-- W. Lafayette, IN 47907          Phone:317-494-9410  Fax:317-494-0307 --