Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753598AbbFXRka (ORCPT ); Wed, 24 Jun 2015 13:40:30 -0400 Received: from mail-wi0-f176.google.com ([209.85.212.176]:37059 "EHLO mail-wi0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752868AbbFXRkS (ORCPT ); Wed, 24 Jun 2015 13:40:18 -0400 Date: Wed, 24 Jun 2015 19:46:18 +0200 From: Luis de Bethencourt To: Sudip Mukherjee Cc: Dan Carpenter , devel@driverdev.osuosl.org, Kirk Reiser , Greg Kroah-Hartman , speakup@linux-speakup.org, Melike Yurtoglu , linux-kernel@vger.kernel.org, Domagoj Trsan , Samuel Thibault , Chris Brannon Subject: Re: [PATCH] staging: speakup: replace simple_strtoul() with kstrtoint() Message-ID: <20150624174614.GA18762@goodgumbo.baconseed.org> References: <20150623204711.GA18380@turing> <20150623225333.GQ28762@mwanda> <20150623231552.GA19085@turing> <20150624052330.GA3881@sudip-PC> <20150624101927.GB30628@goodgumbo.baconseed.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150624101927.GB30628@goodgumbo.baconseed.org> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3418 Lines: 85 On Wed, Jun 24, 2015 at 12:19:27PM +0200, Luis de Bethencourt wrote: > On Wed, Jun 24, 2015 at 10:53:30AM +0530, Sudip Mukherjee wrote: > > On Wed, Jun 24, 2015 at 12:15:52AM +0100, Luis de Bethencourt wrote: > > > On Wed, Jun 24, 2015 at 01:53:33AM +0300, Dan Carpenter wrote: > > > > Nope. Your patch is totally wrong (buggy). Please be more careful in > > > > the future. > > > > > > > > regards, > > > > dan carpenter > > > > > > > > > > I saw other commits replace the obsolete simple_strtoul() this way and the > > > documentation makes it look like it is a 1 to 1 replacement. > > > > > > Sorry about this. I will investigate further to understand why this is buggy > > > and be more careful in the future. > > simple_strtoul returns unsigned long and kstrtoint gives int. > > documentation says to use kstrtoul. > > > > regards > > sudip > > Hello again Sudip :) > > simple_strtoul returns an unsigned long, but in this case this is downcasted to > int val. If we use kstrtoul there would be a type warning since the function > expects the reference to an unsigned long. Which is why I used the related > kstrtoint. > > Dan has said this is buggy. I have an idea why this might be. I am isolating > the code and playing with it before submitting a second version. > > Thanks for the review. > > Luis Hi, I've investigated the issue and found the two differences between simple_stroull() and kstrtoull(). The prototypes for reference: unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base); int kstrtoul(const char *s, unsigned int base, unsigned long *res); The first issue is that simple_strtoull() moves the endp pointer to right after the character where the last digit used is. [0] kstrtoull() doesn't move any pointers or tell us how many characters of the string it read. Speakup uses this to convert a string including 3 numbers into 3 ascii codes. For example "97 98 99", to get 'a', 'b', and 'c'. It loops 3 times using this function moving the start (cp) to the endp of the previous iteration. [1] The second issue is that kstrtoull() checks for the number to be alone in the string. [2] Where rv equals the number of characters read. s += rv; if (*s == '\n') s++; if (*s) { return -EINVAL; } So in our case before in speakup, after reading the first number s points to the empty character between 97 and 98 and it returns -EINVAL. IMHO there are 3 things I could do: - Split the initial string into 3, and use simple_strtoull() - Implement speakup's 3 number string into 3 chars differently. - Remain using simple_strtoull() and ignore the deprecated warnings. What do you guys think? I'm inclined towards the first if there is interest. Thanks, Luis [0] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/boot/string.c?id=b953c0d234bc72e8489d3bf51a276c5c4ec85345#n118 [1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/staging/speakup/kobjects.c?id=b953c0d234bc72e8489d3bf51a276c5c4ec85345#n284 [2] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/lib/kstrtox.c?id=b953c0d234bc72e8489d3bf51a276c5c4ec85345#n91 -- 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/