Commit 156be54b authored by weinig@apple.com's avatar weinig@apple.com

2011-03-26 Sam Weinig <sam@webkit.org>

        Reviewed by Anders Carlsson.

        WebKit2: Assert in CoreIPC::typeFromCFTypeRef() when loading a site with an invalid certificate
        <rdar://problem/9188041>
        https://bugs.webkit.org/show_bug.cgi?id=57159

        * Shared/cf/ArgumentCodersCF.cpp:
        (CoreIPC::typeFromCFTypeRef):
        (CoreIPC::encode):
        (CoreIPC::decode):
        * Shared/cf/ArgumentCodersCF.h:
        Add encoding/decoding for SecCertificateRef type.

        * Shared/mac/PlatformCertificateInfo.mm:
        (WebKit::PlatformCertificateInfo::encode):
        (WebKit::PlatformCertificateInfo::decode):
        Use ArgumentCodersCF now that it knows how to encode/decode SecCertificateRefs.


git-svn-id: svn://svn.chromium.org/blink/trunk@82036 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent b8f9df08
2011-03-26 Sam Weinig <sam@webkit.org>
Reviewed by Anders Carlsson.
WebKit2: Assert in CoreIPC::typeFromCFTypeRef() when loading a site with an invalid certificate
<rdar://problem/9188041>
https://bugs.webkit.org/show_bug.cgi?id=57159
* Shared/cf/ArgumentCodersCF.cpp:
(CoreIPC::typeFromCFTypeRef):
(CoreIPC::encode):
(CoreIPC::decode):
* Shared/cf/ArgumentCodersCF.h:
Add encoding/decoding for SecCertificateRef type.
* Shared/mac/PlatformCertificateInfo.mm:
(WebKit::PlatformCertificateInfo::encode):
(WebKit::PlatformCertificateInfo::decode):
Use ArgumentCodersCF now that it knows how to encode/decode SecCertificateRefs.
2011-03-26 Anders Carlsson <andersca@apple.com>
Reviewed by Sam Weinig.
......
......@@ -48,6 +48,9 @@ enum CFType {
CFNumber,
CFString,
CFURL,
#if PLATFORM(MAC)
SecCertificate,
#endif
Null,
Unknown,
};
......@@ -76,6 +79,10 @@ static CFType typeFromCFTypeRef(CFTypeRef type)
return CFString;
if (typeID == CFURLGetTypeID())
return CFURL;
#if PLATFORM(MAC)
if (typeID == SecCertificateGetTypeID())
return SecCertificate;
#endif
ASSERT_NOT_REACHED();
return Unknown;
......@@ -110,6 +117,11 @@ static void encode(ArgumentEncoder* encoder, CFTypeRef typeRef)
case CFURL:
encode(encoder, static_cast<CFURLRef>(typeRef));
return;
#if PLATFORM(MAC)
case SecCertificate:
encode(encoder, (SecCertificateRef)typeRef);
return;
#endif
case Null:
return;
case Unknown:
......@@ -178,6 +190,15 @@ static bool decode(ArgumentDecoder* decoder, RetainPtr<CFTypeRef>& result)
result.adoptCF(url.leakRef());
return true;
}
#if PLATFORM(MAC)
case SecCertificate: {
RetainPtr<SecCertificateRef> certificate;
if (!decode(decoder, certificate))
return false;
result.adoptCF(certificate.leakRef());
return true;
}
#endif
case Null:
result = tokenNullTypeRef();
return true;
......@@ -459,5 +480,22 @@ bool decode(ArgumentDecoder* decoder, RetainPtr<CFURLRef>& result)
return true;
}
} // namespace CoreIPC
#if PLATFORM(MAC)
void encode(ArgumentEncoder* encoder, SecCertificateRef certificate)
{
RetainPtr<CFDataRef> data(AdoptCF, SecCertificateCopyData(certificate));
encode(encoder, data.get());
}
bool decode(ArgumentDecoder* decoder, RetainPtr<SecCertificateRef>& result)
{
RetainPtr<CFDataRef> data;
if (!decode(decoder, data))
return false;
result.adoptCF(SecCertificateCreateWithData(0, data.get()));
return true;
}
#endif
} // namespace CoreIPC
......@@ -28,6 +28,10 @@
#include <wtf/RetainPtr.h>
#if PLATFORM(MAC)
#include <Security/SecCertificate.h>
#endif
namespace CoreIPC {
class ArgumentEncoder;
......@@ -61,6 +65,12 @@ bool decode(ArgumentDecoder*, RetainPtr<CFStringRef>& result);
void encode(ArgumentEncoder*, CFURLRef);
bool decode(ArgumentDecoder*, RetainPtr<CFURLRef>& result);
#if PLATFORM(MAC)
// SecCertificateRef
void encode(ArgumentEncoder*, SecCertificateRef);
bool decode(ArgumentDecoder*, RetainPtr<SecCertificateRef>& result);
#endif
CFTypeRef tokenNullTypeRef();
} // namespace CoreIPC
......
......@@ -26,10 +26,10 @@
#import "config.h"
#import "PlatformCertificateInfo.h"
#import "ArgumentCodersCF.h"
#import "ArgumentDecoder.h"
#import "ArgumentEncoder.h"
#import <WebKitSystemInterface.h>
#import <Security/Security.h>
using namespace WebCore;
......@@ -51,45 +51,27 @@ PlatformCertificateInfo::PlatformCertificateInfo(CFArrayRef certificateChain)
void PlatformCertificateInfo::encode(CoreIPC::ArgumentEncoder* encoder) const
{
// Special case no certificates,
if (!m_certificateChain) {
encoder->encodeUInt64(std::numeric_limits<uint64_t>::max());
encoder->encodeBool(false);
return;
}
uint64_t length = CFArrayGetCount(m_certificateChain.get());
encoder->encodeUInt64(length);
for (size_t i = 0; i < length; ++i) {
RetainPtr<CFDataRef> data(AdoptCF, SecCertificateCopyData((SecCertificateRef)CFArrayGetValueAtIndex(m_certificateChain.get(), i)));
encoder->encodeBytes(CFDataGetBytePtr(data.get()), CFDataGetLength(data.get()));
}
encoder->encodeBool(true);
CoreIPC::encode(encoder, m_certificateChain.get());
}
bool PlatformCertificateInfo::decode(CoreIPC::ArgumentDecoder* decoder, PlatformCertificateInfo& c)
{
uint64_t length;
if (!decoder->decode(length))
bool hasCertificateChain;
if (!decoder->decode(hasCertificateChain))
return false;
if (length == std::numeric_limits<uint64_t>::max()) {
// This is the no certificates case.
if (!hasCertificateChain)
return true;
}
RetainPtr<CFMutableArrayRef> array(AdoptCF, CFArrayCreateMutable(0, length, &kCFTypeArrayCallBacks));
for (size_t i = 0; i < length; ++i) {
Vector<uint8_t> bytes;
if (!decoder->decodeBytes(bytes))
return false;
RetainPtr<CFDataRef> data(AdoptCF, CFDataCreateWithBytesNoCopy(0, bytes.data(), bytes.size(), kCFAllocatorNull));
RetainPtr<SecCertificateRef> certificate(AdoptCF, SecCertificateCreateWithData(0, data.get()));
CFArrayAppendValue(array.get(), certificate.get());
}
if (!CoreIPC::decode(decoder, c.m_certificateChain))
return false;
c.m_certificateChain = array;
return true;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment