Add sudo_strtoid() tests for -1 and range errors.
Also adjust testsudoers/test5 which relied upon gid -1 parsing.
This commit is contained in:
@@ -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++;
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user