File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments