alibaba / xquic

XQUIC Library released by Alibaba is a cross-platform implementation of QUIC and HTTP/3 protocol.
Apache License 2.0
1.65k stars 326 forks source link

[Bug]: stream send中产生stream frame时计算有误 #281

Closed adcen0107 closed 1 year ago

adcen0107 commented 1 year ago

What happened?

xqc_frame_parser.c的xqc_gen_stream_frame函数中,size的计算有误。 if (!fin_only) { ssize_t n_avail;

    n_avail = dst_buf_len - (p + stream_id_len + offset_len - dst_buf);

    /* 
     * If we cannot fill remaining buffer, we need to include data
     * length.
     */
    if (size <= n_avail) {
        length_bits = xqc_vint_get_2bit(size);
        length_len = xqc_vint_len(length_bits);
        n_avail -= length_len;
        if (size > n_avail) {
            size = n_avail;
            fin = 0;
        }

    } else {
        /* length_len = 0; reserve ACK, must have length. */
        size = n_avail;
        length_bits = xqc_vint_get_2bit(size);
        length_len = xqc_vint_len(length_bits);
        fin = 0;
    }

    if (n_avail <= 0 || size > n_avail) {
        return -XQC_ENOBUF;
    }

    xqc_vint_write(p, stream_id, stream_id_bits, stream_id_len);
    p += stream_id_len;

    if (offset_len) {
        xqc_vint_write(p, offset, offset_bits, offset_len);
    }
    p += offset_len;

    memcpy(p + length_len, payload, size);
    *written_size = size;

    if (length_len) {
        xqc_vint_write(p, size, length_bits, length_len);
    }

    p += length_len + size;

} else {
     。。。

} 错误的size值会导致数据错乱,拷贝越界。

Steps To Reproduce

1、添加打印,将size,n_vail,offset_len,stream_id_len等全部打印; 2、stream send调用开始,观察xqc_gen_stream_frame的返回值,即可发现错误。

Relevant log output

No response