public static int Pipe(Thread current, UserPtr pipeFd) { var proc = current.Parent; var helperPid = proc.helperPid; int fd0, fd1; var ret = Arch.IPCStubs.Pipe(helperPid, out fd0, out fd1); if (ret < 0) { return(ret); } var inode1 = new Arch.ArchINode(fd0, 0, helperPid); var inode2 = new Arch.ArchINode(fd1, 0, helperPid); // XXX: are the permission settings correct? var file1 = new File(proc, inode1, FileFlags.ReadWrite, 0); var rfd0 = proc.GetUnusedFd(); proc.InstallFd(rfd0, file1); var file2 = new File(proc, inode2, FileFlags.ReadWrite, 0); var rfd1 = proc.GetUnusedFd(); proc.InstallFd(rfd1, file2); //Arch.Console.Write("pipe: linux_fd ["); //Arch.Console.Write(fd0); //Arch.Console.Write(","); //Arch.Console.Write(fd1); //Arch.Console.Write("] => ["); //Arch.Console.Write(rfd0); //Arch.Console.Write(","); //Arch.Console.Write(rfd1); //Arch.Console.Write("], ret="); //Arch.Console.Write(ret); //Arch.Console.WriteLine(); if (pipeFd.Write(current, rfd0) != 0 || (pipeFd + sizeof(int)).Write(current, rfd1) != 0) { Arch.IPCStubs.Close(helperPid, fd0); Arch.IPCStubs.Close(helperPid, fd1); return(-ErrorCode.EFAULT); } return(ret); }
internal static void HandleOpenFileCompletion(OpenFileCompletion c, int linux_fd, int size) { var current = c.thr; var proc = current.Parent; GenericINode inode = null; int ret = linux_fd; if (ret < 0) { c.Dispose(); current.ReturnFromCompletion(ret); return; } switch (c.fileKind) { case GenericINode.INodeKind.ArchINodeKind: inode = new Arch.ArchINode(linux_fd, (uint)size, proc.helperPid); break; case GenericINode.INodeKind.SecureFSINodeKind: inode = SecureFS.HandleOpenFileCompletion(c, linux_fd, size, ref ret); break; default: break; } if (inode != null) { var file = new File(proc, inode, c.flags, c.mode); ret = proc.GetUnusedFd(); proc.InstallFd(ret, file); } c.Dispose(); current.ReturnFromCompletion(ret); return; }
internal static SecureFSInode Create(Thread current, ByteBufferRef header, int linux_fd, int size_on_disk, ref int p_ret) { var proc = current.Parent; int data_pgoffset; byte[] page_signatures; uint real_file_size; var ret = NativeMethods.sfs_initialize_and_verify_metadata(new Pointer(header.Location), header.Length, size_on_disk, out data_pgoffset, out real_file_size, out page_signatures); var metadata_verified = ret == 0; if (!metadata_verified) { Arch.Console.WriteLine("SFSINode::Failed to verify metadata"); p_ret = ret; return(null); } var access_permission_checked = Globals.SecurityManager.CanAccessFile(current, header); if (!access_permission_checked) { return(null); } var arch_inode = new Arch.ArchINode(linux_fd, (uint)size_on_disk, proc.helperPid); Contract.Assert(metadata_verified && access_permission_checked); var inode = new SecureFSInode(linux_fd, (uint)size_on_disk, proc.helperPid, real_file_size); inode.DataPageOffset = data_pgoffset; inode.Signatures = page_signatures; return(inode); }
private static ASCIIString[] CreateEnvpArrayWithWorkspace(ASCIIString[] envp, Process proc, int workspace_fd, uint workspace_size) { var res = new ASCIIString[envp.Length + 1]; for (int i = 0; i < envp.Length; ++i) { res[i] = envp[i]; } var inode = new Arch.ArchINode(workspace_fd, workspace_size, proc.helperPid); var file = new File(proc, inode, FileFlags.ReadOnly, 0); var fd = proc.GetUnusedFd(); proc.InstallFd(fd, file); var s = "ANDROID_PROPERTY_WORKSPACE=" + fd.ToString() + "," + workspace_size.ToString(); res[envp.Length] = new ASCIIString(s); return(res); }
private static ASCIIString[] CreateEnvpArrayWithWorkspace(ASCIIString[] envp, Process proc, int workspace_fd, uint workspace_size) { var res = new ASCIIString[envp.Length + 1]; for (int i = 0; i < envp.Length; ++i) res[i] = envp[i]; var inode = new Arch.ArchINode(workspace_fd, workspace_size, proc.helperPid); var file = new File(proc, inode, FileFlags.ReadOnly, 0); var fd = proc.GetUnusedFd(); proc.InstallFd(fd, file); var s = "ANDROID_PROPERTY_WORKSPACE=" + fd.ToString() + "," + workspace_size.ToString(); res[envp.Length] = new ASCIIString(s); return res; }
public static int Pipe(Thread current, UserPtr pipeFd) { var proc = current.Parent; var helperPid = proc.helperPid; int fd0, fd1; var ret = Arch.IPCStubs.Pipe(helperPid, out fd0, out fd1); if (ret < 0) return ret; var inode1 = new Arch.ArchINode(fd0, 0, helperPid); var inode2 = new Arch.ArchINode(fd1, 0, helperPid); // XXX: are the permission settings correct? var file1 = new File(proc, inode1, FileFlags.ReadWrite, 0); var rfd0 = proc.GetUnusedFd(); proc.InstallFd(rfd0, file1); var file2 = new File(proc, inode2, FileFlags.ReadWrite, 0); var rfd1 = proc.GetUnusedFd(); proc.InstallFd(rfd1, file2); //Arch.Console.Write("pipe: linux_fd ["); //Arch.Console.Write(fd0); //Arch.Console.Write(","); //Arch.Console.Write(fd1); //Arch.Console.Write("] => ["); //Arch.Console.Write(rfd0); //Arch.Console.Write(","); //Arch.Console.Write(rfd1); //Arch.Console.Write("], ret="); //Arch.Console.Write(ret); //Arch.Console.WriteLine(); if (pipeFd.Write(current, rfd0) != 0 || (pipeFd + sizeof(int)).Write(current, rfd1) != 0) { Arch.IPCStubs.Close(helperPid, fd0); Arch.IPCStubs.Close(helperPid, fd1); return -ErrorCode.EFAULT; } return ret; }