[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