projects
/
m6w6
/
ext-psi
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
ffi: fix buffer overrun when padding struct storage
[m6w6/ext-psi]
/
src
/
module.c
diff --git
a/src/module.c
b/src/module.c
index 28c04145661550c4f6338a0c7df093d7fb7be7c0..e7948d8a0e9abec32534e7665797fa6109e65fdf 100644
(file)
--- a/
src/module.c
+++ b/
src/module.c
@@
-122,38
+122,40
@@
static PHP_FUNCTION(psi_dump)
ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate, 0, 0, 1)
ZEND_ARG_INFO(0, file)
ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate, 0, 0, 1)
ZEND_ARG_INFO(0, file)
+ ZEND_ARG_INFO(0, flags)
ZEND_END_ARG_INFO();
static PHP_FUNCTION(psi_validate)
{
zend_string *file;
ZEND_END_ARG_INFO();
static PHP_FUNCTION(psi_validate)
{
zend_string *file;
+ struct psi_parser_input *I;
struct psi_parser P;
struct psi_data D = {0};
struct psi_parser P;
struct psi_data D = {0};
+ zend_long flags = 0;
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "P", &file)) {
+#if PHP_DEBUG
+ if (psi_check_env("PSI_DEBUG")) {
+ flags |= PSI_DEBUG;
+ }
+#endif
+
+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &file, &flags)) {
return;
}
return;
}
- if (!psi_parser_init(&P, psi_error_wrapper,
0
)) {
+ if (!psi_parser_init(&P, psi_error_wrapper,
flags
)) {
RETURN_FALSE;
}
RETURN_FALSE;
}
- if (!
psi_parser_open_file(&P, file->val
)) {
+ if (!
(I = psi_parser_open_file(&P, file->val, true)
)) {
psi_parser_dtor(&P);
RETURN_FALSE;
}
psi_parser_dtor(&P);
RETURN_FALSE;
}
- while (0 < psi_parser_scan(&P)) {
- psi_parser_parse(&P, psi_token_alloc(&P));
- if (P.num == PSI_T_EOF) {
- break;
- }
- }
- psi_parser_parse(&P, NULL);
-
+ 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_data_dtor(&D);
psi_data_ctor(&D, P.error, P.flags);
RETVAL_BOOL(psi_data_validate(&D, PSI_DATA(&P)) && !P.errors);
psi_data_dtor(&D);
-
psi_parser_dtor(&P);
psi_parser_dtor(&P);
+ free(I);
}
ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate_string, 0, 0, 1)
}
ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate_string, 0, 0, 1)
@@
-162,34
+164,35
@@
ZEND_END_ARG_INFO();
static PHP_FUNCTION(psi_validate_string)
{
zend_string *string;
static PHP_FUNCTION(psi_validate_string)
{
zend_string *string;
+ struct psi_parser_input *I;
struct psi_parser P;
struct psi_data D = {0};
struct psi_parser P;
struct psi_data D = {0};
+ zend_long flags = 0;
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "S", &string)) {
+#if PHP_DEBUG
+ if (psi_check_env("PSI_DEBUG")) {
+ flags |= PSI_DEBUG;
+ }
+#endif
+
+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "S|l", &string, &flags)) {
return;
}
return;
}
- if (!psi_parser_init(&P, psi_error_wrapper,
0
)) {
+ if (!psi_parser_init(&P, psi_error_wrapper,
flags
)) {
RETURN_FALSE;
}
RETURN_FALSE;
}
- if (!
psi_parser_open_string(&P, string->val, string->len
)) {
+ if (!
(I = psi_parser_open_string(&P, string->val, string->len)
)) {
psi_parser_dtor(&P);
RETURN_FALSE;
}
psi_parser_dtor(&P);
RETURN_FALSE;
}
- while (0 < psi_parser_scan(&P)) {
- psi_parser_parse(&P, psi_token_alloc(&P));
- if (P.num == PSI_T_EOF) {
- break;
- }
- }
- psi_parser_parse(&P, NULL);
-
+ 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_data_dtor(&D);
psi_data_ctor(&D, P.error, P.flags);
RETVAL_BOOL(psi_data_validate(&D, PSI_DATA(&P)) && !P.errors);
psi_data_dtor(&D);
-
psi_parser_dtor(&P);
psi_parser_dtor(&P);
+ free(I);
}
static PHP_MINIT_FUNCTION(psi)
}
static PHP_MINIT_FUNCTION(psi)
@@
-198,15
+201,11
@@
static PHP_MINIT_FUNCTION(psi)
zend_class_entry ce = {0};
unsigned flags = 0;
zend_class_entry ce = {0};
unsigned flags = 0;
- if (psi_check_env("PSI_DEBUG")) {
- flags |= PSI_DEBUG;
- }
- if (psi_check_env("PSI_SILENT")) {
- flags |= PSI_SILENT;
- }
-
REGISTER_INI_ENTRIES();
REGISTER_INI_ENTRIES();
+ zend_register_long_constant(ZEND_STRL("PSI_DEBUG"), PSI_DEBUG, CONST_CS|CONST_PERSISTENT, module_number);
+ zend_register_long_constant(ZEND_STRL("PSI_SILENT"), PSI_SILENT, CONST_CS|CONST_PERSISTENT, module_number);
+
INIT_NS_CLASS_ENTRY(ce, "psi", "object", NULL);
psi_class_entry = zend_register_internal_class_ex(&ce, NULL);
psi_class_entry->create_object = psi_object_init;
INIT_NS_CLASS_ENTRY(ce, "psi", "object", NULL);
psi_class_entry = zend_register_internal_class_ex(&ce, NULL);
psi_class_entry->create_object = psi_object_init;
@@
-230,18
+229,25
@@
static PHP_MINIT_FUNCTION(psi)
return FAILURE;
}
return FAILURE;
}
+ if (psi_check_env("PSI_DEBUG")) {
+ flags |= PSI_DEBUG;
+ }
+ if (psi_check_env("PSI_SILENT")) {
+ flags |= PSI_SILENT;
+ }
+
PSI_G(context) = psi_context_init(NULL, ops, psi_error_wrapper, flags);
psi_context_build(PSI_G(context), PSI_G(directory));
PSI_G(context) = psi_context_init(NULL, ops, psi_error_wrapper, flags);
psi_context_build(PSI_G(context), PSI_G(directory));
- if (psi_check_env("PSI_DUMP")) {
- psi_context_dump(PSI_G(context), STDOUT_FILENO);
- }
-
return SUCCESS;
}
static PHP_MSHUTDOWN_FUNCTION(psi)
{
return SUCCESS;
}
static PHP_MSHUTDOWN_FUNCTION(psi)
{
+ if (psi_check_env("PSI_DUMP")) {
+ psi_context_dump(PSI_G(context), STDOUT_FILENO);
+ }
+
psi_context_free(&PSI_G(context));
UNREGISTER_INI_ENTRIES();
psi_context_free(&PSI_G(context));
UNREGISTER_INI_ENTRIES();