Module Name: src
Committed By: thorpej
Date: Mon Sep 27 00:51:10 UTC 2021
Modified Files:
src/sys/kern: sys_pipe.c
Log Message:
Tweak filt_piperead() and filt_pipewrite() so that:
- There is only a single return from the function (and thus a single
place where the pipe lock must be released).
- kn->kn_data is referenced only inside the lock perimeter.
To generate a diff of this commit:
cvs rdiff -u -r1.155 -r1.156 src/sys/kern/sys_pipe.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/sys_pipe.c
diff -u src/sys/kern/sys_pipe.c:1.155 src/sys/kern/sys_pipe.c:1.156
--- src/sys/kern/sys_pipe.c:1.155 Sun Sep 26 15:48:54 2021
+++ src/sys/kern/sys_pipe.c Mon Sep 27 00:51:10 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_pipe.c,v 1.155 2021/09/26 15:48:54 thorpej Exp $ */
+/* $NetBSD: sys_pipe.c,v 1.156 2021/09/27 00:51:10 thorpej Exp $ */
/*-
* Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.155 2021/09/26 15:48:54 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.156 2021/09/27 00:51:10 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1045,6 +1045,7 @@ filt_piperead(struct knote *kn, long hin
{
struct pipe *rpipe = ((file_t *)kn->kn_obj)->f_pipe;
struct pipe *wpipe;
+ int rv;
if ((hint & NOTE_SUBMIT) == 0) {
mutex_enter(rpipe->pipe_lock);
@@ -1055,16 +1056,15 @@ filt_piperead(struct knote *kn, long hin
if ((rpipe->pipe_state & PIPE_EOF) ||
(wpipe == NULL) || (wpipe->pipe_state & PIPE_EOF)) {
kn->kn_flags |= EV_EOF;
- if ((hint & NOTE_SUBMIT) == 0) {
- mutex_exit(rpipe->pipe_lock);
- }
- return (1);
+ rv = 1;
+ } else {
+ rv = kn->kn_data > 0;
}
if ((hint & NOTE_SUBMIT) == 0) {
mutex_exit(rpipe->pipe_lock);
}
- return (kn->kn_data > 0);
+ return rv;
}
static int
@@ -1072,6 +1072,7 @@ filt_pipewrite(struct knote *kn, long hi
{
struct pipe *rpipe = ((file_t *)kn->kn_obj)->f_pipe;
struct pipe *wpipe;
+ int rv;
if ((hint & NOTE_SUBMIT) == 0) {
mutex_enter(rpipe->pipe_lock);
@@ -1081,17 +1082,16 @@ filt_pipewrite(struct knote *kn, long hi
if ((wpipe == NULL) || (wpipe->pipe_state & PIPE_EOF)) {
kn->kn_data = 0;
kn->kn_flags |= EV_EOF;
- if ((hint & NOTE_SUBMIT) == 0) {
- mutex_exit(rpipe->pipe_lock);
- }
- return (1);
+ rv = 1;
+ } else {
+ kn->kn_data = wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt;
+ rv = kn->kn_data >= PIPE_BUF;
}
- kn->kn_data = wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt;
if ((hint & NOTE_SUBMIT) == 0) {
mutex_exit(rpipe->pipe_lock);
}
- return (kn->kn_data >= PIPE_BUF);
+ return rv;
}
static const struct filterops pipe_rfiltops = {