AC_FUNC_VPRINTF
AC_FUNC_MEMCMP
AC_FUNC_ALLOCA
-AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass)
+AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp)
AC_ZEND_BROKEN_SPRINTF
AC_CHECK_FUNCS(finite isfinite isinf isnan)
CG(unclean_shutdown) = 1;
CG(in_compilation) = EG(in_execution) = 0;
EG(current_execute_data) = NULL;
- longjmp(*EG(bailout), FAILURE);
+ LONGJMP(*EG(bailout), FAILURE);
}
/* }}} */
END_EXTERN_C()
#define zend_bailout() _zend_bailout(__FILE__, __LINE__)
+#ifdef HAVE_SIGSETJMP
+# define SETJMP(a) sigsetjmp(a, 0)
+# define LONGJMP(a,b) siglongjmp(a, b)
+# define JMP_BUF sigjmp_buf
+#else
+# define SETJMP(a) setjmp(a)
+# define LONGJMP(a,b) longjmp(a, b)
+# define JMP_BUF jmp_buf
+#endif
+
#define zend_try \
{ \
- jmp_buf *__orig_bailout = EG(bailout); \
- jmp_buf __bailout; \
+ JMP_BUF *__orig_bailout = EG(bailout); \
+ JMP_BUF __bailout; \
\
EG(bailout) = &__bailout; \
- if (setjmp(__bailout)==0) {
+ if (SETJMP(__bailout)==0) {
#define zend_catch \
} else { \
EG(bailout) = __orig_bailout;
ZEND_API uint zend_get_executed_lineno(TSRMLS_D);
ZEND_API zend_bool zend_is_executing(TSRMLS_D);
-ZEND_API void zend_set_timeout(long seconds);
+ZEND_API void zend_set_timeout(long seconds, int reset_signals);
ZEND_API void zend_unset_timeout(TSRMLS_D);
ZEND_API void zend_timeout(int dummy);
ZEND_API zend_class_entry *zend_fetch_class(char *class_name, uint class_name_len, int fetch_type TSRMLS_DC);
#define SIGPROF 27
#endif
-void zend_set_timeout(long seconds) /* {{{ */
+void zend_set_timeout(long seconds, int reset_signals) /* {{{ */
{
TSRMLS_FETCH();
EG(timeout_seconds) = seconds;
+#ifdef ZEND_WIN32
if(!seconds) {
return;
}
-#ifdef ZEND_WIN32
if (timeout_thread_initialized == 0 && InterlockedIncrement(&timeout_thread_initialized) == 1) {
/* We start up this process-wide thread here and not in zend_startup(), because if Zend
* is initialized inside a DllMain(), you're not supposed to start threads from it.
{
struct itimerval t_r; /* timeout requested */
sigset_t sigset;
-
- t_r.it_value.tv_sec = seconds;
- t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0;
+ if(seconds) {
+ t_r.it_value.tv_sec = seconds;
+ t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0;
# ifdef __CYGWIN__
- setitimer(ITIMER_REAL, &t_r, NULL);
- signal(SIGALRM, zend_timeout);
- sigemptyset(&sigset);
- sigaddset(&sigset, SIGALRM);
+ setitimer(ITIMER_REAL, &t_r, NULL);
+ }
+ if(reset_signals) {
+ signal(SIGALRM, zend_timeout);
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIGALRM);
+ }
# else
- setitimer(ITIMER_PROF, &t_r, NULL);
- signal(SIGPROF, zend_timeout);
- sigemptyset(&sigset);
- sigaddset(&sigset, SIGPROF);
+ setitimer(ITIMER_PROF, &t_r, NULL);
+ }
+ if(reset_signals) {
+ signal(SIGPROF, zend_timeout);
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIGPROF);
+ }
# endif
- sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+ if(reset_signals) {
+ sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+ }
}
# endif
#endif
HashTable included_files; /* files already included */
- jmp_buf *bailout;
+ JMP_BUF *bailout;
int error_reporting;
int orig_error_reporting;
return SG(global_request_time);
}
+SAPI_API void sapi_terminate_process(TSRMLS_D) {
+ if (sapi_module.terminate_process) {
+ sapi_module.terminate_process(TSRMLS_C);
+ }
+}
+
/*
* Local variables:
* tab-width: 4
SAPI_API int sapi_get_target_uid(uid_t * TSRMLS_DC);
SAPI_API int sapi_get_target_gid(gid_t * TSRMLS_DC);
SAPI_API time_t sapi_get_request_time(TSRMLS_D);
+SAPI_API void sapi_terminate_process(TSRMLS_D);
END_EXTERN_C()
struct _sapi_module_struct {
void (*register_server_variables)(zval *track_vars_array TSRMLS_DC);
void (*log_message)(char *message);
time_t (*get_request_time)(TSRMLS_D);
+ void (*terminate_process)(TSRMLS_D);
char *php_ini_path_override;
return SUCCESS;
}
zend_unset_timeout(TSRMLS_C);
- zend_set_timeout(EG(timeout_seconds));
+ zend_set_timeout(EG(timeout_seconds), 0);
return SUCCESS;
}
/* }}} */
STD_PHP_INI_ENTRY("user_ini.filename", ".user.ini", PHP_INI_SYSTEM, OnUpdateString, user_ini_filename, php_core_globals, core_globals)
STD_PHP_INI_ENTRY("user_ini.cache_ttl", "300", PHP_INI_SYSTEM, OnUpdateLong, user_ini_cache_ttl, php_core_globals, core_globals)
+ STD_PHP_INI_BOOLEAN("exit_on_timeout", "0", PHP_INI_ALL, OnUpdateBool, exit_on_timeout, php_core_globals, core_globals)
PHP_INI_END()
/* }}} */
void php_on_timeout(int seconds TSRMLS_DC) /* {{{ */
{
PG(connection_status) |= PHP_CONNECTION_TIMEOUT;
- zend_set_timeout(EG(timeout_seconds));
+ zend_set_timeout(EG(timeout_seconds), 0);
+ if(PG(exit_on_timeout)) sapi_terminate_process(TSRMLS_C);
}
/* }}} */
PG(connection_status) = PHP_CONNECTION_NORMAL;
zend_activate(TSRMLS_C);
- zend_set_timeout(EG(timeout_seconds));
+ zend_set_timeout(EG(timeout_seconds), 1);
zend_activate_modules(TSRMLS_C);
PG(modules_activated)=1;
} zend_catch {
sapi_activate(TSRMLS_C);
if (PG(max_input_time) == -1) {
- zend_set_timeout(EG(timeout_seconds));
+ zend_set_timeout(EG(timeout_seconds), 1);
} else {
- zend_set_timeout(PG(max_input_time));
+ zend_set_timeout(PG(max_input_time), 1);
}
/* Disable realpath cache if safe_mode or open_basedir are set */
#ifdef PHP_WIN32
zend_unset_timeout(TSRMLS_C);
#endif
- zend_set_timeout(INI_INT("max_execution_time"));
+ zend_set_timeout(EG(timeout_seconds), 0);
}
retval = (zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 3, prepend_file_p, primary_file, append_file_p) == SUCCESS);
char *disable_functions;
char *disable_classes;
+ zend_bool exit_on_timeout;
#ifdef PHP_WIN32
zend_bool com_initialized;
#endif
php_ns_sapi_register_variables,
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
}
/* }}} */
+/* {{{ sapi_apache_child_terminate
+ */
+static void sapi_apache_child_terminate(TSRMLS_D)
+{
+ ap_child_terminate((request_rec *)SG(server_context));
+}
+/* }}} */
+
/* {{{ sapi_module_struct apache_sapi_module
*/
static sapi_module_struct apache_sapi_module = {
sapi_apache_register_server_variables, /* register server variables */
php_apache_log_message, /* Log message */
php_apache_get_request_time, /* Get request time */
+ sapi_apache_child_terminate,
NULL, /* php.ini path override */
php_apache_sapi_register_variables,
php_apache_sapi_log_message, /* Log message */
php_apache_sapi_get_request_time, /* Get Request Time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
php_apache_sapi_register_variables,
php_apache_sapi_log_message, /* Log message */
php_apache_sapi_get_request_time, /* Request Time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_apache_register_server_variables, /* register server variables */
php_apache_log_message, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
NULL, /* php.ini path override */
sapi_caudium_register_variables, /* register server variables */
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_cgi_register_variables, /* register server variables */
sapi_cgi_log_message, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_cli_register_variables, /* register server variables */
sapi_cli_log_message, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_capi_register_server_variables, /* register server variables */
capi_log_message, /* Log message */
- NULL, /* Get request time */
+ NULL, /* Get request time */
+ NULL, /* Child terminate */
NULL, /* Block interruptions */
NULL, /* Unblock interruptions */
php_embed_register_variables, /* register server variables */
php_embed_log_message, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_isapi_register_server_variables, /* register server variables */
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_milter_register_variables, /* register server variables */
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
NULL, /* Block interruptions */
NULL, /* Unblock interruptions */
sapi_nsapi_register_server_variables, /* register server variables */
nsapi_log_message, /* Log message */
sapi_nsapi_get_request_time, /* Get request time */
+ NULL, /* Child terminate */
NULL, /* Block interruptions */
NULL, /* Unblock interruptions */
NULL, /* register server variables */
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_pi3web_register_variables, /* register server variables */
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
NULL, /* register server variables */
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_thttpd_register_variables,
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
NULL, /* php.ini path override */
NULL, /* Block interruptions */
sapi_tux_register_variables,
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
sapi_webjames_register_variables, /* register server variables */
NULL, /* Log message */
NULL, /* Get request time */
+ NULL, /* Child terminate */
STANDARD_SAPI_MODULE_PROPERTIES
};
#define NEED_ISBLANK 1
#define DISCARD_PATH 0
#undef HAVE_SETITIMER
+#undef HAVE_SIGSETJMP
#undef HAVE_IODBC
#define HAVE_LIBDL 1
#define HAVE_GETTIMEOFDAY 1