| Index: webrtc/base/openssladapter.cc
 | 
| diff --git a/webrtc/base/openssladapter.cc b/webrtc/base/openssladapter.cc
 | 
| index d3681861860b5591c5fb85e39b47278bfb0c64b7..135a32538a66a393724200591fcd9cfd2a1a59e5 100644
 | 
| --- a/webrtc/base/openssladapter.cc
 | 
| +++ b/webrtc/base/openssladapter.cc
 | 
| @@ -704,9 +704,6 @@ OpenSSLAdapter::OnCloseEvent(AsyncSocket* socket, int err) {
 | 
|    AsyncSocketAdapter::OnCloseEvent(socket, err);
 | 
|  }
 | 
|  
 | 
| -// This code is taken from the "Network Security with OpenSSL"
 | 
| -// sample in chapter 5
 | 
| -
 | 
|  bool OpenSSLAdapter::VerifyServerName(SSL* ssl, const char* host,
 | 
|                                        bool ignore_bad_cert) {
 | 
|    if (!host)
 | 
| @@ -739,59 +736,25 @@ bool OpenSSLAdapter::VerifyServerName(SSL* ssl, const char* host,
 | 
|  #endif
 | 
|  
 | 
|    bool ok = false;
 | 
| -  int extension_count = X509_get_ext_count(certificate);
 | 
| -  for (int i = 0; i < extension_count; ++i) {
 | 
| -    X509_EXTENSION* extension = X509_get_ext(certificate, i);
 | 
| -    int extension_nid = OBJ_obj2nid(X509_EXTENSION_get_object(extension));
 | 
| -
 | 
| -    if (extension_nid == NID_subject_alt_name) {
 | 
| -      const X509V3_EXT_METHOD* meth = X509V3_EXT_get(extension);
 | 
| -      if (!meth)
 | 
| +  GENERAL_NAMES* names = reinterpret_cast<GENERAL_NAMES*>(
 | 
| +      X509_get_ext_d2i(certificate, NID_subject_alt_name, nullptr, nullptr));
 | 
| +  if (names) {
 | 
| +    for (size_t i = 0; i < sk_GENERAL_NAME_num(names); i++) {
 | 
| +      const GENERAL_NAME* name = sk_GENERAL_NAME_value(names, i);
 | 
| +      if (name->type != GEN_DNS)
 | 
| +        continue;
 | 
| +      std::string value(
 | 
| +          reinterpret_cast<const char*>(ASN1_STRING_data(name->d.dNSName)),
 | 
| +          ASN1_STRING_length(name->d.dNSName));
 | 
| +      // string_match takes NUL-terminated strings, so check for embedded NULs.
 | 
| +      if (value.find('\0') != std::string::npos)
 | 
| +        continue;
 | 
| +      if (string_match(host, value.c_str())) {
 | 
| +        ok = true;
 | 
|          break;
 | 
| -
 | 
| -      void* ext_str = NULL;
 | 
| -
 | 
| -      // We assign this to a local variable, instead of passing the address
 | 
| -      // directly to ASN1_item_d2i.
 | 
| -      // See http://readlist.com/lists/openssl.org/openssl-users/0/4761.html.
 | 
| -      unsigned char* ext_value_data = extension->value->data;
 | 
| -
 | 
| -      const unsigned char **ext_value_data_ptr =
 | 
| -          (const_cast<const unsigned char **>(&ext_value_data));
 | 
| -
 | 
| -      if (meth->it) {
 | 
| -        ext_str = ASN1_item_d2i(NULL, ext_value_data_ptr,
 | 
| -                                extension->value->length,
 | 
| -                                ASN1_ITEM_ptr(meth->it));
 | 
| -      } else {
 | 
| -        ext_str = meth->d2i(NULL, ext_value_data_ptr, extension->value->length);
 | 
| -      }
 | 
| -
 | 
| -      STACK_OF(CONF_VALUE)* value = meth->i2v(meth, ext_str, NULL);
 | 
| -
 | 
| -      // Cast to size_t to be compilable for both OpenSSL and BoringSSL.
 | 
| -      for (size_t j = 0; j < static_cast<size_t>(sk_CONF_VALUE_num(value));
 | 
| -           ++j) {
 | 
| -        CONF_VALUE* nval = sk_CONF_VALUE_value(value, j);
 | 
| -        // The value for nval can contain wildcards
 | 
| -        if (!strcmp(nval->name, "DNS") && string_match(host, nval->value)) {
 | 
| -          ok = true;
 | 
| -          break;
 | 
| -        }
 | 
| -      }
 | 
| -      sk_CONF_VALUE_pop_free(value, X509V3_conf_free);
 | 
| -      value = NULL;
 | 
| -
 | 
| -      if (meth->it) {
 | 
| -        ASN1_item_free(reinterpret_cast<ASN1_VALUE*>(ext_str),
 | 
| -                       ASN1_ITEM_ptr(meth->it));
 | 
| -      } else {
 | 
| -        meth->ext_free(ext_str);
 | 
|        }
 | 
| -      ext_str = NULL;
 | 
|      }
 | 
| -    if (ok)
 | 
| -      break;
 | 
| +    GENERAL_NAMES_free(names);
 | 
|    }
 | 
|  
 | 
|    char data[256];
 | 
| 
 |