Author: kevans
Date: Sun Jan  5 04:06:40 2020
New Revision: 356372
URL: https://svnweb.freebsd.org/changeset/base/356372

Log:
  shm: correct KPI mistake introduced around memfd_create
  
  When file sealing and shm_open2 were introduced, we should have grown a new
  kern_shm_open2 helper that did the brunt of the work with the new interface
  while kern_shm_open remains the same. Instead, more complexity was
  introduced to kern_shm_open to handle the additional features and consumers
  had to keep changing in somewhat awkward ways, and a kern_shm_open2 was
  added to wrap kern_shm_open.
  
  Backpedal on this and correct the situation- kern_shm_open returns to the
  interface it had prior to file sealing being introduced, and neither
  function needs an initial_seals argument anymore as it's handled in
  kern_shm_open2 based on the shmflags.

Modified:
  head/sys/compat/cloudabi/cloudabi_fd.c
  head/sys/kern/uipc_shm.c
  head/sys/sys/syscallsubr.h

Modified: head/sys/compat/cloudabi/cloudabi_fd.c
==============================================================================
--- head/sys/compat/cloudabi/cloudabi_fd.c      Sun Jan  5 03:15:16 2020        
(r356371)
+++ head/sys/compat/cloudabi/cloudabi_fd.c      Sun Jan  5 04:06:40 2020        
(r356372)
@@ -96,7 +96,7 @@ cloudabi_sys_fd_create1(struct thread *td,
                cap_rights_init(&fcaps.fc_rights, CAP_FSTAT, CAP_FTRUNCATE,
                    CAP_MMAP_RWX);
                return (kern_shm_open(td, SHM_ANON, O_RDWR | O_CLOEXEC, 0,
-                   &fcaps, F_SEAL_SEAL));
+                   &fcaps));
        default:
                return (EINVAL);
        }

Modified: head/sys/kern/uipc_shm.c
==============================================================================
--- head/sys/kern/uipc_shm.c    Sun Jan  5 03:15:16 2020        (r356371)
+++ head/sys/kern/uipc_shm.c    Sun Jan  5 04:06:40 2020        (r356372)
@@ -731,8 +731,8 @@ shm_remove(char *path, Fnv32_t fnv, struct ucred *ucre
 }
 
 int
-kern_shm_open(struct thread *td, const char *userpath, int flags, mode_t mode,
-    struct filecaps *fcaps, int initial_seals)
+kern_shm_open2(struct thread *td, const char *userpath, int flags, mode_t mode,
+    int shmflags, struct filecaps *fcaps, const char *name __unused)
 {
        struct filedesc *fdp;
        struct shmfd *shmfd;
@@ -741,8 +741,15 @@ kern_shm_open(struct thread *td, const char *userpath,
        void *rl_cookie;
        Fnv32_t fnv;
        mode_t cmode;
-       int fd, error;
+       int error, fd, initial_seals;
 
+       if ((shmflags & ~SHM_ALLOW_SEALING) != 0)
+               return (EINVAL);
+
+       initial_seals = F_SEAL_SEAL;
+       if ((shmflags & SHM_ALLOW_SEALING) != 0)
+               initial_seals &= ~F_SEAL_SEAL;
+
 #ifdef CAPABILITY_MODE
        /*
         * shm_open(2) is only allowed for anonymous objects.
@@ -923,8 +930,8 @@ int
 freebsd12_shm_open(struct thread *td, struct freebsd12_shm_open_args *uap)
 {
 
-       return (kern_shm_open(td, uap->path, uap->flags | O_CLOEXEC, uap->mode,
-           NULL, F_SEAL_SEAL));
+       return (kern_shm_open(td, uap->path, uap->flags | O_CLOEXEC,
+           uap->mode, NULL));
 }
 #endif
 
@@ -1476,18 +1483,11 @@ SYSCTL_PROC(_kern_ipc, OID_AUTO, posix_shm_list,
     "POSIX SHM list");
 
 int
-kern_shm_open2(struct thread *td, const char *path, int flags, mode_t mode,
-    int shmflags, const char *name __unused)
+kern_shm_open(struct thread *td, const char *path, int flags, mode_t mode,
+    struct filecaps *caps)
 {
-       int initial_seals;
 
-       if ((shmflags & ~SHM_ALLOW_SEALING) != 0)
-               return (EINVAL);
-
-       initial_seals = F_SEAL_SEAL;
-       if ((shmflags & SHM_ALLOW_SEALING) != 0)
-               initial_seals &= ~F_SEAL_SEAL;
-       return (kern_shm_open(td, path, flags, mode, NULL, initial_seals));
+       return (kern_shm_open2(td, path, flags, mode, 0, caps, NULL));
 }
 
 /*
@@ -1505,5 +1505,5 @@ sys_shm_open2(struct thread *td, struct shm_open2_args
 {
 
        return (kern_shm_open2(td, uap->path, uap->flags, uap->mode,
-           uap->shmflags, uap->name));
+           uap->shmflags, NULL, uap->name));
 }

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h  Sun Jan  5 03:15:16 2020        (r356371)
+++ head/sys/sys/syscallsubr.h  Sun Jan  5 04:06:40 2020        (r356372)
@@ -257,9 +257,10 @@ int        kern_setsockopt(struct thread *td, int s, int 
leve
 int    kern_settimeofday(struct thread *td, struct timeval *tv,
            struct timezone *tzp);
 int    kern_shm_open(struct thread *td, const char *userpath, int flags,
-           mode_t mode, struct filecaps *fcaps, int initial_seals);
+           mode_t mode, struct filecaps *fcaps);
 int    kern_shm_open2(struct thread *td, const char *path, int flags,
-           mode_t mode, int shmflags, const char *name);
+           mode_t mode, int shmflags, struct filecaps *fcaps,
+           const char *name);
 int    kern_shmat(struct thread *td, int shmid, const void *shmaddr,
            int shmflg);
 int    kern_shmctl(struct thread *td, int shmid, int cmd, void *buf,
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to