Skip to content

Commit 625f29e

Browse files
[PR aio-libs#12265/b5a51707 backport][3.13] Avoid accessing Py_buffer after release in HTTP parser (aio-libs#12269)
Co-authored-by: Dexter.k <164054284+rootvector2@users.noreply.github.com>
1 parent 5279fbd commit 625f29e

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

aiohttp/_http_parser.pyx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -556,20 +556,23 @@ cdef class HttpParser:
556556
cdef:
557557
size_t data_len
558558
size_t nb
559+
char* base
559560
cdef cparser.llhttp_errno_t errno
560561

561562
PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE)
563+
# Cache buffer pointer before PyBuffer_Release to avoid use-after-release.
564+
base = <char*>self.py_buf.buf
562565
data_len = <size_t>self.py_buf.len
563566

564567
errno = cparser.llhttp_execute(
565568
self._cparser,
566-
<char*>self.py_buf.buf,
569+
base,
567570
data_len)
568571

569572
if errno is cparser.HPE_PAUSED_UPGRADE:
570573
cparser.llhttp_resume_after_upgrade(self._cparser)
571574

572-
nb = cparser.llhttp_get_error_pos(self._cparser) - <char*>self.py_buf.buf
575+
nb = cparser.llhttp_get_error_pos(self._cparser) - base
573576

574577
PyBuffer_Release(&self.py_buf)
575578

@@ -580,7 +583,7 @@ cdef class HttpParser:
580583
self._last_error = None
581584
else:
582585
after = cparser.llhttp_get_error_pos(self._cparser)
583-
before = data[:after - <char*>self.py_buf.buf]
586+
before = data[:after - base]
584587
after_b = after.split(b"\r\n", 1)[0]
585588
before = before.rsplit(b"\r\n", 1)[-1]
586589
data = before + after_b

0 commit comments

Comments
 (0)