[PATCH 3/4] debugedit-classify-ar: Use strtol to parse -m argument

Mark Wielaard mark@klomp.org
Mon May 18 12:43:16 GMT 2026


We were using atoi to part the -m argument. atoi doesn't do any error
checking, so we might accept bogus arguments. Use strtol instead and
perform sanity checking producing an error when invoked with negative,
zero or non-numbers as argument.

Also pull max_members check into the elf = elf_begin while loop of
classify_ar_elf to stop iterating early.

	* tools/debugedit-classify-ar.c (max_members): Define as long.
	(classify_ar_elf): Define members as long. Pull max_members
	check into while loop.
	(main): Parse 'm' with strtol, reject non-numbers, zero or
	negative numbers.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 tools/debugedit-classify-ar.c | 38 ++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 14 deletions(-)

diff --git a/tools/debugedit-classify-ar.c b/tools/debugedit-classify-ar.c
index ae434f7a3d1a..eb6cbf702379 100644
--- a/tools/debugedit-classify-ar.c
+++ b/tools/debugedit-classify-ar.c
@@ -38,7 +38,7 @@
 static int verbose = 0;
 
 // Negative is infinite, zero is failure, positive is max number to accept.
-static int max_members = -1;
+static long max_members = -1;
 
 /* Returns -1 on error, 0 if member isn't an Elf objects or if it is
    an Elf object but doesn't contain any .[z]debug sections, 1 if it
@@ -109,7 +109,7 @@ classify_ar_member (Elf *member, const char *name, const char *file)
 static int
 classify_ar_elf (int fd, Elf *ar, const char *file)
 {
-  int members = 0;
+  long members = 0;
   bool err = false;
   bool found_debug = false;
   int cmd = ELF_C_READ;
@@ -144,10 +144,20 @@ classify_ar_elf (int fd, Elf *ar, const char *file)
 	  err = true;
 	}
 
+      if (!err)
+	{
+	  members++;
+
+	  if (max_members > 0 && members > max_members)
+	    {
+	      if (verbose > 0)
+		error (0, 0, "too many members (%ld): %s", members, file);
+	      err = true;
+	    }
+	}
+
       if (err)
 	break;
-
-      members++;
     }
 
   if (err)
@@ -160,13 +170,6 @@ classify_ar_elf (int fd, Elf *ar, const char *file)
       return -1;
     }
 
-  if (max_members > 0 && members > max_members)
-    {
-      if (verbose > 0)
-	error (0, 0, "too many members (%d): %s", members, file);
-      return -1;
-    }
-
   if (verbose > 0)
     error (0, 0, "found member(s) with debug sections: %s", file);
 
@@ -325,9 +328,16 @@ main (int argc, char **argv)
 	  break;
 
 	case 'm':
-	  max_members = atoi (optarg);
-	  if (max_members == 0)
-	    help (argv[0], true);
+	  {
+	    char *endptr;
+	    long val = strtol (optarg, &endptr, 10);
+	    if (*endptr != '\0' || val <= 0)
+	      {
+		error (0, 0, "invalid max-members: '%s'", optarg);
+		help (argv[0], true);
+	      }
+	    max_members = val;
+	  }
 	  break;
 
 	case 'q':
-- 
2.53.0



More information about the Debugedit mailing list