[PATCH] uml: clean up error path
authorJeff Dike <jdike@addtoit.com>
Wed, 8 Jun 2005 22:48:27 +0000 (15:48 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 8 Jun 2005 23:21:12 +0000 (16:21 -0700)
This cleans an error path which used to leak file descriptors by returning
without trying to tidy up.

Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/um/drivers/chan_user.c

index 96f3a47..5d37681 100644 (file)
@@ -143,22 +143,22 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
 {
        struct winch_data data;
        unsigned long stack;
-       int fds[2], pid, n, err;
+       int fds[2], n, err;
        char c;
 
        err = os_pipe(fds, 1, 1);
        if(err < 0){
                printk("winch_tramp : os_pipe failed, err = %d\n", -err);
-               return(err);
+               goto out;
        }
 
        data = ((struct winch_data) { .pty_fd           = fd,
                                      .pipe_fd          = fds[1],
                                      .close_me         = fds[0] } );
-       pid = run_helper_thread(winch_thread, &data, 0, &stack, 0);
-       if(pid < 0){
+       err = run_helper_thread(winch_thread, &data, 0, &stack, 0);
+       if(err < 0){
                printk("fork of winch_thread failed - errno = %d\n", errno);
-               return(pid);
+               goto out_close;
        }
 
        os_close_file(fds[1]);
@@ -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("read failed, err = %d\n", -n);
                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)
 {
-       int pid, thread, thread_fd;
+       int pid, thread, thread_fd = -1;
        int count;
        char c = 1;