From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755803AbbDIP2o (ORCPT ); Thu, 9 Apr 2015 11:28:44 -0400 Received: from mail-wi0-f181.google.com ([209.85.212.181]:35315 "EHLO mail-wi0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755650AbbDIP2b (ORCPT ); Thu, 9 Apr 2015 11:28:31 -0400 Date: Thu, 9 Apr 2015 18:28:27 +0300 From: Alexey Dobriyan To: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org Subject: Re: [PATCH] Add parse_integer() (replacement for simple_strto*()) Message-ID: <20150409152827.GB14850@p183.telecom.by> References: <20150409152613.GA14850@p183.telecom.by> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150409152613.GA14850@p183.telecom.by> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 09, 2015 at 06:26:14PM +0300, Alexey Dobriyan wrote: > int parse_integer(const char *s, unsigned int base, T *val); This is an example how conversion looks like (for mm/ directory): --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4187,20 +4187,23 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of, struct fd efile; struct fd cfile; const char *name; - char *endp; int ret; buf = strstrip(buf); - efd = simple_strtoul(buf, &endp, 10); - if (*endp != ' ') + ret = parse_integer(buf, 10, &efd); + if (ret < 0) + return ret; + if (buf[ret] != ' ') return -EINVAL; - buf = endp + 1; + buf += ret + 1; - cfd = simple_strtoul(buf, &endp, 10); - if ((*endp != ' ') && (*endp != '\0')) + ret = parse_integer(buf, 10, &cfd); + if (ret < 0) + return ret; + if (buf[ret] != ' ' && buf[ret] != '\0') return -EINVAL; - buf = endp + 1; + buf += ret + 1; event = kzalloc(sizeof(*event), GFP_KERNEL); if (!event) --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5977,7 +5977,7 @@ static int __init set_hashdist(char *str) { if (!str) return 0; - hashdist = simple_strtoul(str, &str, 0); + parse_integer(str, 0, &hashdist); return 1; } __setup("hashdist=", set_hashdist); --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2742,6 +2742,7 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo, struct mempolicy *mpol = NULL; uid_t uid; gid_t gid; + int rv; while (options != NULL) { this_char = options; @@ -2795,14 +2796,15 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo, } else if (!strcmp(this_char,"mode")) { if (remount) continue; - sbinfo->mode = simple_strtoul(value, &rest, 8) & 07777; - if (*rest) + rv = parse_integer(value, 8, &sbinfo->mode); + if (rv < 0 || value[rv]) goto bad_val; + sbinfo->mode &= 07777; } else if (!strcmp(this_char,"uid")) { if (remount) continue; - uid = simple_strtoul(value, &rest, 0); - if (*rest) + rv = parse_integer(value, 0, &uid); + if (rv < 0 || value[rv]) goto bad_val; sbinfo->uid = make_kuid(current_user_ns(), uid); if (!uid_valid(sbinfo->uid)) @@ -2810,8 +2812,8 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo, } else if (!strcmp(this_char,"gid")) { if (remount) continue; - gid = simple_strtoul(value, &rest, 0); - if (*rest) + rv = parse_integer(value, 0, &gid); + if (rv < 0 || value[rv]) goto bad_val; sbinfo->gid = make_kgid(current_user_ns(), gid); if (!gid_valid(sbinfo->gid))