Browse Source

Fix segfault on test-crypto

Plus random cleanups. This code needs help.
v0.7.4-release
Ryan Dahl 14 years ago
parent
commit
de6e88c428
  1. 51
      src/node_crypto.cc

51
src/node_crypto.cc

@ -729,25 +729,23 @@ static void HexDecode(unsigned char *input,
void base64(unsigned char *input, int length, char** buf64, int* buf64_len) { void base64(unsigned char *input, int length, char** buf64, int* buf64_len) {
BIO *bmem, *b64; BIO *b64 = BIO_new(BIO_f_base64());
BUF_MEM *bptr; BIO *bmem = BIO_new(BIO_s_mem());
int len;
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem); b64 = BIO_push(b64, bmem);
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
len = BIO_write(b64, input, length); int len = BIO_write(b64, input, length);
assert(len == length); assert(len == length);
int r = BIO_flush(b64); int r = BIO_flush(b64);
assert(r == 1); assert(r == 1);
BUF_MEM *bptr;
BIO_get_mem_ptr(b64, &bptr); BIO_get_mem_ptr(b64, &bptr);
*buf64_len = bptr->length; *buf64_len = bptr->length;
*buf64 = new char[*buf64_len+1]; *buf64 = new char[*buf64_len+1];
memcpy(*buf64, bptr->data, bptr->length); memcpy(*buf64, bptr->data, *buf64_len);
char* b = *buf64; char* b = *buf64;
b[bptr->length] = 0; b[*buf64_len] = 0;
BIO_free_all(b64); BIO_free_all(b64);
} }
@ -1881,15 +1879,6 @@ class Hash : public ObjectWrap {
return 1; return 1;
} }
int HashDigest(unsigned char** md_value, unsigned int *md_len) {
if (!initialised_) return 0;
*md_value = new unsigned char[EVP_MAX_MD_SIZE];
EVP_DigestFinal_ex(&mdctx, *md_value, md_len);
EVP_MD_CTX_cleanup(&mdctx);
initialised_ = false;
return 1;
}
protected: protected:
@ -1948,22 +1937,27 @@ class Hash : public ObjectWrap {
} }
static Handle<Value> HashDigest(const Arguments& args) { static Handle<Value> HashDigest(const Arguments& args) {
HandleScope scope;
Hash *hash = ObjectWrap::Unwrap<Hash>(args.This()); Hash *hash = ObjectWrap::Unwrap<Hash>(args.This());
HandleScope scope; if (!hash->initialised_) {
return ThrowException(Exception::Error(String::New("Not initialized")));
}
unsigned char* md_value; unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len; unsigned int md_len;
char* md_hexdigest;
int md_hex_len;
Local<Value> outString ;
int r = hash->HashDigest(&md_value, &md_len); EVP_DigestFinal_ex(&hash->mdctx, md_value, &md_len);
EVP_MD_CTX_cleanup(&hash->mdctx);
hash->initialised_ = false;
if (md_len == 0 || r == 0) { if (md_len == 0) {
return scope.Close(String::New("")); return scope.Close(String::New(""));
} }
Local<Value> outString;
if (args.Length() == 0 || !args[0]->IsString()) { if (args.Length() == 0 || !args[0]->IsString()) {
// Binary // Binary
outString = Encode(md_value, md_len, BINARY); outString = Encode(md_value, md_len, BINARY);
@ -1971,10 +1965,14 @@ class Hash : public ObjectWrap {
String::Utf8Value encoding(args[0]->ToString()); String::Utf8Value encoding(args[0]->ToString());
if (strcasecmp(*encoding, "hex") == 0) { if (strcasecmp(*encoding, "hex") == 0) {
// Hex encoding // Hex encoding
char* md_hexdigest;
int md_hex_len;
HexEncode(md_value, md_len, &md_hexdigest, &md_hex_len); HexEncode(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY); outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest; delete [] md_hexdigest;
} else if (strcasecmp(*encoding, "base64") == 0) { } else if (strcasecmp(*encoding, "base64") == 0) {
char* md_hexdigest;
int md_hex_len;
base64(md_value, md_len, &md_hexdigest, &md_hex_len); base64(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY); outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest; delete [] md_hexdigest;
@ -1985,9 +1983,8 @@ class Hash : public ObjectWrap {
"can be binary, hex or base64\n"); "can be binary, hex or base64\n");
} }
} }
delete [] md_value;
return scope.Close(outString);
return scope.Close(outString);
} }
Hash () : ObjectWrap () { Hash () : ObjectWrap () {

Loading…
Cancel
Save