support pcre ini options
Esse commit está contido em:
@@ -72,6 +72,8 @@ BaseExecutionContext::BaseExecutionContext() :
|
||||
}
|
||||
|
||||
VMExecutionContext::VMExecutionContext() :
|
||||
m_preg_backtrace_limit(RuntimeOption::PregBacktraceLimit),
|
||||
m_preg_recursion_limit(RuntimeOption::PregRecursionLimit),
|
||||
m_lambdaCounter(0), m_nesting(0),
|
||||
m_injTables(nullptr), m_breakPointFilter(nullptr), m_lastLocFilter(nullptr),
|
||||
m_interpreting(false), m_dbgNoBreak(false),
|
||||
|
||||
@@ -421,6 +421,10 @@ public:
|
||||
typedef std::set<HPHP::ObjectData*> LiveObjSet;
|
||||
LiveObjSet m_liveBCObjs;
|
||||
|
||||
// pcre ini_settings
|
||||
long m_preg_backtrace_limit;
|
||||
long m_preg_recursion_limit;
|
||||
|
||||
public:
|
||||
void requestInit();
|
||||
void requestExit();
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
#include <runtime/base/builtin_functions.h>
|
||||
#include <runtime/base/zend/zend_functions.h>
|
||||
#include <runtime/base/array/array_iterator.h>
|
||||
#include <runtime/base/ini_setting.h>
|
||||
#include <runtime/base/thread_init_fini.h>
|
||||
#include <tbb/concurrent_hash_map.h>
|
||||
|
||||
#define PREG_PATTERN_ORDER 1
|
||||
@@ -107,6 +109,14 @@ static __thread int t_last_error_code;
|
||||
|
||||
namespace {
|
||||
|
||||
static void preg_init_thread_locals() {
|
||||
IniSetting::Bind("pcre.backtrack_limit", "1000000", ini_on_update_long,
|
||||
&g_context->m_preg_backtrace_limit);
|
||||
IniSetting::Bind("pcre.recursion_limit", "100000", ini_on_update_long,
|
||||
&g_context->m_preg_recursion_limit);
|
||||
}
|
||||
InitFiniNode init(preg_init_thread_locals, InitFiniNode::ThreadInit);
|
||||
|
||||
template<bool useSmartFree = false>
|
||||
struct FreeHelperImpl : private boost::noncopyable {
|
||||
explicit FreeHelperImpl(void* p) : p(p) {}
|
||||
@@ -284,8 +294,8 @@ static void set_extra_limits(pcre_extra*& extra) {
|
||||
PCRE_EXTRA_MATCH_LIMIT_RECURSION;
|
||||
extra = &extra_data;
|
||||
}
|
||||
extra->match_limit = RuntimeOption::PregBacktraceLimit;
|
||||
extra->match_limit_recursion = RuntimeOption::PregRecursionLimit;
|
||||
extra->match_limit = g_context->m_preg_backtrace_limit;
|
||||
extra->match_limit_recursion = g_context->m_preg_recursion_limit;
|
||||
}
|
||||
|
||||
static int *create_offset_array(const pcre_cache_entry *pce,
|
||||
@@ -356,10 +366,10 @@ static void pcre_log_error(const char *func, int line, int pcre_code,
|
||||
"UNKNOWN";
|
||||
raise_debugging(
|
||||
"REGEXERR: %s/%d: err=%d(%s), pattern='%s', subject='%s', repl='%s', "
|
||||
"limits=(%d, %d), extra=(%d, %d, %d, %d)",
|
||||
"limits=(%ld, %ld), extra=(%d, %d, %d, %d)",
|
||||
func, line, pcre_code, errString,
|
||||
escapedPattern, escapedSubject, escapedRepl,
|
||||
RuntimeOption::PregBacktraceLimit, RuntimeOption::PregRecursionLimit,
|
||||
g_context->m_preg_backtrace_limit, g_context->m_preg_recursion_limit,
|
||||
arg1, arg2, arg3, arg4);
|
||||
free((void *)escapedPattern);
|
||||
free((void *)escapedSubject);
|
||||
|
||||
@@ -435,8 +435,8 @@ std::string RuntimeOption::DebuggerUsageLogFile;
|
||||
std::string RuntimeOption::SendmailPath;
|
||||
std::string RuntimeOption::MailForceExtraParameters;
|
||||
|
||||
int RuntimeOption::PregBacktraceLimit = 100000;
|
||||
int RuntimeOption::PregRecursionLimit = 100000;
|
||||
long RuntimeOption::PregBacktraceLimit = 1000000;
|
||||
long RuntimeOption::PregRecursionLimit = 100000;
|
||||
bool RuntimeOption::EnablePregErrorLog = true;
|
||||
|
||||
bool RuntimeOption::EnableHotProfiler = true;
|
||||
@@ -1251,8 +1251,8 @@ void RuntimeOption::Load(Hdf &config, StringVec *overwrites /* = NULL */,
|
||||
}
|
||||
{
|
||||
Hdf preg = config["Preg"];
|
||||
PregBacktraceLimit = preg["BacktraceLimit"].getInt32(100000);
|
||||
PregRecursionLimit = preg["RecursionLimit"].getInt32(100000);
|
||||
PregBacktraceLimit = preg["BacktraceLimit"].getInt64(1000000);
|
||||
PregRecursionLimit = preg["RecursionLimit"].getInt64(100000);
|
||||
EnablePregErrorLog = preg["ErrorLog"].getBool(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -495,8 +495,8 @@ public:
|
||||
static std::string MailForceExtraParameters;
|
||||
|
||||
// preg stack depth and debug support options
|
||||
static int PregBacktraceLimit;
|
||||
static int PregRecursionLimit;
|
||||
static long PregBacktraceLimit;
|
||||
static long PregRecursionLimit;
|
||||
static bool EnablePregErrorLog;
|
||||
|
||||
// Convenience switch to turn on/off code alternatives via command-line
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <runtime/base/preg.h>
|
||||
#include <runtime/ext/ext_mb.h>
|
||||
#include <runtime/ext/ext_string.h>
|
||||
#include <runtime/base/ini_setting.h>
|
||||
#include <runtime/base/util/request_local.h>
|
||||
|
||||
namespace HPHP {
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
$a = 'baab' . str_repeat('a', 1000000);
|
||||
$b = preg_replace('/b.*b/', '', $a);
|
||||
var_dump(preg_last_error());
|
||||
|
||||
ini_set('pcre.backtrack_limit', PHP_INT_MAX);
|
||||
|
||||
$b = preg_replace('/b.*b/', '', $a);
|
||||
var_dump(preg_last_error());
|
||||
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
Referência em uma Nova Issue
Bloquear um usuário