summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2010-01-27 11:38:29 +0100
committerSergei Golubchik <sergii@pisem.net>2010-01-27 11:38:29 +0100
commit0d09e3a55fd953e7cd3578cfa7ad8cdbc4cd3e03 (patch)
tree2c1b16e0dcf9925e57e67c4833d9e694b9376f30 /extra
parent93089873623bb82cf5ca4c4cf1cf146796dd31dd (diff)
downloadmariadb-git-0d09e3a55fd953e7cd3578cfa7ad8cdbc4cd3e03.tar.gz
YaSSL cert info buffer overflow fix
Apply a diff from [Yassl-commit] yassl/taocrypt/src asn.cpp,1.13,1.14 [Yassl-commit] yassl/taocrypt/include asn.hpp,1.9,1.10 Original patch http://lists.mysql.com/commits/96697 extra/yassl/taocrypt/include/asn.hpp: [Yassl-commit] yassl/taocrypt/include asn.hpp,1.9,1.10 extra/yassl/taocrypt/src/asn.cpp: [Yassl-commit] yassl/taocrypt/src asn.cpp,1.13,1.14
Diffstat (limited to 'extra')
-rw-r--r--extra/yassl/taocrypt/include/asn.hpp1
-rw-r--r--extra/yassl/taocrypt/src/asn.cpp115
2 files changed, 67 insertions, 49 deletions
diff --git a/extra/yassl/taocrypt/include/asn.hpp b/extra/yassl/taocrypt/include/asn.hpp
index 1c1850cb47e..168b8a8c755 100644
--- a/extra/yassl/taocrypt/include/asn.hpp
+++ b/extra/yassl/taocrypt/include/asn.hpp
@@ -305,6 +305,7 @@ private:
bool ValidateSignature(SignerList*);
bool ConfirmSignature(Source&);
void GetKey();
+ char* AddTag(char*, const char*, const char*, word32, word32);
void GetName(NameType);
void GetValidity();
void GetDate(DateType);
diff --git a/extra/yassl/taocrypt/src/asn.cpp b/extra/yassl/taocrypt/src/asn.cpp
index 78200841bda..f44d550e95b 100644
--- a/extra/yassl/taocrypt/src/asn.cpp
+++ b/extra/yassl/taocrypt/src/asn.cpp
@@ -652,6 +652,25 @@ word32 CertDecoder::GetDigest()
}
+// memory length checked add tag to buffer
+char* CertDecoder::AddTag(char* ptr, const char* buf_end, const char* tag_name,
+ word32 tag_name_length, word32 tag_value_length)
+{
+ if (ptr + tag_name_length + tag_value_length > buf_end) {
+ source_.SetError(CONTENT_E);
+ return 0;
+ }
+
+ memcpy(ptr, tag_name, tag_name_length);
+ ptr += tag_name_length;
+
+ memcpy(ptr, source_.get_current(), tag_value_length);
+ ptr += tag_value_length;
+
+ return ptr;
+}
+
+
// process NAME, either issuer or subject
void CertDecoder::GetName(NameType nt)
{
@@ -659,11 +678,22 @@ void CertDecoder::GetName(NameType nt)
SHA sha;
word32 length = GetSequence(); // length of all distinguished names
- assert (length < ASN_NAME_MAX);
+
+ if (length >= ASN_NAME_MAX)
+ return;
length += source_.get_index();
- char* ptr = (nt == ISSUER) ? issuer_ : subject_;
- word32 idx = 0;
+ char* ptr;
+ char* buf_end;
+
+ if (nt == ISSUER) {
+ ptr = issuer_;
+ buf_end = ptr + sizeof(issuer_) - 1; // 1 byte for trailing 0
+ }
+ else {
+ ptr = subject_;
+ buf_end = ptr + sizeof(subject_) - 1; // 1 byte for trailing 0
+ }
while (source_.get_index() < length) {
GetSet();
@@ -685,47 +715,36 @@ void CertDecoder::GetName(NameType nt)
byte id = source_.next();
b = source_.next(); // strType
word32 strLen = GetLength(source_);
- bool copy = false;
-
- if (id == COMMON_NAME) {
- memcpy(&ptr[idx], "/CN=", 4);
- idx += 4;
- copy = true;
- }
- else if (id == SUR_NAME) {
- memcpy(&ptr[idx], "/SN=", 4);
- idx += 4;
- copy = true;
- }
- else if (id == COUNTRY_NAME) {
- memcpy(&ptr[idx], "/C=", 3);
- idx += 3;
- copy = true;
- }
- else if (id == LOCALITY_NAME) {
- memcpy(&ptr[idx], "/L=", 3);
- idx += 3;
- copy = true;
- }
- else if (id == STATE_NAME) {
- memcpy(&ptr[idx], "/ST=", 4);
- idx += 4;
- copy = true;
- }
- else if (id == ORG_NAME) {
- memcpy(&ptr[idx], "/O=", 3);
- idx += 3;
- copy = true;
- }
- else if (id == ORGUNIT_NAME) {
- memcpy(&ptr[idx], "/OU=", 4);
- idx += 4;
- copy = true;
- }
- if (copy) {
- memcpy(&ptr[idx], source_.get_current(), strLen);
- idx += strLen;
+ switch (id) {
+ case COMMON_NAME:
+ if (!(ptr = AddTag(ptr, buf_end, "/CN=", 4, strLen)))
+ return;
+ break;
+ case SUR_NAME:
+ if (!(ptr = AddTag(ptr, buf_end, "/SN=", 4, strLen)))
+ return;
+ break;
+ case COUNTRY_NAME:
+ if (!(ptr = AddTag(ptr, buf_end, "/C=", 3, strLen)))
+ return;
+ break;
+ case LOCALITY_NAME:
+ if (!(ptr = AddTag(ptr, buf_end, "/L=", 3, strLen)))
+ return;
+ break;
+ case STATE_NAME:
+ if (!(ptr = AddTag(ptr, buf_end, "/ST=", 4, strLen)))
+ return;
+ break;
+ case ORG_NAME:
+ if (!(ptr = AddTag(ptr, buf_end, "/O=", 3, strLen)))
+ return;
+ break;
+ case ORGUNIT_NAME:
+ if (!(ptr = AddTag(ptr, buf_end, "/OU=", 4, strLen)))
+ return;
+ break;
}
sha.Update(source_.get_current(), strLen);
@@ -740,17 +759,15 @@ void CertDecoder::GetName(NameType nt)
word32 length = GetLength(source_);
if (email) {
- memcpy(&ptr[idx], "/emailAddress=", 14);
- idx += 14;
-
- memcpy(&ptr[idx], source_.get_current(), length);
- idx += length;
+ if (!(ptr = AddTag(ptr, buf_end, "/emailAddress=", 14, length)))
+ return;
}
source_.advance(length);
}
}
- ptr[idx++] = 0;
+
+ *ptr = 0;
if (nt == ISSUER)
sha.Final(issuerHash_);