Add sudo_strtoid() tests for -1 and range errors.

Also adjust testsudoers/test5 which relied upon gid -1 parsing.
This commit is contained in:
Todd C. Miller
2019-10-10 10:04:13 -06:00
parent f752ae5cee
commit 396bc57fef
3 changed files with 30 additions and 12 deletions

View File

@@ -1,7 +1,7 @@
/* /*
* SPDX-License-Identifier: ISC * SPDX-License-Identifier: ISC
* *
* Copyright (c) 2014 Todd C. Miller <Todd.Miller@sudo.ws> * Copyright (c) 2014-2019 Todd C. Miller <Todd.Miller@sudo.ws>
* *
* Permission to use, copy, modify, and distribute this software for any * Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above * purpose with or without fee is hereby granted, provided that the above
@@ -26,6 +26,7 @@
#else #else
# include "compat/stdbool.h" # include "compat/stdbool.h"
#endif #endif
#include <errno.h>
#include "sudo_compat.h" #include "sudo_compat.h"
#include "sudo_util.h" #include "sudo_util.h"
@@ -80,15 +81,20 @@ static struct strtoid_data {
id_t id; id_t id;
const char *sep; const char *sep;
const char *ep; const char *ep;
int errnum;
} strtoid_data[] = { } strtoid_data[] = {
{ "0,1", 0, ",", "," }, { "0,1", 0, ",", ",", 0 },
{ "10", 10, NULL, NULL }, { "10", 10, NULL, NULL, 0 },
{ "-2", -2, NULL, NULL }, { "-1", 0, NULL, NULL, EINVAL },
{ "4294967295", 0, NULL, NULL, EINVAL },
{ "4294967296", 0, NULL, NULL, ERANGE },
{ "-2147483649", 0, NULL, NULL, ERANGE },
{ "-2", -2, NULL, NULL, 0 },
#if SIZEOF_ID_T != SIZEOF_LONG_LONG #if SIZEOF_ID_T != SIZEOF_LONG_LONG
{ "-2", (id_t)4294967294U, NULL, NULL }, { "-2", (id_t)4294967294U, NULL, NULL, 0 },
#endif #endif
{ "4294967294", (id_t)4294967294U, NULL, NULL }, { "4294967294", (id_t)4294967294U, NULL, NULL, 0 },
{ NULL, 0, NULL, NULL } { NULL, 0, NULL, NULL, 0 }
}; };
static int static int
@@ -104,11 +110,23 @@ test_strtoid(int *ntests)
(*ntests)++; (*ntests)++;
errstr = "some error"; errstr = "some error";
value = sudo_strtoid(d->idstr, d->sep, &ep, &errstr); value = sudo_strtoid(d->idstr, d->sep, &ep, &errstr);
if (errstr != NULL) { if (d->errnum != 0) {
if (d->id != (id_t)-1) { if (errstr == NULL) {
sudo_warnx_nodebug("FAIL: %s: %s", d->idstr, errstr); sudo_warnx_nodebug("FAIL: %s: missing errstr for errno %d",
d->idstr, d->errnum);
errors++;
} else if (value != 0) {
sudo_warnx_nodebug("FAIL: %s should return 0 on error",
d->idstr);
errors++;
} else if (errno != d->errnum) {
sudo_warnx_nodebug("FAIL: %s: errno mismatch, %d != %d",
d->idstr, errno, d->errnum);
errors++; errors++;
} }
} else if (errstr != NULL) {
sudo_warnx_nodebug("FAIL: %s: %s", d->idstr, errstr);
errors++;
} else if (value != d->id) { } else if (value != d->id) {
sudo_warnx_nodebug("FAIL: %s != %u", d->idstr, (unsigned int)d->id); sudo_warnx_nodebug("FAIL: %s != %u", d->idstr, (unsigned int)d->id);
errors++; errors++;

View File

@@ -4,7 +4,7 @@ Parse error in sudoers near line 1.
Entries for user root: Entries for user root:
Command unmatched Command unmatched
testsudoers: test5.inc should be owned by gid 4294967295 testsudoers: test5.inc should be owned by gid 4294967294
Parse error in sudoers near line 1. Parse error in sudoers near line 1.
Entries for user root: Entries for user root:

View File

@@ -24,7 +24,7 @@ EOF
# Test group writable # Test group writable
chmod 664 $TESTFILE chmod 664 $TESTFILE
./testsudoers -U $MYUID -G -1 root id <<EOF ./testsudoers -U $MYUID -G -2 root id <<EOF
#include $TESTFILE #include $TESTFILE
EOF EOF