if( chroot == NULL )
chroot = "";
chrootLen = strlen(chroot);
+ // Trim trailing slash off chroot
+ if( chrootLen && chroot[chrootLen - 1] == '/' )
+ chrootLen -= 1;
// Check if the path is already absolute
if(Path[0] == '/') {
// Length Check - If the length is smaller than the longest match sofar
if(mnt->MountPointLen < longestMount->MountPointLen) continue;
// String Compare
- cmp = strcmp(Path, mnt->MountPoint);
+ cmp = strncmp(Path, mnt->MountPoint, mnt->MountPointLen);
#if OPEN_MOUNT_ROOT
// Fast Break - Request Mount Root
- if(cmp == 0) {
+ if(Path[mnt->MountPointLen] == '\0') {
if(TruePath) {
*TruePath = malloc( mnt->MountPointLen+1 );
strcpy(*TruePath, mnt->MountPoint);
}
#endif
// Not a match, continue
- if(cmp != '/') continue;
+ if(cmp != 0) continue;
longestMount = mnt;
}
// Check permissions on root of filesystem
if( !VFS_CheckACL(curNode, VFS_PERM_EXECUTE) ) {
- //Log("Permissions fail on '%s'", Path);
+ LOG("Permissions failure on '%s'", Path);
goto _error;
}
// Check if the node has a FindDir method
if( !curNode->Type->FindDir )
{
- //Log("FindDir fail on '%s'", Path);
+ LOG("Finddir failure on '%s'", Path);
goto _error;
}
LOG("FindDir{=%p}(%p, '%s')", curNode->Type->FindDir, curNode, pathEle);
{
// TODO: Translate `Mode` into ACL and node flags
// Get parent, create node
- VFS_MkNod(absPath, 0);
+ if( VFS_MkNod(absPath, 0) ) {
+ free(absPath);
+ return -1;
+ }
node = VFS_ParsePath(absPath, NULL, &mnt);
}