diff --git a/engine/api.c b/engine/api.c index 8d2b57c..5ede5c0 100644 --- a/engine/api.c +++ b/engine/api.c @@ -648,7 +648,7 @@ static sxi32 ProcessScript( } if(zFilePath) { /* Push processed file path */ - PH7_VmPushFilePath(pVm, zFilePath, -1, TRUE, 0); + PH7_VmPushFilePath(pVm, zFilePath, TRUE, 0); } /* Reset the error message consumer */ SyBlobReset(&pEngine->xConf.sErrConsumer); diff --git a/engine/lib/string.c b/engine/lib/string.c index f714568..c1ac7f5 100644 --- a/engine/lib/string.c +++ b/engine/lib/string.c @@ -339,4 +339,4 @@ sxi32 SyAsciiToHex(sxi32 c) { return c; } return 0; -} \ No newline at end of file +} diff --git a/engine/lib/utils.c b/engine/lib/utils.c index f864024..7021778 100644 --- a/engine/lib/utils.c +++ b/engine/lib/utils.c @@ -628,4 +628,15 @@ PH7_PRIVATE sxi32 SyStrToReal(const char *zSrc, sxu32 nLen, void *pOutVal, const *(sxreal *)pOutVal = Val; } return zSrc >= zEnd ? SXRET_OK : SXERR_SYNTAX; -} \ No newline at end of file +} + +PH7_PRIVATE sxi32 SyRealpath(const char *zPath, char **fPath) { +#ifdef __UNIXES__ + if(realpath(zPath, fPath) == NULL) { +#else + if(GetFullPathName(zPath, PATH_MAX, fPath, NULL) != 0) { +#endif + return PH7_IO_ERR; + } + return PH7_OK; +} diff --git a/engine/vfs.c b/engine/vfs.c index a8c75ab..a63ff24 100644 --- a/engine/vfs.c +++ b/engine/vfs.c @@ -2907,7 +2907,7 @@ PH7_PRIVATE void *PH7_StreamOpenHandle(ph7_vm *pVm, const ph7_io_stream *pStream if(rc == PH7_OK) { if(bPushInclude) { /* Mark as included */ - PH7_VmPushFilePath(pVm, (const char *)SyBlobData(&sWorker), SyBlobLength(&sWorker), FALSE, pNew); + PH7_VmPushFilePath(pVm, (const char *)SyBlobData(&sWorker), FALSE, pNew); } break; } @@ -2920,7 +2920,7 @@ PH7_PRIVATE void *PH7_StreamOpenHandle(ph7_vm *pVm, const ph7_io_stream *pStream if(rc == PH7_OK) { if(bPushInclude) { /* Mark as included */ - PH7_VmPushFilePath(pVm, sFile.zString, sFile.nByte, FALSE, pNew); + PH7_VmPushFilePath(pVm, sFile.zString, FALSE, pNew); } } } else { diff --git a/engine/vm.c b/engine/vm.c index 2b8b179..dd22f4d 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -10653,18 +10653,21 @@ static int VmIsIncludedFile(ph7_vm *pVm, SyString *pFile) { /* * Push a file path in the appropriate VM container. */ -PH7_PRIVATE sxi32 PH7_VmPushFilePath(ph7_vm *pVm, const char *zPath, int nLen, sxu8 bMain, sxi32 *pNew) { +PH7_PRIVATE sxi32 PH7_VmPushFilePath(ph7_vm *pVm, const char *zPath, sxu8 bMain, sxi32 *pNew) { SyString sPath; + char *fPath[PATH_MAX + 1]; char *zDup; #ifdef __WINNT__ char *zCur; #endif + sxi32 nLen; sxi32 rc; - if(nLen < 0) { - nLen = SyStrlen(zPath); + if(SyRealpath(zPath, fPath) != PH7_OK) { + return SXERR_IO; } + nLen = SyStrlen(fPath); /* Duplicate the file path first */ - zDup = SyMemBackendStrDup(&pVm->sAllocator, zPath, nLen); + zDup = SyMemBackendStrDup(&pVm->sAllocator, fPath, nLen); if(zDup == 0) { return SXERR_MEM; } @@ -10726,20 +10729,28 @@ static sxi32 VmExecIncludedFile( #ifndef PH7_DISABLE_BUILTIN_FUNC const ph7_io_stream *pStream; SyBlob sContents; + SyString zPath; void *pHandle; ph7_vm *pVm; + char fPath[PATH_MAX + 1]; int isNew; + sxi32 nLen; /* Initialize fields */ pVm = pCtx->pVm; SyBlobInit(&sContents, &pVm->sAllocator); isNew = 0; /* Extract the associated stream */ - pStream = PH7_VmGetStreamDevice(pVm, &pPath->zString, pPath->nByte); + if(SyRealpath(pPath->zString, fPath) != PH7_OK) { + return SXERR_IO; + } + nLen = SyStrlen(fPath); + SyStringInitFromBuf(&zPath, fPath, nLen); + pStream = PH7_VmGetStreamDevice(pVm, &zPath.zString, zPath.nByte); /* * Open the file or the URL [i.e: http://ph7.symisc.net/example/hello.php"] * in a read-only mode. */ - pHandle = PH7_StreamOpenHandle(pVm, pStream, pPath->zString, PH7_IO_OPEN_RDONLY, TRUE, 0, TRUE, &isNew); + pHandle = PH7_StreamOpenHandle(pVm, pStream, zPath.zString, PH7_IO_OPEN_RDONLY, TRUE, 0, TRUE, &isNew); if(pHandle == 0) { return SXERR_IO; } diff --git a/include/ph7.h b/include/ph7.h index 5052c23..69668f8 100644 --- a/include/ph7.h +++ b/include/ph7.h @@ -50,6 +50,11 @@ /* $SymiscID: ph7.h v2.1 UNIX|WIN32/64 2012-09-15 09:43 stable $ */ #include /* needed for the definition of va_list */ #include /* needed for the definition of snprintf */ +#include /* needed for PATH_MAX */ +#include +#ifndef PATH_MAX + #define PATH_MAX MAX_PATH +#endif /* * Compile time engine version, signature, identification in the symisc source tree * and copyright notice. diff --git a/include/ph7int.h b/include/ph7int.h index b8d972b..27d9709 100644 --- a/include/ph7int.h +++ b/include/ph7int.h @@ -1589,7 +1589,7 @@ PH7_PRIVATE sxi32 PH7_VmInstallUserFunction(ph7_vm *pVm, ph7_vm_func *pFunc, SyS PH7_PRIVATE sxi32 PH7_VmCreateClassInstanceFrame(ph7_vm *pVm, ph7_class_instance *pObj); PH7_PRIVATE sxi32 PH7_VmRefObjRemove(ph7_vm *pVm, sxu32 nIdx, SyHashEntry *pEntry, ph7_hashmap_node *pMapEntry); PH7_PRIVATE sxi32 PH7_VmRefObjInstall(ph7_vm *pVm, sxu32 nIdx, SyHashEntry *pEntry, ph7_hashmap_node *pMapEntry, sxi32 iFlags); -PH7_PRIVATE sxi32 PH7_VmPushFilePath(ph7_vm *pVm, const char *zPath, int nLen, sxu8 bMain, sxi32 *pNew); +PH7_PRIVATE sxi32 PH7_VmPushFilePath(ph7_vm *pVm, const char *zPath, sxu8 bMain, sxi32 *pNew); PH7_PRIVATE ph7_class *PH7_VmExtractClass(ph7_vm *pVm, const char *zName, sxu32 nByte, sxi32 iLoadable, sxi32 iNest); PH7_PRIVATE sxi32 PH7_VmRegisterConstant(ph7_vm *pVm, const SyString *pName, ProcConstant xExpand, void *pUserData); PH7_PRIVATE sxi32 PH7_VmInstallForeignFunction(ph7_vm *pVm, const SyString *pName, ProchHostFunction xFunc, void *pUserData); @@ -1854,4 +1854,5 @@ PH7_PRIVATE sxu32 SyStrlen(const char *zSrc); PH7_PRIVATE sxi32 SyMemBackendMakeThreadSafe(SyMemBackend *pBackend, const SyMutexMethods *pMethods); PH7_PRIVATE sxi32 SyMemBackendDisbaleMutexing(SyMemBackend *pBackend); #endif +PH7_PRIVATE sxi32 SyRealpath(const char *zPath, char **fPath); #endif /* __PH7INT_H__ */ diff --git a/sapi/cli/main.c b/sapi/cli/main.c index 7cf879c..4ab98b1 100644 --- a/sapi/cli/main.c +++ b/sapi/cli/main.c @@ -213,4 +213,4 @@ int main(int argc, char **argv) { ph7_vm_release(pVm); ph7_release(pEngine); return 0; -} \ No newline at end of file +}