mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
d34de06dcd
commit
f641a24097
|
@ -661,20 +661,23 @@ dirloop:
|
||||||
((cnp^.cn_flags and NOCROSSMOUNT)<>0)) then
|
((cnp^.cn_flags and NOCROSSMOUNT)<>0)) then
|
||||||
begin
|
begin
|
||||||
ndp^.ni_dvp:=dp;
|
ndp^.ni_dvp:=dp;
|
||||||
ndp^.ni_vp:=dp;
|
ndp^.ni_vp :=dp;
|
||||||
vfslocked:=VFS_LOCK_GIANT(dp^.v_mount);
|
vfslocked:=VFS_LOCK_GIANT(dp^.v_mount);
|
||||||
VREF(dp);
|
VREF(dp);
|
||||||
goto nextname;
|
goto nextname;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if ((dp^.v_vflag and VV_ROOT)=0) then
|
if ((dp^.v_vflag and VV_ROOT)=0) then
|
||||||
begin
|
begin
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if ((dp^.v_iflag and VI_DOOMED)<>0) then { forced unmount }
|
if ((dp^.v_iflag and VI_DOOMED)<>0) then { forced unmount }
|
||||||
begin
|
begin
|
||||||
error:=ENOENT;
|
error:=ENOENT;
|
||||||
goto bad;
|
goto bad;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
tdp:=dp;
|
tdp:=dp;
|
||||||
dp:=p_mount(dp^.v_mount)^.mnt_vnodecovered;
|
dp:=p_mount(dp^.v_mount)^.mnt_vnodecovered;
|
||||||
tvfslocked:=dvfslocked;
|
tvfslocked:=dvfslocked;
|
||||||
|
|
|
@ -117,20 +117,26 @@ end;
|
||||||
procedure set_rootvnode();
|
procedure set_rootvnode();
|
||||||
begin
|
begin
|
||||||
if (VFS_ROOT(TAILQ_FIRST(@mountlist), LK_EXCLUSIVE, @rootvnode)<>0) then
|
if (VFS_ROOT(TAILQ_FIRST(@mountlist), LK_EXCLUSIVE, @rootvnode)<>0) then
|
||||||
|
begin
|
||||||
Assert(False,'Cannot find root vnode');
|
Assert(False,'Cannot find root vnode');
|
||||||
|
end;
|
||||||
|
|
||||||
VOP_UNLOCK(rootvnode, 0);
|
VOP_UNLOCK(rootvnode, 0);
|
||||||
|
|
||||||
FILEDESC_XLOCK(@fd_table);
|
FILEDESC_XLOCK(@fd_table);
|
||||||
|
|
||||||
if (fd_table.fd_cdir<>nil) then
|
if (fd_table.fd_cdir<>nil) then
|
||||||
|
begin
|
||||||
vrele(fd_table.fd_cdir);
|
vrele(fd_table.fd_cdir);
|
||||||
|
end;
|
||||||
|
|
||||||
fd_table.fd_cdir:=rootvnode;
|
fd_table.fd_cdir:=rootvnode;
|
||||||
VREF(rootvnode);
|
VREF(rootvnode);
|
||||||
|
|
||||||
if (fd_table.fd_rdir<>nil) then
|
if (fd_table.fd_rdir<>nil) then
|
||||||
|
begin
|
||||||
vrele(fd_table.fd_rdir);
|
vrele(fd_table.fd_rdir);
|
||||||
|
end;
|
||||||
|
|
||||||
fd_table.fd_rdir:=rootvnode;
|
fd_table.fd_rdir:=rootvnode;
|
||||||
VREF(rootvnode);
|
VREF(rootvnode);
|
||||||
|
|
|
@ -754,6 +754,7 @@ var
|
||||||
begin
|
begin
|
||||||
VFS_ASSERT_GIANT(vp^.v_mount);
|
VFS_ASSERT_GIANT(vp^.v_mount);
|
||||||
FILEDESC_XLOCK(@fd_table);
|
FILEDESC_XLOCK(@fd_table);
|
||||||
|
|
||||||
if (chroot_allow_open_directories=0) or
|
if (chroot_allow_open_directories=0) or
|
||||||
((chroot_allow_open_directories=1) and (fd_table.fd_rdir<>rootvnode)) then
|
((chroot_allow_open_directories=1) and (fd_table.fd_rdir<>rootvnode)) then
|
||||||
begin
|
begin
|
||||||
|
@ -764,14 +765,17 @@ begin
|
||||||
Exit(error);
|
Exit(error);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
oldvp:=fd_table.fd_rdir;
|
oldvp:=fd_table.fd_rdir;
|
||||||
fd_table.fd_rdir:=vp;
|
fd_table.fd_rdir:=vp;
|
||||||
VREF(fd_table.fd_rdir);
|
VREF(fd_table.fd_rdir);
|
||||||
|
|
||||||
if (fd_table.fd_jdir=nil) then
|
if (fd_table.fd_jdir=nil) then
|
||||||
begin
|
begin
|
||||||
fd_table.fd_jdir:=vp;
|
fd_table.fd_jdir:=vp;
|
||||||
VREF(fd_table.fd_jdir);
|
VREF(fd_table.fd_jdir);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
FILEDESC_XUNLOCK(@fd_table);
|
FILEDESC_XUNLOCK(@fd_table);
|
||||||
vfslocked:=VFS_LOCK_GIANT(oldvp^.v_mount);
|
vfslocked:=VFS_LOCK_GIANT(oldvp^.v_mount);
|
||||||
vrele(oldvp);
|
vrele(oldvp);
|
||||||
|
@ -808,13 +812,19 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if ((flags and O_CREAT)<>0) then
|
if ((flags and O_CREAT)<>0) then
|
||||||
|
begin
|
||||||
rights:=rights or CAP_CREATE;
|
rights:=rights or CAP_CREATE;
|
||||||
|
end;
|
||||||
|
|
||||||
if ((flags and O_TRUNC)<>0) then
|
if ((flags and O_TRUNC)<>0) then
|
||||||
|
begin
|
||||||
rights:=rights or CAP_FTRUNCATE;
|
rights:=rights or CAP_FTRUNCATE;
|
||||||
|
end;
|
||||||
|
|
||||||
if ((flags and O_EXLOCK)<>0) or ((flags and O_SHLOCK)<>0) then
|
if ((flags and O_EXLOCK)<>0) or ((flags and O_SHLOCK)<>0) then
|
||||||
|
begin
|
||||||
rights:=rights or CAP_FLOCK;
|
rights:=rights or CAP_FLOCK;
|
||||||
|
end;
|
||||||
|
|
||||||
Exit(rights);
|
Exit(rights);
|
||||||
end;
|
end;
|
||||||
|
|
Loading…
Reference in New Issue