Skip to content

Commit 8b0d9fe

Browse files
committed
Bugfix: utils: Avoid potential modulo by 0 if secret is zero length
1 parent 094cedf commit 8b0d9fe

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

src/datum_utils.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,11 +735,15 @@ int datum_atoi_strict(const char * const s, const size_t size) {
735735
return (ret == UINT64_MAX || ret > INT_MAX) ? -1 : ret;
736736
}
737737

738-
bool datum_secure_strequals(const char *secret, const size_t secret_len, const char *guess) {
738+
bool datum_secure_strequals(const char *secret, size_t secret_len, const char *guess) {
739739
const size_t guess_len = strlen(guess);
740740
size_t acc = secret_len ^ guess_len;
741+
if (!secret_len) {
742+
secret = ""; // null byte avoids dereferencing out of bounds
743+
secret_len = 1;
744+
}
741745
for (size_t i = 0; i < guess_len; ++i) {
742-
acc |= ((size_t)guess[i]) ^ ((size_t)secret[i % guess_len]);
746+
acc |= ((size_t)guess[i]) ^ ((size_t)secret[i % secret_len]);
743747
}
744748
return !acc;
745749
}

src/datum_utils_tests.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ void datum_utils_tests(void) {
4848
/* guess longer than secret */
4949
datum_test(!datum_secure_strequals(secret, secret_len, "abcd"));
5050

51+
/* guess shorter than secret */
52+
datum_test(!datum_secure_strequals(secret, secret_len, "ab"));
53+
5154
/* guess repeats secret but is longer */
5255
datum_test(!datum_secure_strequals(secret, secret_len, "abcabc"));
5356

0 commit comments

Comments
 (0)