From 29b3a1a054eda4b49e35723c6f82249edc22b267 Mon Sep 17 00:00:00 2001 From: trasz Date: Sun, 19 Mar 2017 10:32:39 +0000 Subject: MFC r313283: Fix linux_pipe() and linux_pipe2() to close file descriptors on copyout error. --- sys/compat/linux/linux_file.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'sys/compat/linux/linux_file.c') diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index 5fb41c4..dfc7f7c 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -1629,11 +1629,16 @@ linux_pipe(struct thread *td, struct linux_pipe_args *args) #endif error = kern_pipe(td, fildes, 0, NULL, NULL); - if (error) + if (error != 0) return (error); - /* XXX: Close descriptors on error. */ - return (copyout(fildes, args->pipefds, sizeof(fildes))); + error = copyout(fildes, args->pipefds, sizeof(fildes)); + if (error != 0) { + (void)kern_close(td, fildes[0]); + (void)kern_close(td, fildes[1]); + } + + return (error); } int @@ -1656,11 +1661,16 @@ linux_pipe2(struct thread *td, struct linux_pipe2_args *args) if ((args->flags & LINUX_O_CLOEXEC) != 0) flags |= O_CLOEXEC; error = kern_pipe(td, fildes, flags, NULL, NULL); - if (error) + if (error != 0) return (error); - /* XXX: Close descriptors on error. */ - return (copyout(fildes, args->pipefds, sizeof(fildes))); + error = copyout(fildes, args->pipefds, sizeof(fildes)); + if (error != 0) { + (void)kern_close(td, fildes[0]); + (void)kern_close(td, fildes[1]); + } + + return (error); } int -- cgit v1.1