Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755509Ab2JPRgW (ORCPT ); Tue, 16 Oct 2012 13:36:22 -0400 Received: from mail-ie0-f174.google.com ([209.85.223.174]:61490 "EHLO mail-ie0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754864Ab2JPRgU (ORCPT ); Tue, 16 Oct 2012 13:36:20 -0400 MIME-Version: 1.0 In-Reply-To: <507D182E.9010902@suse.cz> References: <1350333533-13366-1-git-send-email-benjamin.tissoires@gmail.com> <507D182E.9010902@suse.cz> Date: Tue, 16 Oct 2012 19:36:20 +0200 Message-ID: Subject: Re: [PATCH v2] i2c-hid: introduce HID over i2c specification implementation From: Benjamin Tissoires To: Jiri Slaby Cc: Dmitry Torokhov , Jiri Kosina , Stephane Chatty , fabien.andre@gmail.com, scott.liu@emc.com.tw, Jean Delvare , JJ Ding , Shubhrajyoti Datta , linux-i2c@vger.kernel.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2364 Lines: 70 Hi Jiri, On Tue, Oct 16, 2012 at 10:17 AM, Jiri Slaby wrote: > On 10/15/2012 10:38 PM, Benjamin Tissoires wrote: >> Notes: >> {1}: I don't have all the informations in the beginning of the probe function to >> get the real size I need to allocate. So the behavior is to allocate first a >> buffer by using HID_MIN_BUFFER_SIZE and once I got the information, I can >> reallocate the buffer to the right size (in i2c_hid_start). > > And there is a bug in this. See below. > >> --- /dev/null >> +++ b/drivers/hid/i2c-hid/i2c-hid.c > ... >> +static int i2c_hid_alloc_buffers(struct i2c_hid *ihid) >> +{ >> + /* the worst case is computed from the set_report command with a >> + * reportID > 15 and the maximum report length */ >> + int args_len = sizeof(__u8) + /* optional ReportID byte */ >> + sizeof(__u16) + /* data register */ >> + sizeof(__u16) + /* size of the report */ >> + ihid->bufsize; /* report */ >> + >> + ihid->inbuf = kzalloc(ihid->bufsize, GFP_KERNEL); >> + >> + if (!ihid->inbuf) >> + return -ENOMEM; >> + >> + ihid->argsbuf = kzalloc(args_len, GFP_KERNEL); >> + >> + if (!ihid->argsbuf) { >> + kfree(ihid->inbuf); >> + return -ENOMEM; >> + } >> + >> + ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL); >> + >> + if (!ihid->cmdbuf) { >> + kfree(ihid->inbuf); >> + kfree(ihid->argsbuf); >> + return -ENOMEM; >> + } >> + >> + return 0; > > If this is called from hid_start and some of the latter allocation fails > here, you free the buffers appropriately. However if another start > occurs (e.g. by loading another module for that particular device), it > will crash, as the buffers will remain unallocated because at this point > ihid->bufsize == old_bufsize. You should set ihid->bufsize back to > old_bufsize if i2c_hid_alloc_buffers fails and also set the pointers to > NULL here. well spotted, thanks. I'll change it in v3 then. Cheers, Benjamin > > regards, > -- > js > suse labs -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/