Commit 1f96ddb4 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

[PATCH] uml: clean up error path

This cleans an error path which used to leak file descriptors by returning
without trying to tidy up.
Signed-off-by: default avatarJeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 501cb02b
...@@ -143,22 +143,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out) ...@@ -143,22 +143,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
{ {
struct winch_data data; struct winch_data data;
unsigned long stack; unsigned long stack;
int fds[2], pid, n, err; int fds[2], n, err;
char c; char c;
err = os_pipe(fds, 1, 1); err = os_pipe(fds, 1, 1);
if(err < 0){ if(err < 0){
printk("winch_tramp : os_pipe failed, err = %d\n", -err); printk("winch_tramp : os_pipe failed, err = %d\n", -err);
return(err); goto out;
} }
data = ((struct winch_data) { .pty_fd = fd, data = ((struct winch_data) { .pty_fd = fd,
.pipe_fd = fds[1], .pipe_fd = fds[1],
.close_me = fds[0] } ); .close_me = fds[0] } );
pid = run_helper_thread(winch_thread, &data, 0, &stack, 0); err = run_helper_thread(winch_thread, &data, 0, &stack, 0);
if(pid < 0){ if(err < 0){
printk("fork of winch_thread failed - errno = %d\n", errno); printk("fork of winch_thread failed - errno = %d\n", errno);
return(pid); goto out_close;
} }
os_close_file(fds[1]); os_close_file(fds[1]);
...@@ -168,14 +168,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out) ...@@ -168,14 +168,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
printk("winch_tramp : failed to read synchronization byte\n"); printk("winch_tramp : failed to read synchronization byte\n");
printk("read failed, err = %d\n", -n); printk("read failed, err = %d\n", -n);
printk("fd %d will not support SIGWINCH\n", fd); printk("fd %d will not support SIGWINCH\n", fd);
pid = -1; err = -EINVAL;
goto out_close1;
} }
return(pid); return err ;
out_close:
os_close_file(fds[1]);
out_close1:
os_close_file(fds[0]);
out:
return err;
} }
void register_winch(int fd, struct tty_struct *tty) void register_winch(int fd, struct tty_struct *tty)
{ {
int pid, thread, thread_fd; int pid, thread, thread_fd = -1;
int count; int count;
char c = 1; char c = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment