Can you explain to me why the following causes a segfault:
[code]
PHP_FUNCTION(sample_var_a_exists)
{
if (!zend_hash_exists(EG(active_symbol_table), "a", sizeof("a"))) {
RETURN_BOOL(0);
}
RETURN_BOOL(1);
}
[/code]
Note: the segfault only occurs when the sample_var_a_exists function is
called from within a userspace function:
[code]
$a = '';
var_dump(sample_var_a_exists()); // bool(true)
function x() {
var_dump(sample_var_a_exists()); // segmentation fault
}
x();
[/code]
Thanks.
Can you explain to me why the following causes a segfault:
[code]
PHP_FUNCTION(sample_var_a_exists)
{
if (!zend_hash_exists(EG(active_symbol_table), "a", sizeof("a"))) {
RETURN_BOOL(0);
}
RETURN_BOOL(1);
}
[/code]Note: the segfault only occurs when the sample_var_a_exists function
is called from within a userspace function:[code]
$a = '';
var_dump(sample_var_a_exists()); // bool(true)function x() {
var_dump(sample_var_a_exists()); // segmentation fault
}x()
There is no symbol table as there are no variables. You should check
if it's NULL
before using zend_hash_exists.
Scott
Scott MacVicar wrote:
[snip]
There is no symbol table as there are no variables. You should check if
it'sNULL
before using zend_hash_exists.Scott
Ah - of course.
Thanks for that, Scott.
Scott MacVicar wrote:
[snip]
There is no symbol table as there are no variables. You should check if
it'sNULL
before using zend_hash_exists.Scott
Hi, Scott. I'm having trouble - I added the check to see if the symbol
table i available, yet it returns false even if I have added variables
within the function:
[code]
PHP_FUNCTION(sample_var_a_exists)
{
if (!EG(active_symbol_table) ||
!zend_hash_exists(EG(active_symbol_table), "a", sizeof("a"))) {
RETURN_BOOL(0);
}
RETURN_BOOL(1);
}
[/code]
[code]
$a = '';
var_dump(sample_var_a_exists());
function x() {
$a = ''; // Add a symbol to the hash table.
var_dump(sample_var_a_exists()); // Shows bool(false)
}
x();
[/code]
Scott MacVicar wrote:
On 1 Nov 2009, at 21:09, Mark Skilbeck markskilbeck@gmail.com
wrote:[snip]
There is no symbol table as there are no variables. You should
check if it'sNULL
before using zend_hash_exists.
ScottHi, Scott. I'm having trouble - I added the check to see if the
symbol table i available, yet it returns false even if I have added
variables within the function:[code]
PHP_FUNCTION(sample_var_a_exists)
{
if (!EG(active_symbol_table) ||
!zend_hash_exists(EG(active_symbol_table), "a", sizeof("a"))) {
RETURN_BOOL(0);
}
RETURN_BOOL(1);
}
[/code][code]
$a = '';
var_dump(sample_var_a_exists());function x() {
$a = ''; // Add a symbol to the hash table.
var_dump(sample_var_a_exists()); // Shows bool(false)
}x();
[/code]--
You probably want the following to build the symbol table.
if (!EG(active_symbol_table)) {
zend_rebuild_symbol_table(TSRMLS_C);
}
Scott
Scott MacVicar wrote:
Scott MacVicar wrote:
[snip]
There is no symbol table as there are no variables. You should check
if it'sNULL
before using zend_hash_exists.
ScottHi, Scott. I'm having trouble - I added the check to see if the symbol
table i available, yet it returns false even if I have added variables
within the function:[code]
PHP_FUNCTION(sample_var_a_exists)
{
if (!EG(active_symbol_table) ||
!zend_hash_exists(EG(active_symbol_table), "a",
sizeof("a"))) {
RETURN_BOOL(0);
}
RETURN_BOOL(1);
}
[/code][code]
$a = '';
var_dump(sample_var_a_exists());function x() {
$a = ''; // Add a symbol to the hash table.
var_dump(sample_var_a_exists()); // Shows bool(false)
}x();
[/code]--
You probably want the following to build the symbol table.
if (!EG(active_symbol_table)) { zend_rebuild_symbol_table(TSRMLS_C); }
Scott
Yes, that works. Do you know why we have to rebuild it? I'd assume that
the symbol table was built automatically?
Mark Skilbeck wrote:
Scott MacVicar wrote:
Scott MacVicar wrote:
[snip]
There is no symbol table as there are no variables. You should check
if it'sNULL
before using zend_hash_exists.
ScottHi, Scott. I'm having trouble - I added the check to see if the
symbol table i available, yet it returns false even if I have added
variables within the function:[code]
PHP_FUNCTION(sample_var_a_exists)
{
if (!EG(active_symbol_table) ||
!zend_hash_exists(EG(active_symbol_table), "a",
sizeof("a"))) {
RETURN_BOOL(0);
}
RETURN_BOOL(1);
}
[/code][code]
$a = '';
var_dump(sample_var_a_exists());function x() {
$a = ''; // Add a symbol to the hash table.
var_dump(sample_var_a_exists()); // Shows bool(false)
}x();
[/code]--
You probably want the following to build the symbol table.
if (!EG(active_symbol_table)) { zend_rebuild_symbol_table(TSRMLS_C); }
Scott
Yes, that works. Do you know why we have to rebuild it? I'd assume that
the symbol table was built automatically?
Anyone?
2009/11/2 Mark Skilbeck markskilbeck@gmail.com
Anyone?
See:
http://markmail.org/message/33ee6aitsyqxgu6x#query:+page:1+mid:33ee6aitsyqxgu6x+state:results
--
Regards,
Felipe Pena