support pcre ini options

Esse commit está contido em:
Paul Tarjan
2013-04-27 12:33:30 -07:00
commit de Sara Golemon
commit 0aad5e95bf
8 arquivos alterados com 40 adições e 10 exclusões
+2
Ver Arquivo
@@ -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),
+4
Ver Arquivo
@@ -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();
+14 -4
Ver Arquivo
@@ -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);
+4 -4
Ver Arquivo
@@ -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);
}
+2 -2
Ver Arquivo
@@ -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
+1
Ver Arquivo
@@ -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 {
+10
Ver Arquivo
@@ -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