Author: dchagin
Date: Sun May 24 16:36:29 2015
New Revision: 283440
URL: https://svnweb.freebsd.org/changeset/base/283440

Log:
  For future use in the Linuxulator:
  
  1. Add a kern_kqueue() counterpart for kqueue() with flags parameter.
  
  2. Be a bit secure. To avoid a double fp lookup add a kern_kevent_fp()
  counterpart for kern_kevent() with file pointer parameter instead
  of file descriptor an pass the buck to it.
  
  Suggested by: mjg [2]
  
  Differential Revision:        https://reviews.freebsd.org/D1091
  Reviewed by:  trasz

Modified:
  head/sys/kern/kern_event.c
  head/sys/sys/syscallsubr.h

Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c  Sun May 24 16:34:57 2015        (r283439)
+++ head/sys/kern/kern_event.c  Sun May 24 16:36:29 2015        (r283440)
@@ -737,6 +737,13 @@ filt_usertouch(struct knote *kn, struct 
 int
 sys_kqueue(struct thread *td, struct kqueue_args *uap)
 {
+
+       return (kern_kqueue(td, 0));
+}
+
+int
+kern_kqueue(struct thread *td, int flags)
+{
        struct filedesc *fdp;
        struct kqueue *kq;
        struct file *fp;
@@ -757,7 +764,7 @@ sys_kqueue(struct thread *td, struct kqu
        PROC_UNLOCK(p);
 
        fdp = p->p_fd;
-       error = falloc(td, &fp, &fd, 0);
+       error = falloc(td, &fp, &fd, flags);
        if (error)
                goto done2;
 
@@ -888,12 +895,9 @@ int
 kern_kevent(struct thread *td, int fd, int nchanges, int nevents,
     struct kevent_copyops *k_ops, const struct timespec *timeout)
 {
-       struct kevent keva[KQ_NEVENTS];
-       struct kevent *kevp, *changes;
-       struct kqueue *kq;
-       struct file *fp;
        cap_rights_t rights;
-       int i, n, nerrors, error;
+       struct file *fp;
+       int error;
 
        cap_rights_init(&rights);
        if (nchanges > 0)
@@ -904,9 +908,24 @@ kern_kevent(struct thread *td, int fd, i
        if (error != 0)
                return (error);
 
+       error = kern_kevent_fp(td, fp, nchanges, nevents, k_ops, timeout);
+       fdrop(fp, td);
+
+       return (error);
+}
+
+int
+kern_kevent_fp(struct thread *td, struct file *fp, int nchanges, int nevents,
+    struct kevent_copyops *k_ops, const struct timespec *timeout)
+{
+       struct kevent keva[KQ_NEVENTS];
+       struct kevent *kevp, *changes;
+       struct kqueue *kq;
+       int i, n, nerrors, error;
+
        error = kqueue_acquire(fp, &kq);
        if (error != 0)
-               goto done_norel;
+               return (error);
 
        nerrors = 0;
 
@@ -946,8 +965,6 @@ kern_kevent(struct thread *td, int fd, i
        error = kqueue_scan(kq, nevents, k_ops, timeout, keva, td);
 done:
        kqueue_release(kq, 0);
-done_norel:
-       fdrop(fp, td);
        return (error);
 }
 

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h  Sun May 24 16:34:57 2015        (r283439)
+++ head/sys/sys/syscallsubr.h  Sun May 24 16:36:29 2015        (r283440)
@@ -121,6 +121,10 @@ int        kern_jail_get(struct thread *td, str
 int    kern_jail_set(struct thread *td, struct uio *options, int flags);
 int    kern_kevent(struct thread *td, int fd, int nchanges, int nevents,
            struct kevent_copyops *k_ops, const struct timespec *timeout);
+int    kern_kevent_fp(struct thread *td, struct file *fp, int nchanges,
+           int nevents, struct kevent_copyops *k_ops,
+           const struct timespec *timeout);
+int    kern_kqueue(struct thread *td, int flags);
 int    kern_kldload(struct thread *td, const char *file, int *fileid);
 int    kern_kldstat(struct thread *td, int fileid, struct kld_file_stat *stat);
 int    kern_kldunload(struct thread *td, int fileid, int flags);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to