• Aaron Plattner's avatar
    os: Return BadLength instead of disconnecting BigReq clients (#4565) · 2ecd2a00
    Aaron Plattner authored
     Backported from X.org:
    
     commit 67c66606c760c263d7a4c2d1bba43ed6225a4e7c
     Author: Robert Morell <rmorell@nvidia.com>
     Date:   Thu May 9 13:09:02 2013 -0700
    
        os: Reset input buffer's 'ignoreBytes' field
    
        If a client sends a request larger than maxBigRequestSize, the server is
        supposed to ignore it.
    
        Before commit cf88363d, the server would simply disconnect the client.  After
        that commit, it attempts to gracefully ignore the request by remembering how
        long the client specified the request to be, and ignoring that many bytes.
        However, if a client sends a BigReq header with a large size and disconnects
        before actually sending the rest of the specified request, the server will
        reuse the ConnectionInput buffer without resetting the ignoreBytes field.  This
        makes the server ignore new X clients' requests.
    
        This fixes that behavior by resetting the ignoreBytes field when putting the
        ConnectionInput buffer back on the FreeInputs list.
    Signed-off-by: 's avatarRobert Morell <rmorell@nvidia.com>
    Reviewed-by: 's avatarPeter Hutterer <peter.hutterer@who-t.net>
    Signed-off-by: 's avatarPeter Hutterer <peter.hutterer@who-t.net>
    
     commit c80c41767eb101e9dbd8393d8cca7764b4e248a4
     Author: Aaron Plattner <aplattner@nvidia.com>
     Date:   Mon Oct 25 22:01:32 2010 -0700
    
        os: Fix BigReq ignoring when another request is pending
    
        Commit cf88363db0ebb42df7cc286b85d30d7898aea840 fixed the handling of
        BigReq requests that are way too large and handles the case where the
        read() syscall returns a short read.  However, it neglected to handle
        the case where it returns a long read, which happens when the client
        has another request in the queue after the bogus large one.
    
        Handle the long read case by subtracting the smaller of 'needed' and
        'gotnow' from oci->ignoreBytes.  If needed < gotnow, simply subtract
        the two, leaving gotnow equal to the number of extra bytes read.
        Since the code immediately following the (oci->ignoreBytes > 0) block
        tries to handle the next request, advance oci->bufptr immediately
        instead of setting oci->lenLastReq and letting the next call to
        ReadRequestFromClient do it.
    
        Fixes the XTS pChangeKeyboardMapping-3 test.
    
                 CASES TESTS  PASS UNSUP UNTST NOTIU  WARN   FIP  FAIL UNRES  UNIN ABORT
        -Xproto    122   389   367     2    19     0     0     0     1     0     0     0
        +Xproto    122   389   368     2    19     0     0     0     0     0     0     0
    Signed-off-by: 's avatarAaron Plattner <aplattner@nvidia.com>
    Reviewed-by: 's avatarAdam Jackson <ajax@redhat.com>
    Signed-off-by: 's avatarKeith Packard <keithp@keithp.com>
    
     commit cf88363db0ebb42df7cc286b85d30d7898aea840
     Author: Aaron Plattner <aplattner@nvidia.com>
     Date:   Fri Aug 27 10:20:29 2010 -0700
    
        os: Return BadLength instead of disconnecting BigReq clients (#4565)
    
        If a client sends a big request that's too big (i.e. bigger than
        maxBigRequestSize << 2 bytes), the server just disconnects it.  This makes the
        client receive SIGPIPE the next time it tries to send something.
    
        The X Test Suite sends requests that are too big when the test specifies the
        TOO_LONG test type.  When the client receives SIGPIPE, XTS marks it as
        UNRESOLVED, which counts as a failure.
    
        Instead, remember how long the request is supposed to be and then return that
        size.  Dispatch() checks the length and sends BadLength to the client.  Then,
        whenever oci->ignoreBytes is nonzero, ignore the data read instead of trying to
        process it as a request.
    Signed-off-by: 's avatarAaron Plattner <aplattner@nvidia.com>
    Reviewed-by: 's avatarKeith Packard <keithp@keithp.com>
    Signed-off-by: 's avatarKeith Packard <keithp@keithp.com>
    Backported-to-NX-by: 's avatarMike Gabriel <mike.gabriel@das-netzwerkteam.de>
    2ecd2a00
io.c 33.5 KB