mirror of
https://github.com/sudo-project/sudo.git
synced 2025-08-21 17:37:16 +00:00
sudo_digest_getlen: return size_t, and 0 on error instead of -1
This is an API change, sudo_digest_getlen_v1 remains for binary compatibility.
This commit is contained in:
parent
184e03b4a9
commit
77f94f291a
@ -33,13 +33,14 @@ sudo_dso_public struct sudo_digest *sudo_digest_alloc_v1(unsigned int digest_typ
|
||||
sudo_dso_public void sudo_digest_free_v1(struct sudo_digest *dig);
|
||||
sudo_dso_public void sudo_digest_reset_v1(struct sudo_digest *dig);
|
||||
sudo_dso_public int sudo_digest_getlen_v1(unsigned int digest_type);
|
||||
sudo_dso_public size_t sudo_digest_getlen_v2(unsigned int digest_type);
|
||||
sudo_dso_public void sudo_digest_update_v1(struct sudo_digest *dig, const void *data, size_t len);
|
||||
sudo_dso_public void sudo_digest_final_v1(struct sudo_digest *dig, unsigned char *md);
|
||||
|
||||
#define sudo_digest_alloc(_a) sudo_digest_alloc_v1((_a))
|
||||
#define sudo_digest_free(_a) sudo_digest_free_v1((_a))
|
||||
#define sudo_digest_reset(_a) sudo_digest_reset_v1((_a))
|
||||
#define sudo_digest_getlen(_a) sudo_digest_getlen_v1((_a))
|
||||
#define sudo_digest_getlen(_a) sudo_digest_getlen_v2((_a))
|
||||
#define sudo_digest_update(_a, _b, _c) sudo_digest_update_v1((_a), (_b), (_c))
|
||||
#define sudo_digest_final(_a, _b) sudo_digest_final_v1((_a), (_b))
|
||||
|
||||
|
@ -43,7 +43,7 @@
|
||||
#endif
|
||||
|
||||
static struct digest_function {
|
||||
const unsigned int digest_len;
|
||||
const size_t digest_len;
|
||||
void (*init)(SHA2_CTX *);
|
||||
#ifdef SHA2_VOID_PTR
|
||||
void (*update)(SHA2_CTX *, const void *, size_t);
|
||||
@ -130,18 +130,25 @@ sudo_digest_reset_v1(struct sudo_digest *dig)
|
||||
debug_return;
|
||||
}
|
||||
|
||||
int
|
||||
sudo_digest_getlen_v1(unsigned int digest_type)
|
||||
size_t
|
||||
sudo_digest_getlen_v2(unsigned int digest_type)
|
||||
{
|
||||
debug_decl(sudo_digest_getlen, SUDO_DEBUG_UTIL);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; digest_functions[i].digest_len != 0; i++) {
|
||||
if (digest_type == i)
|
||||
debug_return_int(digest_functions[i].digest_len);
|
||||
debug_return_size_t(digest_functions[i].digest_len);
|
||||
}
|
||||
|
||||
debug_return_int(-1);
|
||||
debug_return_size_t(0);
|
||||
}
|
||||
|
||||
int
|
||||
sudo_digest_getlen_v1(unsigned int digest_type)
|
||||
{
|
||||
size_t len = sudo_digest_getlen_v2(digest_type);
|
||||
return len ? (int)len : -1;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -125,17 +125,24 @@ sudo_digest_reset_v1(struct sudo_digest *dig)
|
||||
debug_return;
|
||||
}
|
||||
|
||||
int
|
||||
sudo_digest_getlen_v1(unsigned int digest_type)
|
||||
size_t
|
||||
sudo_digest_getlen_v2(unsigned int digest_type)
|
||||
{
|
||||
debug_decl(sudo_digest_getlen, SUDO_DEBUG_UTIL);
|
||||
int gcry_digest_type;
|
||||
|
||||
gcry_digest_type = sudo_digest_type_to_gcry(digest_type);
|
||||
if (gcry_digest_type == -1)
|
||||
debug_return_int(-1);
|
||||
debug_return_size_t(0);
|
||||
|
||||
debug_return_int(gcry_md_get_algo_dlen(gcry_digest_type));
|
||||
debug_return_size_t(gcry_md_get_algo_dlen(gcry_digest_type));
|
||||
}
|
||||
|
||||
int
|
||||
sudo_digest_getlen_v1(unsigned int digest_type)
|
||||
{
|
||||
size_t len = sudo_digest_getlen_v2(digest_type);
|
||||
return len ? (int)len : -1;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -118,17 +118,24 @@ sudo_digest_reset_v1(struct sudo_digest *dig)
|
||||
debug_return;
|
||||
}
|
||||
|
||||
int
|
||||
sudo_digest_getlen_v1(unsigned int digest_type)
|
||||
size_t
|
||||
sudo_digest_getlen_v2(unsigned int digest_type)
|
||||
{
|
||||
const EVP_MD *md;
|
||||
debug_decl(sudo_digest_getlen, SUDO_DEBUG_UTIL);
|
||||
|
||||
md = sudo_digest_type_to_md(digest_type);
|
||||
if (md == NULL)
|
||||
debug_return_int(-1);
|
||||
debug_return_size_t(0);
|
||||
|
||||
debug_return_int(EVP_MD_size(md));
|
||||
debug_return_size_t((size_t)EVP_MD_size(md));
|
||||
}
|
||||
|
||||
int
|
||||
sudo_digest_getlen_v1(unsigned int digest_type)
|
||||
{
|
||||
size_t len = sudo_digest_getlen_v2(digest_type);
|
||||
return len ? (int)len : -1;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -436,7 +436,7 @@ getentropy_fallback(void *buf, size_t len)
|
||||
if ((ctx = sudo_digest_alloc(SUDO_DIGEST_SHA512)) == NULL)
|
||||
return -1;
|
||||
digest_len = sudo_digest_getlen(SUDO_DIGEST_SHA512);
|
||||
if (digest_len == (size_t)-1 || (results = malloc(digest_len)) == NULL)
|
||||
if (digest_len == 0 || (results = malloc(digest_len)) == NULL)
|
||||
goto done;
|
||||
|
||||
pid = getpid();
|
||||
|
@ -1109,10 +1109,10 @@ run_tests(unsigned int digest_type, struct test_vector *test_vectors)
|
||||
struct sudo_digest *ctx;
|
||||
unsigned char md[64]; /* SHA512_DIGEST_LENGTH */
|
||||
char mdhex[128 + 1]; /* SHA512_DIGEST_LENGTH * 2 + 1 */
|
||||
int i, j, digest_len;
|
||||
size_t i, j, digest_len;
|
||||
|
||||
digest_len = sudo_digest_getlen(digest_type);
|
||||
if (digest_len == -1)
|
||||
if (digest_len == 0)
|
||||
sudo_fatalx("unable to get digest length for type %d", digest_type);
|
||||
if (digest_len > ssizeof(md))
|
||||
sudo_fatalx("digest length too big for type %d", digest_type);
|
||||
|
@ -50,6 +50,7 @@ sudo_digest_alloc_v1
|
||||
sudo_digest_final_v1
|
||||
sudo_digest_free_v1
|
||||
sudo_digest_getlen_v1
|
||||
sudo_digest_getlen_v2
|
||||
sudo_digest_reset_v1
|
||||
sudo_digest_update_v1
|
||||
sudo_dso_findsym_v1
|
||||
|
@ -45,8 +45,8 @@ sudo_filedigest(int fd, const char *file, unsigned int digest_type,
|
||||
int fd2;
|
||||
debug_decl(sudo_filedigest, SUDOERS_DEBUG_UTIL);
|
||||
|
||||
*digest_len = (size_t)sudo_digest_getlen(digest_type);
|
||||
if (*digest_len == (size_t)-1) {
|
||||
*digest_len = sudo_digest_getlen(digest_type);
|
||||
if (*digest_len == 0) {
|
||||
sudo_warnx(U_("unsupported digest type %u for %s"), digest_type, file);
|
||||
debug_return_ptr(NULL);
|
||||
}
|
||||
|
@ -3906,9 +3906,9 @@ YY_RULE_SETUP
|
||||
#line 319 "toke.l"
|
||||
{
|
||||
/* Only return DIGEST if the length is correct. */
|
||||
int digest_len =
|
||||
size_t digest_len =
|
||||
sudo_digest_getlen(digest_type);
|
||||
if (sudoersleng == digest_len * 2) {
|
||||
if ((size_t)sudoersleng == digest_len * 2) {
|
||||
if (!fill(sudoerstext, sudoersleng))
|
||||
yyterminate();
|
||||
BEGIN INITIAL;
|
||||
@ -3924,7 +3924,7 @@ YY_RULE_SETUP
|
||||
#line 334 "toke.l"
|
||||
{
|
||||
/* Only return DIGEST if the length is correct. */
|
||||
int len, digest_len =
|
||||
size_t len, digest_len =
|
||||
sudo_digest_getlen(digest_type);
|
||||
if (sudoerstext[sudoersleng - 1] == '=') {
|
||||
/* use padding */
|
||||
@ -3933,7 +3933,7 @@ YY_RULE_SETUP
|
||||
/* no padding */
|
||||
len = (4 * digest_len + 2) / 3;
|
||||
}
|
||||
if (sudoersleng == len) {
|
||||
if ((size_t)sudoersleng == len) {
|
||||
if (!fill(sudoerstext, sudoersleng))
|
||||
yyterminate();
|
||||
BEGIN INITIAL;
|
||||
|
@ -318,9 +318,9 @@ DEFVAR [a-z_]+
|
||||
|
||||
<WANTDIGEST>[[:xdigit:]]+ {
|
||||
/* Only return DIGEST if the length is correct. */
|
||||
int digest_len =
|
||||
size_t digest_len =
|
||||
sudo_digest_getlen(digest_type);
|
||||
if (sudoersleng == digest_len * 2) {
|
||||
if ((size_t)sudoersleng == digest_len * 2) {
|
||||
if (!fill(sudoerstext, sudoersleng))
|
||||
yyterminate();
|
||||
BEGIN INITIAL;
|
||||
@ -333,7 +333,7 @@ DEFVAR [a-z_]+
|
||||
|
||||
<WANTDIGEST>[A-Za-z0-9\+/=]+ {
|
||||
/* Only return DIGEST if the length is correct. */
|
||||
int len, digest_len =
|
||||
size_t len, digest_len =
|
||||
sudo_digest_getlen(digest_type);
|
||||
if (sudoerstext[sudoersleng - 1] == '=') {
|
||||
/* use padding */
|
||||
@ -342,7 +342,7 @@ DEFVAR [a-z_]+
|
||||
/* no padding */
|
||||
len = (4 * digest_len + 2) / 3;
|
||||
}
|
||||
if (sudoersleng == len) {
|
||||
if ((size_t)sudoersleng == len) {
|
||||
if (!fill(sudoerstext, sudoersleng))
|
||||
yyterminate();
|
||||
BEGIN INITIAL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user