Skip to contentSkip to conversation

UBIFS: replace simple_strtoul() with kstrtoint()

PATCH In review Zhang Zhen 2 participants 3 messages May 21, 2014 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

Zhang Zhen

author
#1 lore raw

PATCH v3 1/1 UBIFS: replace simple_strtoul() with kstrtoint()

use the newer and more pleasant kstrtoint() to replace simple_strtoul(), because simple_strtoul() is marked for obsoletion.

---
 drivers/mtd/ubi/build.c |  9 +++++----
 fs/ubifs/super.c        | 14 ++++++++++----
 2 files changed, 15 insertions(+), 8 deletions(-)
drivers/mtd/ubi/build.c +5 -4
index 6e30a3c..489f5ef 100644
@@ -1190,11 +1190,12 @@ static struct mtd_info * __init open_mtd_by_chdev(const char *mtd_dev)
 static struct mtd_info * __init open_mtd_device(const char *mtd_dev)
 {
 	struct mtd_info *mtd;
-	int mtd_num;
-	char *endp;
+	int mtd_num, ret;
 
-	mtd_num = simple_strtoul(mtd_dev, &endp, 0);
-	if (*endp != '\0' || mtd_dev == endp) {
+	ret = kstrtoint(mtd_dev, 0, &mtd_num);
+	if (ret)
+		return ERR_PTR(-EINVAL);
+	if (*mtd_dev != '\0') {
 		/*
 		 * This does not look like an ASCII integer, probably this is
 		 * MTD device name.
fs/ubifs/super.c +10 -4
index a81c7b5..4831b60 100644
@@ -1903,8 +1903,8 @@ const struct super_operations ubifs_super_operations = {
 static struct ubi_volume_desc *open_ubi(const char *name, int mode)
 {
 	struct ubi_volume_desc *ubi;
-	int dev, vol;
-	char *endptr;
+	int dev, vol, ret;
+	const char *endptr;
 
 	/* First, try to open using the device node path method */
 	ubi = ubi_open_volume_path(name, mode);
@@ -1922,7 +1922,10 @@ static struct ubi_volume_desc *open_ubi(const char *name, int mode)
 	if (!isdigit(name[3]))
 		return ERR_PTR(-EINVAL);
 
-	dev = simple_strtoul(name + 3, &endptr, 0);
+	endptr = name + 3;
+	ret = kstrtoint(endptr, 0, &dev);
+	if (ret)
+		return ERR_PTR(-EINVAL);
 
 	/* ubiY method */
 	if (*endptr == '\0')
@@ -1930,7 +1933,10 @@ static struct ubi_volume_desc *open_ubi(const char *name, int mode)
 
 	/* ubiX_Y method */
 	if (*endptr == '_' && isdigit(endptr[1])) {
-		vol = simple_strtoul(endptr + 1, &endptr, 0);
+		endptr = endptr + 1;
+		ret = kstrtoint(endptr, 0, &vol);
+		if (ret)
+			return ERR_PTR(-EINVAL);
 		if (*endptr != '\0')
 			return ERR_PTR(-EINVAL);
 		return ubi_open_volume(dev, vol, mode);
Signature · 4 lines
1.8.1.2


.
#2 lore raw

fs/ubifs/super.c static struct ubi_volume_desc *open_ubi(const char *name, int mode) · line 1925

Quoted 6 lines · Zhang Zhen
fs/ubifs/super.c +1 -1
@@ -1922,7 +1922,10 @@ static struct ubi_volume_desc *open_ubi(const char *name, int mode)
        if (!isdigit(name[3]))
                return ERR_PTR(-EINVAL);
 
-       dev = simple_strtoul(name + 3, &endptr, 0);
+       endptr = name + 3;

As Adrian pointed out, endptr is used later, and it must point to the character after the parsed number.

Quoted 7 lines
fs/ubifs/super.c +3 -0
+       ret = kstrtoint(endptr, 0, &dev);
+       if (ret)
+               return ERR_PTR(-EINVAL);
 
        /* ubiY method */
        if (*endptr == '\0')

fs/ubifs/super.c static struct ubi_volume_desc *open_ubi(const char *name, int mode) · line 1939

Quoted 8 lines
fs/ubifs/super.c +4 -1
@@ -1930,7 +1933,10 @@ static struct ubi_volume_desc *open_ubi(const char *name, int mode)
 
        /* ubiX_Y method */
        if (*endptr == '_' && isdigit(endptr[1])) {
-               vol = simple_strtoul(endptr + 1, &endptr, 0);
+               endptr = endptr + 1;
+               ret = kstrtoint(endptr, 0, &vol);
+               if (ret)
+                       return ERR_PTR(-EINVAL);

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

author
#3 lore raw
Quoted 11 lines · Geert Uytterhoeven

fs/ubifs/super.c static struct ubi_volume_desc *open_ubi(const char *name, int mode) · line 1925

Quoted 6 lines · Zhang Zhen
fs/ubifs/super.c +1 -1
@@ -1922,7 +1922,10 @@ static struct ubi_volume_desc *open_ubi(const char *name, int mode)
        if (!isdigit(name[3]))
                return ERR_PTR(-EINVAL);
 
-       dev = simple_strtoul(name + 3, &endptr, 0);
+       endptr = name + 3;

As Adrian pointed out, endptr is used later, and it must point to the character after the parsed number.

Okay, it appears kstrtoint is not suitable to replace the simple_strtoul here. The first argument of kstrto* can not point to the character after the parsed number.

Quoted 28 lines
Quoted 7 lines
fs/ubifs/super.c +3 -0
+       ret = kstrtoint(endptr, 0, &dev);
+       if (ret)
+               return ERR_PTR(-EINVAL);
 
        /* ubiY method */
        if (*endptr == '\0')

fs/ubifs/super.c static struct ubi_volume_desc *open_ubi(const char *name, int mode) · line 1939

Quoted 8 lines
fs/ubifs/super.c +4 -1
@@ -1930,7 +1933,10 @@ static struct ubi_volume_desc *open_ubi(const char *name, int mode)
 
        /* ubiX_Y method */
        if (*endptr == '_' && isdigit(endptr[1])) {
-               vol = simple_strtoul(endptr + 1, &endptr, 0);
+               endptr = endptr + 1;
+               ret = kstrtoint(endptr, 0, &vol);
+               if (ret)
+                       return ERR_PTR(-EINVAL);

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds