From owner-svn-src-all@freebsd.org Mon Oct 26 18:02:53 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 2272144AEBA; Mon, 26 Oct 2020 18:02:53 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4CKjNs04VLz4YCg; Mon, 26 Oct 2020 18:02:53 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C062C1E17C; Mon, 26 Oct 2020 18:02:52 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09QI2qAZ037657; Mon, 26 Oct 2020 18:02:52 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09QI2qdq037656; Mon, 26 Oct 2020 18:02:52 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010261802.09QI2qdq037656@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Mon, 26 Oct 2020 18:02:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r367065 - head/sys/compat/linux X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: head/sys/compat/linux X-SVN-Commit-Revision: 367065 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Oct 2020 18:02:53 -0000 Author: mjg Date: Mon Oct 26 18:02:52 2020 New Revision: 367065 URL: https://svnweb.freebsd.org/changeset/base/367065 Log: linux: add missing conversions for compat.linux.use_emul_path handling Modified: head/sys/compat/linux/linux_file.c head/sys/compat/linux/linux_misc.c Modified: head/sys/compat/linux/linux_file.c ============================================================================== --- head/sys/compat/linux/linux_file.c Mon Oct 26 18:01:18 2020 (r367064) +++ head/sys/compat/linux/linux_file.c Mon Oct 26 18:02:52 2020 (r367065) @@ -109,14 +109,13 @@ linux_creat(struct thread *td, struct linux_creat_args int error; if (!LUSECONVPATH(td)) { - error = kern_openat(td, AT_FDCWD, args->path, UIO_USERSPACE, - O_WRONLY | O_CREAT | O_TRUNC, args->mode); - } else { - LCONVPATHEXIST(td, args->path, &path); - error = kern_openat(td, AT_FDCWD, path, UIO_SYSSPACE, - O_WRONLY | O_CREAT | O_TRUNC, args->mode); - LFREEPATH(path); + return (kern_openat(td, AT_FDCWD, args->path, UIO_USERSPACE, + O_WRONLY | O_CREAT | O_TRUNC, args->mode)); } + LCONVPATHEXIST(td, args->path, &path); + error = kern_openat(td, AT_FDCWD, path, UIO_SYSSPACE, + O_WRONLY | O_CREAT | O_TRUNC, args->mode); + LFREEPATH(path); return (error); } #endif @@ -627,30 +626,41 @@ linux_unlink(struct thread *td, struct linux_unlink_ar } #endif -int -linux_unlinkat(struct thread *td, struct linux_unlinkat_args *args) +static int +linux_unlinkat_impl(struct thread *td, enum uio_seg pathseg, const char *path, + int dfd, struct linux_unlinkat_args *args) { - char *path; - int error, dfd; struct stat st; + int error; - if (args->flag & ~LINUX_AT_REMOVEDIR) - return (EINVAL); - - dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; - LCONVPATHEXIST_AT(td, args->pathname, &path, dfd); - if (args->flag & LINUX_AT_REMOVEDIR) - error = kern_frmdirat(td, dfd, path, FD_NONE, UIO_SYSSPACE, 0); + error = kern_frmdirat(td, dfd, path, FD_NONE, pathseg, 0); else - error = kern_funlinkat(td, dfd, path, FD_NONE, UIO_SYSSPACE, 0, - 0); + error = kern_funlinkat(td, dfd, path, FD_NONE, pathseg, 0, 0); if (error == EPERM && !(args->flag & LINUX_AT_REMOVEDIR)) { /* Introduce POSIX noncompliant behaviour of Linux */ if (kern_statat(td, AT_SYMLINK_NOFOLLOW, dfd, path, UIO_SYSSPACE, &st, NULL) == 0 && S_ISDIR(st.st_mode)) error = EISDIR; } + return (error); +} + +int +linux_unlinkat(struct thread *td, struct linux_unlinkat_args *args) +{ + char *path; + int error, dfd; + + if (args->flag & ~LINUX_AT_REMOVEDIR) + return (EINVAL); + dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; + if (!LUSECONVPATH(td)) { + return (linux_unlinkat_impl(td, UIO_USERSPACE, args->pathname, + dfd, args)); + } + LCONVPATHEXIST_AT(td, args->pathname, &path, dfd); + error = linux_unlinkat_impl(td, UIO_SYSSPACE, path, dfd, args); LFREEPATH(path); return (error); } @@ -660,8 +670,10 @@ linux_chdir(struct thread *td, struct linux_chdir_args char *path; int error; + if (!LUSECONVPATH(td)) { + return (kern_chdir(td, args->path, UIO_USERSPACE)); + } LCONVPATHEXIST(td, args->path, &path); - error = kern_chdir(td, path, UIO_SYSSPACE); LFREEPATH(path); return (error); @@ -674,10 +686,12 @@ linux_chmod(struct thread *td, struct linux_chmod_args char *path; int error; + if (!LUSECONVPATH(td)) { + return (kern_fchmodat(td, AT_FDCWD, args->path, UIO_USERSPACE, + args->mode, 0)); + } LCONVPATHEXIST(td, args->path, &path); - - error = kern_fchmodat(td, AT_FDCWD, path, UIO_SYSSPACE, - args->mode, 0); + error = kern_fchmodat(td, AT_FDCWD, path, UIO_SYSSPACE, args->mode, 0); LFREEPATH(path); return (error); } @@ -690,8 +704,11 @@ linux_fchmodat(struct thread *td, struct linux_fchmoda int error, dfd; dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; + if (!LUSECONVPATH(td)) { + return (kern_fchmodat(td, dfd, args->filename, UIO_USERSPACE, + args->mode, 0)); + } LCONVPATHEXIST_AT(td, args->filename, &path, dfd); - error = kern_fchmodat(td, dfd, path, UIO_SYSSPACE, args->mode, 0); LFREEPATH(path); return (error); @@ -704,8 +721,10 @@ linux_mkdir(struct thread *td, struct linux_mkdir_args char *path; int error; + if (!LUSECONVPATH(td)) { + return (kern_mkdirat(td, AT_FDCWD, args->path, UIO_USERSPACE, args->mode)); + } LCONVPATHCREAT(td, args->path, &path); - error = kern_mkdirat(td, AT_FDCWD, path, UIO_SYSSPACE, args->mode); LFREEPATH(path); return (error); @@ -719,8 +738,10 @@ linux_mkdirat(struct thread *td, struct linux_mkdirat_ int error, dfd; dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; + if (!LUSECONVPATH(td)) { + return (kern_mkdirat(td, dfd, args->pathname, UIO_USERSPACE, args->mode)); + } LCONVPATHCREAT_AT(td, args->pathname, &path, dfd); - error = kern_mkdirat(td, dfd, path, UIO_SYSSPACE, args->mode); LFREEPATH(path); return (error); @@ -733,8 +754,11 @@ linux_rmdir(struct thread *td, struct linux_rmdir_args char *path; int error; + if (!LUSECONVPATH(td)) { + return (kern_frmdirat(td, AT_FDCWD, args->path, FD_NONE, + UIO_USERSPACE, 0)); + } LCONVPATHEXIST(td, args->path, &path); - error = kern_frmdirat(td, AT_FDCWD, path, FD_NONE, UIO_SYSSPACE, 0); LFREEPATH(path); return (error); @@ -746,6 +770,10 @@ linux_rename(struct thread *td, struct linux_rename_ar char *from, *to; int error; + if (!LUSECONVPATH(td)) { + return (kern_renameat(td, AT_FDCWD, args->from, AT_FDCWD, + args->to, UIO_USERSPACE)); + } LCONVPATHEXIST(td, args->from, &from); /* Expand LCONVPATHCREATE so that `from' can be freed on errors */ error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1, AT_FDCWD); @@ -753,7 +781,6 @@ linux_rename(struct thread *td, struct linux_rename_ar LFREEPATH(from); return (error); } - error = kern_renameat(td, AT_FDCWD, from, AT_FDCWD, to, UIO_SYSSPACE); LFREEPATH(from); LFREEPATH(to); @@ -796,6 +823,10 @@ linux_renameat2(struct thread *td, struct linux_rename olddfd = (args->olddfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->olddfd; newdfd = (args->newdfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->newdfd; + if (!LUSECONVPATH(td)) { + return (kern_renameat(td, olddfd, args->oldname, newdfd, + args->newname, UIO_USERSPACE)); + } LCONVPATHEXIST_AT(td, args->oldname, &from, olddfd); /* Expand LCONVPATHCREATE so that `from' can be freed on errors */ error = linux_emul_convpath(td, args->newname, UIO_USERSPACE, &to, 1, newdfd); @@ -803,7 +834,6 @@ linux_renameat2(struct thread *td, struct linux_rename LFREEPATH(from); return (error); } - error = kern_renameat(td, olddfd, from, newdfd, to, UIO_SYSSPACE); LFREEPATH(from); LFREEPATH(to); @@ -817,6 +847,10 @@ linux_symlink(struct thread *td, struct linux_symlink_ char *path, *to; int error; + if (!LUSECONVPATH(td)) { + return (kern_symlinkat(td, args->path, AT_FDCWD, args->to, + UIO_USERSPACE)); + } LCONVPATHEXIST(td, args->path, &path); /* Expand LCONVPATHCREATE so that `path' can be freed on errors */ error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1, AT_FDCWD); @@ -824,7 +858,6 @@ linux_symlink(struct thread *td, struct linux_symlink_ LFREEPATH(path); return (error); } - error = kern_symlinkat(td, path, AT_FDCWD, to, UIO_SYSSPACE); LFREEPATH(path); LFREEPATH(to); @@ -839,6 +872,10 @@ linux_symlinkat(struct thread *td, struct linux_symlin int error, dfd; dfd = (args->newdfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->newdfd; + if (!LUSECONVPATH(td)) { + return (kern_symlinkat(td, args->oldname, dfd, args->newname, + UIO_USERSPACE)); + } LCONVPATHEXIST(td, args->oldname, &path); /* Expand LCONVPATHCREATE so that `path' can be freed on errors */ error = linux_emul_convpath(td, args->newname, UIO_USERSPACE, &to, 1, dfd); @@ -846,7 +883,6 @@ linux_symlinkat(struct thread *td, struct linux_symlin LFREEPATH(path); return (error); } - error = kern_symlinkat(td, path, dfd, to, UIO_SYSSPACE); LFREEPATH(path); LFREEPATH(to); @@ -860,8 +896,11 @@ linux_readlink(struct thread *td, struct linux_readlin char *name; int error; + if (!LUSECONVPATH(td)) { + return (kern_readlinkat(td, AT_FDCWD, args->name, UIO_USERSPACE, + args->buf, UIO_USERSPACE, args->count)); + } LCONVPATHEXIST(td, args->name, &name); - error = kern_readlinkat(td, AT_FDCWD, name, UIO_SYSSPACE, args->buf, UIO_USERSPACE, args->count); LFREEPATH(name); @@ -876,8 +915,11 @@ linux_readlinkat(struct thread *td, struct linux_readl int error, dfd; dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; + if (!LUSECONVPATH(td)) { + return (kern_readlinkat(td, dfd, args->path, UIO_USERSPACE, + args->buf, UIO_USERSPACE, args->bufsiz)); + } LCONVPATHEXIST_AT(td, args->path, &name, dfd); - error = kern_readlinkat(td, dfd, name, UIO_SYSSPACE, args->buf, UIO_USERSPACE, args->bufsiz); LFREEPATH(name); @@ -890,6 +932,9 @@ linux_truncate(struct thread *td, struct linux_truncat char *path; int error; + if (!LUSECONVPATH(td)) { + return (kern_truncate(td, args->path, UIO_USERSPACE, args->length)); + } LCONVPATHEXIST(td, args->path, &path); error = kern_truncate(td, path, UIO_SYSSPACE, args->length); LFREEPATH(path); @@ -910,6 +955,9 @@ linux_truncate64(struct thread *td, struct linux_trunc length = args->length; #endif + if (!LUSECONVPATH(td)) { + return (kern_truncate(td, args->path, UIO_USERSPACE, length)); + } LCONVPATHEXIST(td, args->path, &path); error = kern_truncate(td, path, UIO_SYSSPACE, length); LFREEPATH(path); @@ -947,6 +995,10 @@ linux_link(struct thread *td, struct linux_link_args * char *path, *to; int error; + if (!LUSECONVPATH(td)) { + return (kern_linkat(td, AT_FDCWD, AT_FDCWD, args->path, args->to, + UIO_USERSPACE, FOLLOW)); + } LCONVPATHEXIST(td, args->path, &path); /* Expand LCONVPATHCREATE so that `path' can be freed on errors */ error = linux_emul_convpath(td, args->to, UIO_USERSPACE, &to, 1, AT_FDCWD); @@ -954,7 +1006,6 @@ linux_link(struct thread *td, struct linux_link_args * LFREEPATH(path); return (error); } - error = kern_linkat(td, AT_FDCWD, AT_FDCWD, path, to, UIO_SYSSPACE, FOLLOW); LFREEPATH(path); @@ -974,6 +1025,12 @@ linux_linkat(struct thread *td, struct linux_linkat_ar olddfd = (args->olddfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->olddfd; newdfd = (args->newdfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->newdfd; + follow = (args->flag & LINUX_AT_SYMLINK_FOLLOW) == 0 ? NOFOLLOW : + FOLLOW; + if (!LUSECONVPATH(td)) { + return (kern_linkat(td, olddfd, newdfd, args->oldname, + args->newname, UIO_USERSPACE, follow)); + } LCONVPATHEXIST_AT(td, args->oldname, &path, olddfd); /* Expand LCONVPATHCREATE so that `path' can be freed on errors */ error = linux_emul_convpath(td, args->newname, UIO_USERSPACE, &to, 1, newdfd); @@ -981,9 +1038,6 @@ linux_linkat(struct thread *td, struct linux_linkat_ar LFREEPATH(path); return (error); } - - follow = (args->flag & LINUX_AT_SYMLINK_FOLLOW) == 0 ? NOFOLLOW : - FOLLOW; error = kern_linkat(td, olddfd, newdfd, path, to, UIO_SYSSPACE, follow); LFREEPATH(path); LFREEPATH(to); @@ -1526,8 +1580,11 @@ linux_chown(struct thread *td, struct linux_chown_args char *path; int error; + if (!LUSECONVPATH(td)) { + return (kern_fchownat(td, AT_FDCWD, args->path, UIO_USERSPACE, + args->uid, args->gid, 0)); + } LCONVPATHEXIST(td, args->path, &path); - error = kern_fchownat(td, AT_FDCWD, path, UIO_SYSSPACE, args->uid, args->gid, 0); LFREEPATH(path); @@ -1545,10 +1602,13 @@ linux_fchownat(struct thread *td, struct linux_fchowna return (EINVAL); dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; - LCONVPATHEXIST_AT(td, args->filename, &path, dfd); - flag = (args->flag & LINUX_AT_SYMLINK_NOFOLLOW) == 0 ? 0 : AT_SYMLINK_NOFOLLOW; + if (!LUSECONVPATH(td)) { + return (kern_fchownat(td, dfd, args->filename, UIO_USERSPACE, + args->uid, args->gid, flag)); + } + LCONVPATHEXIST_AT(td, args->filename, &path, dfd); error = kern_fchownat(td, dfd, path, UIO_SYSSPACE, args->uid, args->gid, flag); LFREEPATH(path); @@ -1562,10 +1622,13 @@ linux_lchown(struct thread *td, struct linux_lchown_ar char *path; int error; + if (!LUSECONVPATH(td)) { + return (kern_fchownat(td, AT_FDCWD, args->path, UIO_USERSPACE, args->uid, + args->gid, AT_SYMLINK_NOFOLLOW)); + } LCONVPATHEXIST(td, args->path, &path); - - error = kern_fchownat(td, AT_FDCWD, path, UIO_SYSSPACE, args->uid, - args->gid, AT_SYMLINK_NOFOLLOW); + error = kern_fchownat(td, AT_FDCWD, path, UIO_SYSSPACE, args->uid, args->gid, + AT_SYMLINK_NOFOLLOW); LFREEPATH(path); return (error); } Modified: head/sys/compat/linux/linux_misc.c ============================================================================== --- head/sys/compat/linux/linux_misc.c Mon Oct 26 18:01:18 2020 (r367064) +++ head/sys/compat/linux/linux_misc.c Mon Oct 26 18:02:52 2020 (r367065) @@ -874,6 +874,13 @@ linux_utimensat(struct thread *td, struct linux_utimen return (0); } + if (!LUSECONVPATH(td)) { + if (args->pathname != NULL) { + return (kern_utimensat(td, dfd, args->pathname, + UIO_USERSPACE, timesp, UIO_SYSSPACE, flags)); + } + } + if (args->pathname != NULL) LCONVPATHEXIST_AT(td, args->pathname, &path, dfd); else if (args->flags != 0)