Index: net/cert/internal/name_constraints.cc |
diff --git a/net/cert/internal/name_constraints.cc b/net/cert/internal/name_constraints.cc |
index 7234e86a5899f6a3b1d59117e234e54b2c0545ea..2873acabe90d59dc2203da8d19b41ee04ea17949 100644 |
--- a/net/cert/internal/name_constraints.cc |
+++ b/net/cert/internal/name_constraints.cc |
@@ -179,13 +179,22 @@ WARN_UNUSED_RESULT bool ParseGeneralName( |
name_type = GENERAL_NAME_X400_ADDRESS; |
break; |
// directoryName [4] Name, |
- case 4: |
+ case 4: { |
if (!der::IsConstructed(tag)) |
return false; |
name_type = GENERAL_NAME_DIRECTORY_NAME; |
- subtrees->directory_names.push_back(std::vector<uint8_t>( |
- value.UnsafeData(), value.UnsafeData() + value.Length())); |
+ // Name is a CHOICE { rdnSequence RDNSequence }, therefore the SEQUENCE |
+ // tag is explicit. Remove it, since the name matching functions expect |
+ // only the value portion. |
+ der::Parser name_parser(value); |
+ der::Input name_value; |
+ if (!name_parser.ReadTag(der::kSequence, &name_value) || parser.HasMore()) |
+ return false; |
+ subtrees->directory_names.push_back( |
+ std::vector<uint8_t>(name_value.UnsafeData(), |
+ name_value.UnsafeData() + name_value.Length())); |
break; |
+ } |
// ediPartyName [5] EDIPartyName, |
case 5: |
if (!der::IsConstructed(tag)) |