From 678c2a23ee1c05a89e7bbe695b967d723b145540 Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sat, 6 Jan 2024 22:12:06 +0100 Subject: [PATCH] src/: Use str2[u]l() instead of atoi(3) atoi(3) easily triggers Undefined Behavior. Replace it by str2[u]l(), which are safe from that, and add type safety too. Reviewed-by: "Serge E. Hallyn" Signed-off-by: Alejandro Colomar --- src/free_subid_range.c | 8 ++++++-- src/get_subid_owners.c | 23 ++++++++++++++++------- src/new_subid_range.c | 5 ++++- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/free_subid_range.c b/src/free_subid_range.c index 441c2277..4bdacfb7 100644 --- a/src/free_subid_range.c +++ b/src/free_subid_range.c @@ -1,12 +1,16 @@ /* SPDX-License-Identifier: BSD-3-Clause */ + #include #include + +#include "atoi/str2i.h" #include "subid.h" #include "stdlib.h" #include "prototypes.h" #include "shadowlog.h" + /* Test program for the subid freeing routine */ static const char Prog[] = "free_subid_range"; @@ -38,8 +42,8 @@ int main(int argc, char *argv[]) if (argc < 3) usage(); range.owner = argv[0]; - range.start = atoi(argv[1]); - range.count = atoi(argv[2]); + str2ul(&range.start, argv[1]); + str2ul(&range.count, argv[2]); if (group) ok = subid_ungrant_gid_range(&range); else diff --git a/src/get_subid_owners.c b/src/get_subid_owners.c index e1c1e795..9fe07b62 100644 --- a/src/get_subid_owners.c +++ b/src/get_subid_owners.c @@ -1,13 +1,18 @@ /* SPDX-License-Identifier: BSD-3-Clause */ + #include + +#include "atoi/str2i.h" #include "subid.h" #include "stdlib.h" #include "prototypes.h" #include "shadowlog.h" + static const char Prog[] = "get_subid_owners"; + static void usage(void) { fprintf(stderr, "Usage: [-g] %s subuid\n", Prog); @@ -18,20 +23,24 @@ static void usage(void) int main(int argc, char *argv[]) { - int i, n; - uid_t *uids; + int i, n; + long l; + uid_t *uids; log_set_progname(Prog); log_set_logfd(stderr); if (argc < 2) { usage(); } - if (argc == 3 && strcmp(argv[1], "-g") == 0) - n = subid_get_gid_owners(atoi(argv[2]), &uids); - else if (argc == 2 && strcmp(argv[1], "-h") == 0) + if (argc == 3 && strcmp(argv[1], "-g") == 0) { + str2sl(&l, argv[2]); + n = subid_get_gid_owners(l, &uids); + } else if (argc == 2 && strcmp(argv[1], "-h") == 0) { usage(); - else - n = subid_get_uid_owners(atoi(argv[1]), &uids); + } else { + str2sl(&l, argv[1]); + n = subid_get_uid_owners(l, &uids); + } if (n < 0) { fprintf(stderr, "No owners found\n"); exit(1); diff --git a/src/new_subid_range.c b/src/new_subid_range.c index 1ef71f36..6be95740 100644 --- a/src/new_subid_range.c +++ b/src/new_subid_range.c @@ -2,11 +2,14 @@ #include #include + +#include "atoi/str2i.h" #include "subid.h" #include "stdlib.h" #include "prototypes.h" #include "shadowlog.h" + /* Test program for the subid creation routine */ static const char Prog[] = "new_subid_range"; @@ -45,7 +48,7 @@ int main(int argc, char *argv[]) range.start = 0; range.count = 65536; if (argc > 1) - range.count = atoi(argv[1]); + str2ul(&range.count, argv[1]); if (group) ok = subid_grant_gid_range(&range, !makenew); else