コード例 #1
0
        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);
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
ファイル: Exec.cs プロジェクト: samarunraj/expressos
        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;
        }
コード例 #6
0
ファイル: VirtualFileSystem.cs プロジェクト: kingst/expressos
        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;
        }
コード例 #7
0
ファイル: VirtualFileSystem.cs プロジェクト: kingst/expressos
        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;
        }