summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2000-08-19 17:58:04 +0000
committerZeev Suraski <zeev@php.net>2000-08-19 17:58:04 +0000
commitf8d74acd93b02c1abbfc64406a609b90a09a6aa1 (patch)
tree2ebc92d43d506a4c5caa48e6f366e652b4935011 /Zend
parentc34f41b7c505ecd4363e0cdae14710e16ab8aefd (diff)
downloadphp-git-f8d74acd93b02c1abbfc64406a609b90a09a6aa1.tar.gz
Fix eval() leakage in ZTS mode
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend-scanner.l29
1 files changed, 23 insertions, 6 deletions
diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l
index 666329ddf8..1235d5237b 100644
--- a/Zend/zend-scanner.l
+++ b/Zend/zend-scanner.l
@@ -409,8 +409,11 @@ zend_op_array *compile_filename(int type, zval *filename CLS_DC ELS_DC)
return retval;
}
-
-static inline int prepare_string_for_scanning(zval *str CLS_DC)
+#ifndef ZTS
+static inline int prepare_string_for_scanning(zval *str)
+#else
+static inline int prepare_string_for_scanning(zval *str, istrstream **input_stream CLS_DC)
+#endif
{
#ifndef ZTS
/* enforce two trailing NULLs for flex... */
@@ -421,10 +424,10 @@ static inline int prepare_string_for_scanning(zval *str CLS_DC)
yyin=NULL;
yy_scan_buffer(str->value.str.val, str->value.str.len+2);
#else
- istrstream *input_stream = new istrstream(str->value.str.val, str->value.str.len);
+ *input_stream = new istrstream(str->value.str.val, str->value.str.len);
CG(ZFL) = new ZendFlexLexer;
- CG(ZFL)->switch_streams(input_stream, &cout);
+ CG(ZFL)->switch_streams(*input_stream, &cout);
#endif
zend_set_compiled_filename("Eval code");
CG(zend_lineno) = 1;
@@ -441,6 +444,9 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
zval tmp;
int compiler_result;
zend_bool original_in_compilation = CG(in_compilation);
+#ifdef ZTS
+ istrstream *input_stream;
+#endif
if (source_string->value.str.len==0) {
efree(op_array);
@@ -455,7 +461,11 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
source_string = &tmp;
save_lexical_state(&original_lex_state CLS_CC);
- if (prepare_string_for_scanning(source_string CLS_CC)==FAILURE) {
+#ifndef ZTS
+ if (prepare_string_for_scanning(source_string)==FAILURE) {
+#else
+ if (prepare_string_for_scanning(source_string, &input_stream CLS_CC)==FAILURE) {
+#endif
efree(op_array);
retval = NULL;
} else {
@@ -480,6 +490,7 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
retval = op_array;
}
}
+ delete input_stream;
zval_dtor(&tmp);
CG(in_compilation) = original_in_compilation;
return retval;
@@ -513,16 +524,22 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
{
zend_lex_state original_lex_state;
zval tmp = *str;
+ istrstream *input_stream;
CLS_FETCH();
str = &tmp;
zval_copy_ctor(str);
save_lexical_state(&original_lex_state CLS_CC);
- if (prepare_string_for_scanning(str CLS_CC)==FAILURE) {
+#ifndef ZTS
+ if (prepare_string_for_scanning(str)==FAILURE) {
+#else
+ if (prepare_string_for_scanning(str, &input_stream CLS_CC)==FAILURE) {
+#endif
return FAILURE;
}
zend_highlight(syntax_highlighter_ini);
restore_lexical_state(&original_lex_state CLS_CC);
+ delete input_stream;
zval_dtor(str);
return SUCCESS;
}