diff --git a/cpp/src/phonenumbers/phonenumbermatcher.cc b/cpp/src/phonenumbers/phonenumbermatcher.cc index 2d60ceb4d1..60da8fcfed 100644 --- a/cpp/src/phonenumbers/phonenumbermatcher.cc +++ b/cpp/src/phonenumbers/phonenumbermatcher.cc @@ -837,6 +837,11 @@ bool PhoneNumberMatcher::AllNumberGroupsAreExactlyPresent( candidate_groups.push_back(digit_block); } + // Guard against size_t underflow when candidate_groups is empty. + if (candidate_groups.empty()) { + return false; + } + // Set this to the last group, skipping it if the number has an extension. int candidate_number_group_index = static_cast( phone_number.has_extension() ? candidate_groups.size() - 2 diff --git a/cpp/src/phonenumbers/phonenumberutil.cc b/cpp/src/phonenumbers/phonenumberutil.cc index c0c9d09a04..bf245e5b31 100644 --- a/cpp/src/phonenumbers/phonenumberutil.cc +++ b/cpp/src/phonenumbers/phonenumberutil.cc @@ -790,9 +790,9 @@ class PhoneNumberRegExpsAndMappings { StrCat("(", kDigits, "|", kRfc3966VisualSeparator, ")")), alphanum_(StrCat(kValidAlphaInclUppercase, kDigits)), rfc3966_domainlabel_( - StrCat("[", alphanum_, "]+((\\-)*[", alphanum_, "])*")), + StrCat("[", alphanum_, "]+(-+[", alphanum_, "]+)*")), rfc3966_toplabel_(StrCat("[", kValidAlphaInclUppercase, - "]+((\\-)*[", alphanum_, "])*")), + "]+(-+[", alphanum_, "]+)*")), regexp_factory_(new RegExpFactory()), regexp_cache_(new RegExpCache(*regexp_factory_.get(), 128)), diallable_char_mappings_(),