Внутри моего расширения я вызываю php_pcre_match_impl напрямую
Код: Выделить всё
#include
#include
#include
#include
#include "swat.h"
PHP_FUNCTION(run) {
zval matched, matches;
ZEND_PARSE_PARAMETERS_NONE();
ZVAL_UNDEF(&matched);
array_init(&matches);
zend_string *pattern = zend_string_init(ZEND_STRL("/\\/page-[0-9]+/"), 0);
zend_string *subject = zend_string_init(ZEND_STRL("backend/product"), 0); // Valgrind stack trace error
pcre_cache_entry *pce = pcre_get_compiled_regex_cache(pattern);
if (!pce) {
zend_string_release(pattern);
zend_string_release(subject);
RETURN_FALSE;
}
php_pcre_match_impl(pce, subject, &matched, &matches, 1, 0, 0, 0);
zend_string_release(pattern);
zend_string_release(subject);
zval_ptr_dtor(&matched);
zval_ptr_dtor(&matches);
RETURN_TRUE;
}
Код: Выделить всё
valgrind --leak-check=full php -S 0.0.0.0:8686 index.php
Код: Выделить всё
==11== Invalid read of size 16
==11== at 0x8B43C56: ???
==11== by 0x8850AF7: ???
==11== by 0x8850AF7: ???
==11== by 0x8850B06: ???
==11== by 0x84BF75F: ???
==11== by 0x8850AF7: ???
==11== Address 0x8850aff is 31 bytes inside a block of size 40 alloc'd
==11== at 0x4846828: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==11== by 0x89B4E5: __zend_malloc (zend_alloc.c:3142)
==11== by 0x899FBA: _malloc_custom (zend_alloc.c:2494)
==11== by 0x89A104: _emalloc (zend_alloc.c:2613)
==11== by 0x87003FB: zend_string_alloc (zend_string.h:174)
==11== by 0x870046E: zend_string_init (zend_string.h:196)
==11== by 0x87005CB: zif_run (swat.c:20)
==11== by 0x923C92: ZEND_DO_ICALL_SPEC_RETVAL_UNUSED_HANDLER (zend_vm_execute.h:1275)
==11== by 0x9A257B: execute_ex (zend_vm_execute.h:57273)
==11== by 0x9A7E45: zend_execute (zend_vm_execute.h:61665)
==11== by 0x8DE991: zend_execute_scripts (zend.c:1895)
==11== by 0xA7551F: php_cli_server_dispatch_router (php_cli_server.c:2286)
==11== by 0xA756FF: php_cli_server_dispatch (php_cli_server.c:2326)
==11== by 0xA762DD: php_cli_server_recv_event_read_request (php_cli_server.c:2667)
==11== by 0xA766D9: php_cli_server_do_event_for_each_fd_callback (php_cli_server.c:2754)
==11== by 0xA71C73: php_cli_server_poller_iter_on_active (php_cli_server.c:932)
==11== by 0xA76773: php_cli_server_do_event_for_each_fd (php_cli_server.c:2774)
==11== by 0xA7681F: php_cli_server_do_event_loop (php_cli_server.c:2786)
==11== by 0xA76C84: do_cli_server (php_cli_server.c:2918)
==11== by 0xA6C1D9: main (php_cli.c:1344)
==11==
==11== Conditional jump or move depends on uninitialised value(s)
==11== at 0x8B43CFA: ???
==11== by 0x8850AF7: ???
==11== by 0x8850AF7: ???
==11== by 0x8850B06: ???
==11== by 0x84BF75F: ???
==11== by 0x8850AF7: ???
==11==
Функция должна работать без ошибок памяти.
Факт:
Valgrind сообщает о недопустимых чтениях и использовании неинициализированных значений.
Я подозреваю, что проблема может быть связана с тем, как я использую php_pcre_match_impl или с тем, как инициализируются zval, но я не уверен, что именно. неверно.
Безопасно ли вызывать php_pcre_match_impl непосредственно из расширения или я пропустил необходимые шаги инициализации?
Подробнее здесь: https://stackoverflow.com/questions/798 ... re-match-i
Мобильная версия