• zhaozhao.zz's avatar
    networking: fix unexpected negative or zero readlen · 2eed31a5
    zhaozhao.zz authored
    To avoid copying buffers to create a large Redis Object which
    exceeding PROTO_IOBUF_LEN 32KB, we just read the remaining data
    we need, which may less than PROTO_IOBUF_LEN. But the remaining
    len may be zero, if the bulklen+2 equals sdslen(c->querybuf),
    in client pause context.
    
    For example:
    
    Time1:
    
    python
    >>> import os, socket
    >>> server="127.0.0.1"
    >>> port=6379
    >>> data1="*3\r\n$3\r\nset\r\n$1\r\na\r\n$33000\r\n"
    >>> data2="".join("x" for _ in range(33000)) + "\r\n"
    >>> data3="\n\n"
    >>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    >>> s.settimeout(10)
    >>> s.connect((server, port))
    >>> s.send(data1)
    28
    
    Time2:
    
    redis-cli client pause 10000
    
    Time3:
    
    >>> s.send(data2)
    33002
    >>> s.send(data3)
    2
    >>> s.send(data3)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    socket.error: [Errno 104] Connection reset by peer
    
    To fix that, we should check if remaining is greater than zero.
    2eed31a5
networking.c 82.6 KB