aboutsummaryrefslogtreecommitdiffstats
path: root/options.c
diff options
context:
space:
mode:
authorNRK <nrk@disroot.org>2022-06-16 15:33:32 +0200
committerGitea <gitea@fake.local>2022-09-05 03:52:51 +0200
commitfbe186e79d2083a7bbd1588b317cd5782bc5ae73 (patch)
tree38bc3d7e0c1d3ecf8fe08360615a671fd1f0fd32 /options.c
parentba39006574776d7fa026c63fce8276378cbdaabb (diff)
downloadnsxiv-fbe186e79d2083a7bbd1588b317cd5782bc5ae73.tar.zst
don't assume positive argc
handle a rare, but possible case of argc being 0, in which case argv[0] would be null. note that both POSIX and ISO C standard allow argc to be 0 and in practice this can be triggered via calling `exec(3)` family of functions with NULL as the first `argv`.
Diffstat (limited to 'options.c')
-rw-r--r--options.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/options.c b/options.c
index 8e8baa7..c94c9be 100644
--- a/options.c
+++ b/options.c
@@ -98,9 +98,6 @@ void parse_options(int argc, char **argv)
static opt_t _options;
options = &_options;
- progname = strrchr(argv[0], '/');
- progname = progname ? progname + 1 : argv[0];
-
_options.from_stdin = false;
_options.to_stdout = false;
_options.using_null = false;
@@ -125,6 +122,11 @@ void parse_options(int argc, char **argv)
_options.clean_cache = false;
_options.private_mode = false;
+ if (argc > 0) {
+ s = strrchr(argv[0], '/');
+ progname = s != NULL && s[1] != '\0' ? s + 1 : argv[0];
+ }
+
optparse_init(&op, argv);
while ((opt = optparse_long(&op, longopts, NULL)) != -1) {
for (n = 0; n < (int)ARRLEN(longopts); ++n) { /* clang-tidy finds some non-sensical branch and thinks optarg == NULL is possible */