Browse Source

Do not allow to call non-existen array/string index.

PHP returns a NULL for each call to non-existen array element, while AerScript design disallows usage of indexes outside the bounds. This fixes one of most serious PHP problems.
tags/v0.1.1^2
Rafal Kupiec 10 months ago
parent
commit
18b96064e4
Signed by: belliash <belliash@codingworkshop.eu.org> GPG Key ID: 4E829243E0CFE6B4
1 changed files with 8 additions and 12 deletions
  1. +8
    -12
      engine/vm.c

+ 8
- 12
engine/vm.c View File

@@ -2553,13 +2553,13 @@ static sxi32 VmByteCodeExec(
if(pIdx) {
sxu32 nOfft;
if((pIdx->nType & MEMOBJ_INT) == 0) {
/* Force an int cast */
PH7_MemObjToInteger(pIdx);
/* No available index */
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Index was outside the bounds of the array");
}
nOfft = (sxu32)pIdx->x.iVal;
if(nOfft >= SyBlobLength(&pTos->sBlob)) {
/* Invalid offset,load null */
PH7_MemObjRelease(pTos);
/* No available index */
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Index was outside the bounds of the array");
} else {
const char *zData = (const char *)SyBlobData(&pTos->sBlob);
int c = zData[nOfft];
@@ -2567,9 +2567,6 @@ static sxi32 VmByteCodeExec(
MemObjSetType(pTos, MEMOBJ_STRING);
SyBlobAppend(&pTos->sBlob, (const void *)&c, sizeof(char));
}
} else {
/* No available index,load NULL */
MemObjSetType(pTos, MEMOBJ_NULL);
}
break;
}
@@ -2599,8 +2596,8 @@ static sxi32 VmByteCodeExec(
if(rc == SXRET_OK) {
/* Load entry contents */
if(pMap->iRef < 2) {
/* TICKET 1433-42: Array will be deleted shortly,so we will make a copy
* of the entry value,rather than pointing to it.
/* TICKET 1433-42: Array will be deleted shortly, so we will make a copy
* of the entry value, rather than pointing to it.
*/
pTos->nIdx = SXU32_HIGH;
PH7_HashmapExtractNodeValue(pNode, pTos, TRUE);
@@ -2610,9 +2607,8 @@ static sxi32 VmByteCodeExec(
PH7_HashmapUnref(pMap);
}
} else {
/* No such entry, load NULL */
PH7_MemObjRelease(pTos);
pTos->nIdx = SXU32_HIGH;
/* No available index */
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Index was outside the bounds of the array");
}
break;
}


Loading…
Cancel
Save