Closed adcen0107 closed 1 year ago
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值会导致数据错乱,拷贝越界。
1、添加打印,将size,n_vail,offset_len,stream_id_len等全部打印; 2、stream send调用开始,观察xqc_gen_stream_frame的返回值,即可发现错误。
No response
What happened?
xqc_frame_parser.c的xqc_gen_stream_frame函数中,size的计算有误。 if (!fin_only) { ssize_t n_avail;
} 错误的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