Skip to content

Commit acaf2ec

Browse files
committed
Fix dangling pointer in CSS selectors
1 parent 290174f commit acaf2ec

3 files changed

Lines changed: 7 additions & 1 deletion

File tree

selectolax/lexbor.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ cdef extern from "lexbor/css/css.h" nogil:
387387
lxb_css_parser_t * lxb_css_parser_create()
388388
lxb_status_t lxb_css_parser_init(lxb_css_parser_t *parser, lxb_css_syntax_tokenizer_t *tkz)
389389
lxb_css_parser_t * lxb_css_parser_destroy(lxb_css_parser_t *parser, bint self_destroy)
390+
void lxb_css_parser_clean(lxb_css_parser_t *parser)
390391
lxb_css_memory_t * lxb_css_memory_destroy(lxb_css_memory_t *memory, bint self_destroy)
391392
void lxb_css_selector_list_destroy_memory(lxb_css_selector_list_t *list)
392393

selectolax/lexbor.pyx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ cdef class LexborHTMLParser:
235235
self._selector = LexborCSSSelector()
236236
return self._selector
237237

238+
239+
238240
@property
239241
def root(self):
240242
"""Return the document root node.

selectolax/lexbor/selection.pxi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ cdef class LexborCSSSelector:
7070
self.results = []
7171
self.current_node = None
7272
lxb_css_selector_list_destroy_memory(selectors_list)
73+
self.parser.memory = NULL
7374
return results
7475

7576
cpdef int any_matches(self, str query, LexborNode node) except -1:
@@ -82,7 +83,7 @@ cdef class LexborCSSSelector:
8283
raise TypeError("Query must be a string.")
8384

8485
bytes_query = query.encode(_ENCODING)
85-
selectors_list = lxb_css_selectors_parse(self.parser, <lxb_char_t *> bytes_query, <size_t> len(query))
86+
selectors_list = lxb_css_selectors_parse(self.parser, <lxb_char_t *> bytes_query, <size_t> len(bytes_query))
8687

8788
if selectors_list == NULL:
8889
PyErr_SetObject(SelectolaxError, "Can't parse CSS selector.")
@@ -93,12 +94,14 @@ cdef class LexborCSSSelector:
9394
<lxb_selectors_cb_f> css_matcher_callback, <void *> self)
9495
if status != LXB_STATUS_OK:
9596
lxb_css_selector_list_destroy_memory(selectors_list)
97+
self.parser.memory = NULL
9698
PyErr_SetObject(SelectolaxError, "Can't parse CSS selector.")
9799
return -1
98100

99101
result = PyList_GET_SIZE(self.results) > 0
100102
self.results = []
101103
lxb_css_selector_list_destroy_memory(selectors_list)
104+
self.parser.memory = NULL
102105
return result
103106

104107
def __dealloc__(self):

0 commit comments

Comments
 (0)