Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Fix #66509 invalid required param by reflection #567

Closed
wants to merge 2 commits into from

2 participants

@willfitch

This update fixes the issue where Reflection is assuming the $context is required.

@willfitch willfitch closed this
@willfitch willfitch reopened this
@willfitch willfitch closed this
@willfitch willfitch deleted the willfitch:bug-66509-copy-invalid-params branch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Jan 17, 2014
  1. @bwoebi
Commits on Jan 18, 2014
  1. @willfitch
This page is out of date. Refresh to see the latest.
View
2  ext/standard/basic_functions.c
@@ -1216,7 +1216,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_fstat, 0)
ZEND_ARG_INFO(0, fp)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO(arginfo_copy, 0)
+ZEND_BEGIN_ARG_INFO_EX(arginfo_copy, 0, 0, 2)
ZEND_ARG_INFO(0, source_file)
ZEND_ARG_INFO(0, destination_file)
ZEND_ARG_INFO(0, context)
View
15 ext/standard/tests/file/bug66509.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #66509 (copy() showing $context parameter as required)
+--FILE--
+<?php
+
+$r = new \ReflectionFunction('copy');
+
+foreach($r->getParameters() as $p) {
+ var_dump($p->isOptional());
+}
+?>
+--EXPECT--
+bool(false)
+bool(false)
+bool(true)
View
66 sapi/phpdbg/phpdbg.c
@@ -653,8 +653,11 @@ static inline void phpdbg_sigint_handler(int signo) /* {{{ */
PHPDBG_G(flags) |= PHPDBG_IS_SIGNALED;
}
} else {
- PHPDBG_G(flags) |= PHPDBG_IS_QUITTING;
- zend_bailout();
+ /* we quit remote consoles on recv SIGINT */
+ if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) {
+ PHPDBG_G(flags) |= PHPDBG_IS_QUITTING;
+ zend_bailout();
+ }
}
} /* }}} */
@@ -1198,17 +1201,17 @@ int main(int argc, char **argv) /* {{{ */
} zend_end_try();
/* initialize from file */
+ PHPDBG_G(flags) |= PHPDBG_IS_INITIALIZING;
zend_try {
- PHPDBG_G(flags) |= PHPDBG_IS_INITIALIZING;
phpdbg_init(init_file, init_file_len, init_file_default TSRMLS_CC);
phpdbg_try_file_init(bp_tmp_file, strlen(bp_tmp_file), 0 TSRMLS_CC);
- PHPDBG_G(flags) &= ~PHPDBG_IS_INITIALIZING;
- } zend_catch {
- PHPDBG_G(flags) &= ~PHPDBG_IS_INITIALIZING;
- if (PHPDBG_G(flags) & PHPDBG_IS_QUITTING) {
- goto phpdbg_out;
- }
} zend_end_try();
+ PHPDBG_G(flags) &= ~PHPDBG_IS_INITIALIZING;
+
+ /* quit if init says so */
+ if (PHPDBG_G(flags) & PHPDBG_IS_QUITTING) {
+ goto phpdbg_out;
+ }
/* step from here, not through init */
if (step) {
@@ -1235,39 +1238,46 @@ int main(int argc, char **argv) /* {{{ */
phpdbg_export_breakpoints(bp_tmp_fp TSRMLS_CC);
fclose(bp_tmp_fp);
cleaning = 1;
- goto phpdbg_out;
} else {
cleaning = 0;
}
-#ifndef _WIN32
- /* remote client disconnected */
- if ((PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED)) {
- /* renegociate connections */
- phpdbg_open_sockets(
- address, listen, &server, &socket, streams);
+#ifndef _WIN32
+ if (!cleaning) {
+ /* remote client disconnected */
+ if ((PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED)) {
- /* set streams */
- if (streams[0] && streams[1]) {
- PHPDBG_G(flags) &= ~PHPDBG_IS_QUITTING;
+ if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE) {
+ /* renegociate connections */
+ phpdbg_open_sockets(
+ address, listen, &server, &socket, streams);
+
+ /* set streams */
+ if (streams[0] && streams[1]) {
+ PHPDBG_G(flags) &= ~PHPDBG_IS_QUITTING;
+ }
+
+ /* this must be forced */
+ CG(unclean_shutdown) = 0;
+ } else {
+ /* local consoles cannot disconnect, ignore EOF */
+ PHPDBG_G(flags) &= ~PHPDBG_IS_DISCONNECTED;
+ }
}
-
- /* this must be forced */
- CG(unclean_shutdown) = 0;
}
#endif
- if (PHPDBG_G(flags) & PHPDBG_IS_QUITTING) {
- goto phpdbg_out;
- }
} zend_end_try();
- } while(!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING));
+ } while(!cleaning && !(PHPDBG_G(flags) & PHPDBG_IS_QUITTING));
/* this must be forced */
CG(unclean_shutdown) = 0;
+ /* this is just helpful */
+ PG(report_memleaks) = 0;
+
phpdbg_out:
#ifndef _WIN32
- if (PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED) {
+ if ((PHPDBG_G(flags) & PHPDBG_IS_DISCONNECTED)) {
PHPDBG_G(flags) &= ~PHPDBG_IS_DISCONNECTED;
goto phpdbg_interact;
}
@@ -1316,7 +1326,7 @@ int main(int argc, char **argv) /* {{{ */
if (cleaning || remote) {
goto phpdbg_main;
}
-
+
#ifdef ZTS
/* bugggy */
/* tsrm_shutdown(); */
View
2  sapi/phpdbg/phpdbg.h
@@ -149,7 +149,7 @@
#define PHPDBG_AUTHORS "Felipe Pena, Joe Watkins and Bob Weinand" /* Ordered by last name */
#define PHPDBG_URL "http://phpdbg.com"
#define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues"
-#define PHPDBG_VERSION "0.3.0"
+#define PHPDBG_VERSION "0.3.1"
#define PHPDBG_INIT_FILENAME ".phpdbginit"
/* }}} */
View
35 sapi/phpdbg/phpdbg_cmd.c
@@ -467,32 +467,43 @@ PHPDBG_API phpdbg_input_t *phpdbg_read_input(char *buffered TSRMLS_DC) /* {{{ */
}
if (buffered == NULL) {
-#ifndef HAVE_LIBREADLINE
- char buf[PHPDBG_MAX_CMD];
- if ((!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE) && !phpdbg_write(phpdbg_get_prompt(TSRMLS_C))) ||
- !fgets(buf, PHPDBG_MAX_CMD, PHPDBG_G(io)[PHPDBG_STDIN])) {
- /* the user has gone away */
- phpdbg_error("Failed to read console!");
+disconnect:
+ if (0) {
PHPDBG_G(flags) |= (PHPDBG_IS_QUITTING|PHPDBG_IS_DISCONNECTED);
zend_bailout();
return NULL;
}
+#ifndef HAVE_LIBREADLINE
+ char buf[PHPDBG_MAX_CMD];
+ if (!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
+ if (!phpdbg_write(phpdbg_get_prompt(TSRMLS_C))) {
+ goto disconnect;
+ }
+ }
+
+ /* note: EOF is ignored */
+readline:
+ if (!fgets(buf, PHPDBG_MAX_CMD, PHPDBG_G(io)[PHPDBG_STDIN])) {
+ /* the user has gone away */
+ if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
+ goto disconnect;
+ } else goto readline;
+ }
+
cmd = buf;
#else
+ /* note: EOF makes readline write prompt again in local console mode */
+readline:
if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
char buf[PHPDBG_MAX_CMD];
if (fgets(buf, PHPDBG_MAX_CMD, PHPDBG_G(io)[PHPDBG_STDIN])) {
cmd = buf;
- } else cmd = NULL;
+ } else goto disconnect;
} else cmd = readline(phpdbg_get_prompt(TSRMLS_C));
if (!cmd) {
- /* the user has gone away */
- phpdbg_error("Failed to read console!");
- PHPDBG_G(flags) |= (PHPDBG_IS_QUITTING|PHPDBG_IS_DISCONNECTED);
- zend_bailout();
- return NULL;
+ goto readline;
}
if (!(PHPDBG_G(flags) & PHPDBG_IS_REMOTE)) {
View
16 sapi/phpdbg/phpdbg_opcode.c
@@ -52,13 +52,15 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, zend_uint
case IS_VAR:
case IS_TMP_VAR: {
zend_ulong id = 0, *pid = NULL;
- if (zend_hash_index_find(vars, (zend_ulong) ops->vars - op->var, (void**) &pid) != SUCCESS) {
- id = zend_hash_num_elements(vars);
- zend_hash_index_update(
- vars, (zend_ulong) ops->vars - op->var,
- (void**) &id,
- sizeof(zend_ulong), NULL);
- } else id = *pid;
+ if (vars != NULL) {
+ if (zend_hash_index_find(vars, (zend_ulong) ops->vars - op->var, (void**) &pid) != SUCCESS) {
+ id = zend_hash_num_elements(vars);
+ zend_hash_index_update(
+ vars, (zend_ulong) ops->vars - op->var,
+ (void**) &id,
+ sizeof(zend_ulong), NULL);
+ } else id = *pid;
+ }
asprintf(&decode, "@%lu", id);
} break;
View
20 sapi/phpdbg/phpdbg_prompt.c
@@ -551,7 +551,8 @@ PHPDBG_COMMAND(run) /* {{{ */
zend_op **orig_opline = EG(opline_ptr);
zend_op_array *orig_op_array = EG(active_op_array);
zval **orig_retval_ptr = EG(return_value_ptr_ptr);
-
+ zend_bool restore = 1;
+
if (!PHPDBG_G(ops)) {
if (phpdbg_compile(TSRMLS_C) == FAILURE) {
phpdbg_error("Failed to compile %s, cannot run", PHPDBG_G(exec));
@@ -586,18 +587,19 @@ PHPDBG_COMMAND(run) /* {{{ */
if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) {
phpdbg_error("Caught exit/error from VM");
- goto out;
+ restore = 0;
}
} zend_end_try();
- if (EG(exception)) {
- phpdbg_handle_exception(TSRMLS_C);
- }
-
- EG(active_op_array) = orig_op_array;
- EG(opline_ptr) = orig_opline;
- EG(return_value_ptr_ptr) = orig_retval_ptr;
+ if (restore) {
+ if (EG(exception)) {
+ phpdbg_handle_exception(TSRMLS_C);
+ }
+ EG(active_op_array) = orig_op_array;
+ EG(opline_ptr) = orig_opline;
+ EG(return_value_ptr_ptr) = orig_retval_ptr;
+ }
} else {
phpdbg_error("Nothing to execute!");
}
Something went wrong with that request. Please try again.