diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2016-09-05 18:08:50 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2016-09-05 18:11:48 +0200 |
commit | be3b15baaf8c52ed192934ea8db629f72901dbb8 (patch) | |
tree | 80d32b67ce337fb23426278e37d95e0f6852f719 | |
parent | 53e144dd60e6a4d75b3bd37c588f3ecdb5724aee (diff) | |
download | gnutls-be3b15baaf8c52ed192934ea8db629f72901dbb8.tar.gz |
_gnutls_encode_ber_rs_raw: simplified
That is, use a single allocation for temporary data.
-rw-r--r-- | lib/pk.c | 25 |
1 files changed, 10 insertions, 15 deletions
@@ -56,39 +56,33 @@ _gnutls_encode_ber_rs_raw(gnutls_datum_t * sig_value, return _gnutls_asn2err(result); } - if (r->data[0] >= 0x80) { - tmp = gnutls_malloc(r->size+1); + if (s->data[0] >= 0x80 || r->data[0] >= 0x80) { + tmp = gnutls_malloc(MAX(r->size, s->size)+1); if (tmp == NULL) { ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); goto cleanup; } - memcpy(&tmp[1], r->data, r->size); + } + + if (r->data[0] >= 0x80) { tmp[0] = 0; + memcpy(&tmp[1], r->data, r->size); result = asn1_write_value(sig, "r", tmp, 1+r->size); - - gnutls_free(tmp); - tmp = NULL; } else { result = asn1_write_value(sig, "r", r->data, r->size); } + if (result != ASN1_SUCCESS) { gnutls_assert(); ret = _gnutls_asn2err(result); goto cleanup; } + if (s->data[0] >= 0x80) { - tmp = gnutls_malloc(s->size+1); - if (tmp == NULL) { - ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); - goto cleanup; - } - memcpy(&tmp[1], s->data, s->size); tmp[0] = 0; + memcpy(&tmp[1], s->data, s->size); result = asn1_write_value(sig, "s", tmp, 1+s->size); - - gnutls_free(tmp); - tmp = NULL; } else { result = asn1_write_value(sig, "s", s->data, s->size); } @@ -107,6 +101,7 @@ _gnutls_encode_ber_rs_raw(gnutls_datum_t * sig_value, ret = 0; cleanup: + gnutls_free(tmp); asn1_delete_structure(&sig); return ret; } |