Index: net/base/crl_set.cc |
diff --git a/net/base/crl_set.cc b/net/base/crl_set.cc |
index 5b28be752d9ec3e345120e3ebabe7aeeac110af6..5c5a37676bb9a06f16d349d8b56ffff448828bea 100644 |
--- a/net/base/crl_set.cc |
+++ b/net/base/crl_set.cc |
@@ -408,6 +408,18 @@ bool CRLSet::ApplyDelta(base::StringPiece data, |
CRLSet::Result CRLSet::CheckCertificate( |
const base::StringPiece& serial_number, |
const base::StringPiece& parent_spki) const { |
+ base::StringPiece serial(serial_number); |
+ |
+ if (!serial.empty() && serial[0] >= 0x80) { |
+ // This serial number is negative but the process which generates CRL sets |
+ // will reject any certificates with negative serial numbers as invalid. |
+ return UNKNOWN; |
+ } |
+ |
+ // Remove any leading zero bytes. |
+ while (serial.size() > 1 && serial[0] == 0x00) |
+ serial.remove_prefix(1); |
+ |
std::map<std::string, size_t>::const_iterator i = |
crls_index_by_issuer_.find(parent_spki.as_string()); |
if (i == crls_index_by_issuer_.end()) |
@@ -416,7 +428,7 @@ CRLSet::Result CRLSet::CheckCertificate( |
for (std::vector<std::string>::const_iterator i = serials.begin(); |
i != serials.end(); ++i) { |
- if (base::StringPiece(*i) == serial_number) |
+ if (base::StringPiece(*i) == serial) |
return REVOKED; |
} |