Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/kern don't use pathbuf here; it is intertwined with vfs ...



details:   https://anonhg.NetBSD.org/src/rev/1d1f3460f41a
branches:  trunk
changeset: 322534:1d1f3460f41a
user:      christos <christos%NetBSD.org@localhost>
date:      Sun May 06 00:46:09 2018 +0000

description:
don't use pathbuf here; it is intertwined with vfs and gives rump heartburn.

diffstat:

 sys/kern/uipc_sem.c |  49 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 32 insertions(+), 17 deletions(-)

diffs (136 lines):

diff -r 37bc76986c8a -r 1d1f3460f41a sys/kern/uipc_sem.c
--- a/sys/kern/uipc_sem.c       Sat May 05 23:42:00 2018 +0000
+++ b/sys/kern/uipc_sem.c       Sun May 06 00:46:09 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uipc_sem.c,v 1.50 2018/05/05 22:14:45 christos Exp $   */
+/*     $NetBSD: uipc_sem.c,v 1.51 2018/05/06 00:46:09 christos Exp $   */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.50 2018/05/05 22:14:45 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.51 2018/05/06 00:46:09 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -72,7 +72,6 @@
 #include <sys/stat.h>
 #include <sys/kmem.h>
 #include <sys/fcntl.h>
-#include <sys/namei.h>
 #include <sys/file.h>
 #include <sys/filedesc.h>
 #include <sys/kauth.h>
@@ -137,6 +136,28 @@
 int ksem_max;
 
 static int
+name_copyin(const char *uname, char **name)
+{
+       *name = kmem_alloc(SEM_MAX_NAMELEN, KM_SLEEP);
+
+       int error = copyinstr(uname, *name, SEM_MAX_NAMELEN, NULL);
+       if (error)
+               kmem_free(*name, SEM_MAX_NAMELEN);
+
+       return error;
+}
+
+static void
+name_destroy(char **name)
+{
+       if (!*name)
+               return;
+
+       kmem_free(*name, SEM_MAX_NAMELEN);
+       *name = NULL;
+}
+
+static int
 ksem_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie,
     void *arg0, void *arg1, void *arg2, void *arg3)
 {
@@ -446,21 +467,20 @@
 do_ksem_open(struct lwp *l, const char *semname, int oflag, mode_t mode,
      unsigned int value, intptr_t *idp, copyout_t docopyout)
 {
-       const char *name;
-       struct pathbuf *pb;
+       char *name;
        proc_t *p = l->l_proc;
        ksem_t *ksnew = NULL, *ks;
        file_t *fp;
        intptr_t id;
        int fd, error;
 
-       error = pathbuf_copyin(semname, &pb);
+       error = name_copyin(semname, &name);
        if (error) {
                return error;
        }
        error = fd_allocfile(&fp, &fd);
        if (error) {
-               pathbuf_destroy(pb);
+               name_destroy(&name);
                return error;
        }
        fp->f_type = DTYPE_SEM;
@@ -477,12 +497,10 @@
                goto err;
        }
 
-       name = pathbuf_stringcopy_get(pb);
        if (oflag & O_CREAT) {
                /* Create a new semaphore. */
                error = ksem_create(l, name, &ksnew, mode, value);
                if (error) {
-                       pathbuf_stringcopy_put(pb, name);
                        goto err;
                }
                KASSERT(ksnew != NULL);
@@ -491,7 +509,7 @@
        /* Lookup for a semaphore with such name. */
        mutex_enter(&ksem_lock);
        ks = ksem_lookup(name);
-       pathbuf_stringcopy_put(pb, name);
+       name_destroy(&name);
        if (ks) {
                KASSERT(mutex_owned(&ks->ks_lock));
                mutex_exit(&ksem_lock);
@@ -545,7 +563,7 @@
        fp->f_ksem = ks;
        fd_affix(p, fp, fd);
 err:
-       pathbuf_destroy(pb);
+       name_destroy(&name);
        if (error) {
                fd_abort(p, fp, fd);
        }
@@ -647,21 +665,18 @@
        /* {
                const char *name;
        } */
-       const char *name;
-       struct pathbuf *pb;
+       char *name;
        ksem_t *ks;
        u_int refcnt;
        int error;
 
-       error = pathbuf_copyin(SCARG(uap, name), &pb);
+       error = name_copyin(SCARG(uap, name), &name);
        if (error)
                return error;
 
        mutex_enter(&ksem_lock);
-       name = pathbuf_stringcopy_get(pb);
        ks = ksem_lookup(name);
-       pathbuf_stringcopy_put(pb, name);
-       pathbuf_destroy(pb);
+       name_destroy(&name);
        if (ks == NULL) {
                mutex_exit(&ksem_lock);
                return ENOENT;



Home | Main Index | Thread Index | Old Index