Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+16 −8
Original line number Original line Diff line number Diff line
@@ -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)
		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;