X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fmodule.c;h=1323a9f5b5f616d83ac752a2af17a368a708ebee;hp=3cd45f9efde40ecf0433c20589274501af71dfea;hb=c9384515a81cb64d345b299908b2852f51bb8e6e;hpb=4ace6fa9bfa459902184655ee40d6136f25915c8 diff --git a/src/module.c b/src/module.c index 3cd45f9..1323a9f 100644 --- a/src/module.c +++ b/src/module.c @@ -133,6 +133,7 @@ static PHP_FUNCTION(psi_validate) struct psi_parser_input *I; struct psi_parser P; struct psi_data D = {0}; + struct psi_validate_scope S = {0}; zend_long flags = 0; #if PHP_DEBUG @@ -155,7 +156,10 @@ static PHP_FUNCTION(psi_validate) psi_parser_parse(&P, I); psi_data_ctor(&D, P.error, P.flags); - RETVAL_BOOL(psi_data_validate(&D, PSI_DATA(&P)) && !P.errors); + psi_validate_scope_ctor(&S); + S.defs = &P.preproc->defs; + RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P)) && !P.errors); + psi_validate_scope_dtor(&S); psi_data_dtor(&D); psi_parser_dtor(&P); free(I); @@ -170,6 +174,7 @@ static PHP_FUNCTION(psi_validate_string) struct psi_parser_input *I; struct psi_parser P; struct psi_data D = {0}; + struct psi_validate_scope S = {0}; zend_long flags = 0; #if PHP_DEBUG @@ -192,15 +197,41 @@ static PHP_FUNCTION(psi_validate_string) psi_parser_parse(&P, I); psi_data_ctor(&D, P.error, P.flags); - RETVAL_BOOL(psi_data_validate(&D, PSI_DATA(&P)) && !P.errors); + psi_validate_scope_ctor(&S); + S.defs = &P.preproc->defs; + RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P)) && !P.errors); + psi_validate_scope_dtor(&S); psi_data_dtor(&D); psi_parser_dtor(&P); free(I); } -static PHP_MINIT_FUNCTION(psi) +static ZEND_RESULT_CODE psi_ops_load() { struct psi_context_ops *ops = NULL; +#ifdef HAVE_LIBJIT + if (!strcasecmp(PSI_G(engine), "jit")) { + ops = psi_libjit_ops(); + } else +#endif +#ifdef HAVE_LIBFFI + ops = psi_libffi_ops(); +#endif + + if (!ops) { + php_error(E_WARNING, "No PSI engine found"); + return FAILURE; + } + + PSI_G(ops) = ops; + if (ops->load) { + return ops->load(); + } + return SUCCESS; +} + +static PHP_MINIT_FUNCTION(psi) +{ zend_class_entry ce = {0}; unsigned flags = 0; @@ -218,17 +249,7 @@ static PHP_MINIT_FUNCTION(psi) psi_object_handlers.free_obj = psi_object_free; psi_object_handlers.clone_obj = NULL; -#ifdef HAVE_LIBJIT - if (!strcasecmp(PSI_G(engine), "jit")) { - ops = psi_libjit_ops(); - } else -#endif -#ifdef HAVE_LIBFFI - ops = psi_libffi_ops(); -#endif - - if (!ops) { - php_error(E_WARNING, "No PSI engine found"); + if (SUCCESS != psi_ops_load()) { return FAILURE; } @@ -242,7 +263,7 @@ static PHP_MINIT_FUNCTION(psi) PSI_G(search_path) = pemalloc(strlen(PSI_G(directory)) + strlen(psi_cpp_search) + 1 + 1, 1); sprintf(PSI_G(search_path), "%s:%s", PSI_G(directory), psi_cpp_search); - PSI_G(context) = psi_context_init(NULL, ops, psi_error_wrapper, flags); + PSI_G(context) = psi_context_init(NULL, PSI_G(ops), psi_error_wrapper, flags); psi_context_build(PSI_G(context), PSI_G(directory)); return SUCCESS; @@ -256,6 +277,10 @@ static PHP_MSHUTDOWN_FUNCTION(psi) psi_context_free(&PSI_G(context)); + if (PSI_G(ops)->free) { + PSI_G(ops)->free(); + } + UNREGISTER_INI_ENTRIES(); return SUCCESS; @@ -309,15 +334,39 @@ static PHP_GINIT_FUNCTION(psi) { char *tmp; struct psi_plist **bl_decls = &psi_globals->blacklist.decls; + struct psi_plist **bl_vars = &psi_globals->blacklist.vars; *bl_decls = psi_plist_init(ptr_free); + *bl_vars = psi_plist_init(ptr_free); -#define BL_DECL_ADD(d) \ +#define BL_ADD(D, d) \ tmp = strdup(d); \ - *bl_decls = psi_plist_add(*bl_decls, &tmp) + *D = psi_plist_add(*D, &tmp) +#define BL_DECL_ADD(d) BL_ADD(bl_decls, d) +#define BL_VAR_ADD(d) BL_ADD(bl_vars, d) BL_DECL_ADD("dlsym"); + BL_DECL_ADD("alloca"); + BL_DECL_ADD("atexit"); + BL_DECL_ADD("at_quick_exit"); + + /* missing */ BL_DECL_ADD("_IO_cookie_init"); + BL_DECL_ADD("bindresvport6"); + + /* va_list as arg */ + BL_DECL_ADD("*v*printf"); + BL_DECL_ADD("*v*scanf"); + BL_DECL_ADD("vsyslog"); + + /* LFS/LFO for 32bit */ + BL_DECL_ADD("*stat*64"); + BL_DECL_ADD("*glob*64"); + /* Hurd only */ + BL_DECL_ADD("getumask"); + + /* using hidden structs */ + BL_VAR_ADD("_IO_2_*"); } static PHP_GSHUTDOWN_FUNCTION(psi)