Module Name:    src
Committed By:   christos
Date:           Sun May  6 00:46:09 UTC 2018

Modified Files:
        src/sys/kern: uipc_sem.c

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


To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/sys/kern/uipc_sem.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/uipc_sem.c
diff -u src/sys/kern/uipc_sem.c:1.50 src/sys/kern/uipc_sem.c:1.51
--- src/sys/kern/uipc_sem.c:1.50	Sat May  5 18:14:45 2018
+++ src/sys/kern/uipc_sem.c	Sat May  5 20:46:09 2018
@@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v
 #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 @@ struct sysctllog *ksem_clog;
 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 @@ int
 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 @@ do_ksem_open(struct lwp *l, const char *
 		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 @@ do_ksem_open(struct lwp *l, const char *
 	/* 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 @@ do_ksem_open(struct lwp *l, const char *
 	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 @@ sys__ksem_unlink(struct lwp *l, const st
 	/* {
 		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;

Reply via email to