From: Michal Sojka Date: Thu, 20 Dec 2012 17:07:21 +0000 (+0100) Subject: Use goto to handle errors in initialization X-Git-Url: https://rtime.felk.cvut.cz/gitweb/can-eth-gw-linux.git/commitdiff_plain/12e4e3e792da87d6df95d1d1fbc6fc9685405b7e Use goto to handle errors in initialization This avoids repeating the cleanup commands everywhere. --- diff --git a/net/can/canethgw.c b/net/can/canethgw.c index 8bed57c9d76a..c851a792b634 100644 --- a/net/can/canethgw.c +++ b/net/can/canethgw.c @@ -288,46 +288,47 @@ static long cegw_ioctl_start(struct file *file, unsigned long arg) err = copy_from_user(&job->udp_dst, (void __user *)(arg + sizeof(struct cegw_ioctl)), dstcnt*addrlen); if (err != 0) { - kfree(job); - return -EFAULT; + err = -EFAULT; + goto err_free; } for (i=0; iudp_dst[i].sin_family != AF_INET) { - kfree(job); - return -EAFNOSUPPORT; + err = -EAFNOSUPPORT; + goto err_free; } } job->udp_sock = sockfd_lookup(gwctl.udp_sock, &err); - if (job->udp_sock == NULL) { - kfree(job); - return err; - } + if (job->udp_sock == NULL) + goto err_free; job->can_sock = sockfd_lookup(gwctl.can_sock, &err); - if (job->can_sock == NULL) { - fput(job->udp_sock->file); - kfree(job); - return err; - } + if (job->can_sock == NULL) + goto err_put_udp; if (job->can_sock->ops->family != AF_CAN || job->can_sock->type != SOCK_RAW) { - fput(job->udp_sock->file); - fput(job->can_sock->file); - kfree(job); - return -EBADF; + err = -EBADF; + goto err_put_all; } job->udp_dstcnt = dstcnt; err = cegw_thread_start(job); if (err != 0) - return err; + return err; /* cegw_thread_start performs cleaup for us. */ file->private_data = job; return 0; + +err_put_all: + fput(job->can_sock->file); +err_put_udp: + fput(job->udp_sock->file); +err_free: + kfree(job); + return err; } static long cegw_ioctl(struct file *file, unsigned int cmd, unsigned long arg)