From 5c824ec67d3a7c78a38a44fcc182bd5a1ad87692 Mon Sep 17 00:00:00 2001 From: belliash Date: Mon, 10 Jun 2019 12:11:55 +0200 Subject: [PATCH] Do not set any recursion depth limit. --- engine/vm.c | 31 ------------------------------- include/ph7.h | 27 +++++++++++++-------------- include/ph7int.h | 2 -- 3 files changed, 13 insertions(+), 47 deletions(-) diff --git a/engine/vm.c b/engine/vm.c index 24af4f4..e83c32a 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -959,12 +959,6 @@ PH7_PRIVATE sxi32 PH7_VmInit( PH7_MemObjInit(&(*pVm), &pVm->aExceptionCB[0]); PH7_MemObjInit(&(*pVm), &pVm->aExceptionCB[1]); PH7_MemObjInit(&(*pVm), &pVm->sAssertCallback); - /* Set a default recursion limit */ -#if defined(__WINNT__) || defined(__UNIXES__) - pVm->nMaxDepth = 32; -#else - pVm->nMaxDepth = 16; -#endif /* Default assertion flags */ pVm->iAssertFlags = PH7_ASSERT_WARNING; /* Issue a warning for each failed assertion */ /* JSON return status */ @@ -1541,14 +1535,6 @@ PH7_PRIVATE sxi32 PH7_VmConfigure( /* Run-Time Error report */ pVm->bErrReport = 1; break; - case PH7_VM_CONFIG_RECURSION_DEPTH: { - /* Recursion depth */ - int nDepth = va_arg(ap, int); - if(nDepth > 2 && nDepth < 1024) { - pVm->nMaxDepth = nDepth; - } - break; - } case PH7_VM_CONFIG_CREATE_SUPER: case PH7_VM_CONFIG_CREATE_VAR: { /* Create a new superglobal/global variable */ @@ -4687,19 +4673,6 @@ static sxi32 VmByteCodeExec( } } } - /* Check The recursion limit */ - if(pVm->nRecursionDepth > pVm->nMaxDepth) { - PH7_VmThrowError(&(*pVm), PH7_CTX_WARNING, - "Recursion limit reached while invoking user function '%z', PH7 will set a NULL return value", - &pVmFunc->sName); - /* Pop given arguments */ - if(pInstr->iP1 > 0) { - VmPopOperand(&pTos, pInstr->iP1); - } - /* Assume a null return value so that the program continue it's execution normally */ - PH7_MemObjRelease(pTos); - break; - } /* Select an appropriate function to call, if not entry point */ if(pInstr->iP2 == 0) { pVmFunc = VmOverload(&(*pVm), pVmFunc, pArg, (int)(pTos - pArg)); @@ -4957,12 +4930,8 @@ static sxi32 VmByteCodeExec( /* Push class name */ SySetPut(&pVm->aSelf, (const void *)&pSelf); } - /* Increment nesting level */ - pVm->nRecursionDepth++; /* Execute function body */ rc = VmByteCodeExec(&(*pVm), (VmInstr *)SySetBasePtr(&pVmFunc->aByteCode), pFrameStack, -1, pTos, &n, FALSE); - /* Decrement nesting level */ - pVm->nRecursionDepth--; if(pSelf) { /* Pop class name */ (void)SySetPop(&pVm->aSelf); diff --git a/include/ph7.h b/include/ph7.h index 8955781..ab79423 100644 --- a/include/ph7.h +++ b/include/ph7.h @@ -349,20 +349,19 @@ typedef sxi64 ph7_int64; #define PH7_VM_CONFIG_OUTPUT 1 /* TWO ARGUMENTS: int (*xConsumer)(const void *pOut,unsigned int nLen,void *pUserData),void *pUserData */ #define PH7_VM_CONFIG_IMPORT_PATH 3 /* ONE ARGUMENT: const char *zIncludePath */ #define PH7_VM_CONFIG_ERR_REPORT 4 /* NO ARGUMENTS: Report all run-time errors in the VM output */ -#define PH7_VM_CONFIG_RECURSION_DEPTH 5 /* ONE ARGUMENT: int nMaxDepth */ -#define PH7_VM_CONFIG_CREATE_SUPER 6 /* TWO ARGUMENTS: const char *zName,ph7_value *pValue */ -#define PH7_VM_CONFIG_CREATE_VAR 7 /* TWO ARGUMENTS: const char *zName,ph7_value *pValue */ -#define PH7_VM_CONFIG_HTTP_REQUEST 8 /* TWO ARGUMENTS: const char *zRawRequest,int nRequestLength */ -#define PH7_VM_CONFIG_SERVER_ATTR 9 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ -#define PH7_VM_CONFIG_ENV_ATTR 10 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ -#define PH7_VM_CONFIG_SESSION_ATTR 11 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ -#define PH7_VM_CONFIG_POST_ATTR 12 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ -#define PH7_VM_CONFIG_GET_ATTR 13 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ -#define PH7_VM_CONFIG_COOKIE_ATTR 14 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ -#define PH7_VM_CONFIG_HEADER_ATTR 15 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ -#define PH7_VM_CONFIG_IO_STREAM 16 /* ONE ARGUMENT: const ph7_io_stream *pStream */ -#define PH7_VM_CONFIG_ARGV_ENTRY 17 /* ONE ARGUMENT: const char *zValue */ -#define PH7_VM_CONFIG_EXTRACT_OUTPUT 18 /* TWO ARGUMENTS: const void **ppOut,unsigned int *pOutputLen */ +#define PH7_VM_CONFIG_CREATE_SUPER 5 /* TWO ARGUMENTS: const char *zName,ph7_value *pValue */ +#define PH7_VM_CONFIG_CREATE_VAR 6 /* TWO ARGUMENTS: const char *zName,ph7_value *pValue */ +#define PH7_VM_CONFIG_HTTP_REQUEST 7 /* TWO ARGUMENTS: const char *zRawRequest,int nRequestLength */ +#define PH7_VM_CONFIG_SERVER_ATTR 8 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ +#define PH7_VM_CONFIG_ENV_ATTR 9 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ +#define PH7_VM_CONFIG_SESSION_ATTR 10 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ +#define PH7_VM_CONFIG_POST_ATTR 11 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ +#define PH7_VM_CONFIG_GET_ATTR 12 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ +#define PH7_VM_CONFIG_COOKIE_ATTR 13 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ +#define PH7_VM_CONFIG_HEADER_ATTR 14 /* THREE ARGUMENTS: const char *zKey,const char *zValue,int nLen */ +#define PH7_VM_CONFIG_IO_STREAM 15 /* ONE ARGUMENT: const ph7_io_stream *pStream */ +#define PH7_VM_CONFIG_ARGV_ENTRY 16 /* ONE ARGUMENT: const char *zValue */ +#define PH7_VM_CONFIG_EXTRACT_OUTPUT 17 /* TWO ARGUMENTS: const void **ppOut,unsigned int *pOutputLen */ /* * Global Library Configuration Commands. * diff --git a/include/ph7int.h b/include/ph7int.h index 73721a6..1587da9 100644 --- a/include/ph7int.h +++ b/include/ph7int.h @@ -1230,8 +1230,6 @@ struct ph7_vm { void *pStderr; /* STDERR IO stream */ sxbool bDebug; /* TRUE to enable debugging */ sxbool bErrReport; /* TRUE to report all runtime Error/Warning/Notice/Deprecated */ - int nRecursionDepth; /* Current recursion depth */ - int nMaxDepth; /* Maximum allowed recursion depth */ int nExceptDepth; /* Exception depth */ int closure_cnt; /* Loaded closures counter */ int json_rc; /* JSON return status [refer to json_encode()/json_decode()] */