Skip to content

Commit 0304e50

Browse files
committed
ab: resolve out-of-bounds access in dntomid
Restore the check from exch/nsp/ab_tree.cpp that dn actually has rcpts_prefix before doing +8. ================================================================= ==2561300==ERROR: AddressSanitizer: heap-buffer-overflow on... READ of size 1 at 0x6030001bc0fe thread T26 f0 __interceptor_strlen f1 decode_hex_int(char const*) lib/util.cpp:1083 f2 gromox::ab_tree::ab_base::resolve(char const*) const lib/ab_tree.cpp:632 f3 nsp_interface_dntomid exch/nsp/nsp_interface.cpp:1410 Fixes: gromox-2.40-22-gd4f1761ba
1 parent edffee6 commit 0304e50

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

lib/ab_tree.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -619,13 +619,18 @@ ec_error_t ab_base::proplist(minid mid, std::vector<uint32_t> &tags) const
619619
*/
620620
minid ab_base::resolve(const char* dn) const
621621
{
622+
auto z = strlen(dn);
622623
const std::string &server_prefix = AB.essdn_server_prefix();
623-
if (strncasecmp(dn, server_prefix.c_str(), AB.essdn_server_prefix().size()) == 0 && strlen(dn) >= server_prefix.size() + 60) {
624+
if (strncasecmp(dn, server_prefix.c_str(), server_prefix.size()) == 0 &&
625+
z >= server_prefix.size() + 60) {
624626
/* Reason for 60: see DN format in ab_tree_get_mdbdn */
625627
auto id = decode_hex_int(dn + server_prefix.size() + 60);
626628
return minid(minid::address, id);
627629
}
628-
const std::string rcpts_prefix = AB.essdn_rcpts_prefix();
630+
const std::string &rcpts_prefix = AB.essdn_rcpts_prefix();
631+
if (strncasecmp(dn, rcpts_prefix.c_str(), rcpts_prefix.size()) != 0 ||
632+
z < rcpts_prefix.size() + 8)
633+
return {};
629634
auto id = decode_hex_int(dn + rcpts_prefix.size() + 8);
630635
return minid(minid::address, id);
631636
}

0 commit comments

Comments
 (0)