aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLion Kortlepel <[email protected]>2026-02-01 09:45:06 +0000
committerLion Kortlepel <[email protected]>2026-02-01 09:45:06 +0000
commitacf522e7bab50b24ec702b405b4e450b65f835cd (patch)
tree5109c3a0c25d054093d95984bb99c92d6da46510
parentb4feabc2c1dccb7212421c8e1edf57db6388a7a3 (diff)
downloadargs-acf522e7bab50b24ec702b405b4e450b65f835cd.tar.zst
args-acf522e7bab50b24ec702b405b4e450b65f835cd.zip
fix: fix ls_args_parse segfault on required positional args
-rw-r--r--ls_args.h20
-rw-r--r--tests/tests.c17
2 files changed, 32 insertions, 5 deletions
diff --git a/ls_args.h b/ls_args.h
index 1c9301a..a02b3d1 100644
--- a/ls_args.h
+++ b/ls_args.h
@@ -576,11 +576,21 @@ int ls_args_parse(ls_args* a, int argc, char** argv) {
for (i = 0; i < (int)a->args_len; ++i) {
if (a->args[i].mode == LS_ARGS_REQUIRED && !a->args[i].found) {
- const size_t len = 64 + strlen(a->args[i].match.name.long_opt);
- a->_allocated_error = LS_REALLOC(a->_allocated_error, len);
- memset(a->_allocated_error, 0, len);
- sprintf(a->_allocated_error, "Required argument '--%s' not found",
- a->args[i].match.name.long_opt);
+ size_t len;
+ if (a->args[i].is_pos) {
+ len = 64;
+ a->_allocated_error = LS_REALLOC(a->_allocated_error, len);
+ memset(a->_allocated_error, 0, len);
+ sprintf(a->_allocated_error, "Required positional argument not found (argument %d)",
+ a->args[i].match.pos);
+ } else {
+ len = 64 + strlen(a->args[i].match.name.long_opt);
+ a->_allocated_error = LS_REALLOC(a->_allocated_error, len);
+ memset(a->_allocated_error, 0, len);
+ sprintf(a->_allocated_error, "Required argument '--%s' not found",
+ a->args[i].match.name.long_opt);
+ }
+
a->last_error = a->_allocated_error;
return 0;
}
diff --git a/tests/tests.c b/tests/tests.c
index 78c8f24..0a136b1 100644
--- a/tests/tests.c
+++ b/tests/tests.c
@@ -113,6 +113,23 @@ TEST_CASE(too_many_positional_after_double_dash) {
return 0;
}
+TEST_CASE(basic_args_positional_required_error) {
+ int help = 0;
+ const char* first;
+ ls_args args;
+ char* argv[] = { "./hello", "world", NULL };
+ int argc = sizeof(argv) / sizeof(*argv) - 1;
+
+ ls_args_init(&args);
+ ls_args_pos_string(&args, 0, &first, "First positional argument", LS_ARGS_REQUIRED);
+
+ ASSERT(!ls_args_parse(&args, argc, argv));
+
+ ASSERT_STR_EQ(args.last_error, "Required positional argument not found (argument 0)");
+ ls_args_free(&args);
+ return 0;
+}
+
TEST_CASE(basic_args_positional_only_error) {
int help = 0;
const char* input;