From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752989AbcLHLdh (ORCPT ); Thu, 8 Dec 2016 06:33:37 -0500 Received: from mout.web.de ([217.72.192.78]:49599 "EHLO mout.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751704AbcLHLdd (ORCPT ); Thu, 8 Dec 2016 06:33:33 -0500 Subject: [PATCH 1/5] staging: comedi: serial2002: Combine four kcalloc() calls into one in serial2002_setup_subdevs() To: devel@driverdev.osuosl.org, Chris Cesare , Greg Kroah-Hartman , H Hartley Sweeten , Ian Abbott References: <8cddc37d-4529-ada4-ac21-20e09e888d0d@users.sourceforge.net> Cc: LKML , kernel-janitors@vger.kernel.org From: SF Markus Elfring Message-ID: <011f1cb9-481c-9d9c-bcf5-8373f1796a0a@users.sourceforge.net> Date: Thu, 8 Dec 2016 12:33:02 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: <8cddc37d-4529-ada4-ac21-20e09e888d0d@users.sourceforge.net> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:FXP8NX5fSrWsuy03w04r9VNLo2kW8qOtR7d+yBjxc39Sek79Srw 048zFbnXz9zP/QCGev9to5LS+LA4JL0sK4Nwo4zwWaBYPGs9sdeBNDJ3O8K0XT77MP/o3Yg MgoG5NoojJZOyPykEkfrWalHfU2KoFwhq6CHGZ9Ql8dfg7d53tHe1ZJmuO3jHRwQqC1d3Cw Ry2RNcR0LEVEJyH+nlQdQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:46AwLJfB/Fw=:jg58epXdMIETAbTj6nMUqK 5vJKPmg/Cdn2R14b8dFMOyi64p8zTYl6DxBwdSrfV602RwnxXpRuCLKj+8hBGf/17nsp3cPhn +Pp7ZtvryUKRFWkR+9QHh403+lcYS7IMOLs5mGEd8NnKzLRaAJWCYuLhW334YDBYU1+y258xj Kz4llcByqkzhfNLxc2in9Q8TBN6G3h4GrO2JsfAN9Z2jmTpGn7bWx5mrmRmBbcEtkINCgA6P5 8lRvmENEP8o1PVD5HZ7SiQSq2bDAQmxuxpl4izvEUcAK0AJ/Wj5SCX35l1diGpm5uCHtTagK3 56kz1yVH35G0tJS/thdkbQaeR1zFmowZDAFcpnvZW9slzaASO8o3X7GBUIFflwNnE0mQUGIfC cly5LTrlMeHUX0VxKBgDOg7Wdqsblffm6w52ySCPBKCh9q4lUvKzS9W06wk0Qv2Fb8RwiPwty O9aQ6iAlaGK/G1OLKg7HvAD7thzLBMoMC3aNWNJk9Q/Efcce9Rtv4qVxYq2SWRohbjMsrOrwG sfjmyUxojmqWQTi59h8GFIYictGKOWyWDuj2/67QIpTIUpuEsEZeCdKo+eh052J1emwi21wrH 8I9BnWjBmrwDpZBQKHfefSXBvuoqcv8Wnh7uOtqDAnD1aKPt3nLWR0ki7A5dww/ML6rhcBUjZ sd/nWZudC44HRkATbUgWkVwW0TOVb8/elq3WpOL+XOoNi2rywY61UpN7/r4CKgzhhnIWfz6+X cmtKc6nKzvX8L2HpoMm1iCoeiQKNa0KSE8dV33WyNIG+Uz4GbezG4zbLr7D89H4l79m1R72EH jKc1wbd Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Markus Elfring Date: Thu, 8 Dec 2016 07:37:29 +0100 The function "kcalloc" was called in three cases by the function "serial2002_setup_subdevs" without checking immediately if it failed. This issue was detected by using the Coccinelle software. * Perform the desired memory allocation (and release at the end) by a single function call instead. * Adjust a jump target so that a redundant check is avoided. Fixes: 623a73926c7012e3bb132e225621890207f5c611 ("staging: comedi: serial2002: split up serial_2002_open()") Signed-off-by: Markus Elfring --- drivers/staging/comedi/drivers/serial2002.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c index 0d33e520f635..9542f4f8afe0 100644 --- a/drivers/staging/comedi/drivers/serial2002.c +++ b/drivers/staging/comedi/drivers/serial2002.c @@ -392,6 +392,7 @@ static int serial2002_setup_subdevice(struct comedi_subdevice *s, static int serial2002_setup_subdevs(struct comedi_device *dev) { struct serial2002_private *devpriv = dev->private; + struct config_t *array; struct config_t *di_cfg; struct config_t *do_cfg; struct config_t *ai_cfg; @@ -402,15 +403,17 @@ static int serial2002_setup_subdevs(struct comedi_device *dev) int i; /* Allocate the temporary structs to hold the configuration data */ - di_cfg = kcalloc(32, sizeof(*cfg), GFP_KERNEL); - do_cfg = kcalloc(32, sizeof(*cfg), GFP_KERNEL); - ai_cfg = kcalloc(32, sizeof(*cfg), GFP_KERNEL); - ao_cfg = kcalloc(32, sizeof(*cfg), GFP_KERNEL); - if (!di_cfg || !do_cfg || !ai_cfg || !ao_cfg) { + array = kcalloc(4 * 32, sizeof(*cfg), GFP_KERNEL); + if (!array) { result = -ENOMEM; - goto err_alloc_configs; + goto check_tty; } + di_cfg = array; + do_cfg = array + 1 * 32; + ai_cfg = array + 2 * 32; + ao_cfg = array + 3 * 32; + /* Read the configuration from the connected device */ serial2002_tty_setspeed(devpriv->tty, devpriv->speed); serial2002_poll_channel(devpriv->tty, 31); @@ -534,13 +537,10 @@ static int serial2002_setup_subdevs(struct comedi_device *dev) } } -err_alloc_configs: - kfree(di_cfg); - kfree(do_cfg); - kfree(ai_cfg); - kfree(ao_cfg); + kfree(array); if (result) { +check_tty: if (devpriv->tty) { filp_close(devpriv->tty, NULL); devpriv->tty = NULL; -- 2.11.0