summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2016-09-05 18:08:50 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2016-09-05 18:11:48 +0200
commitbe3b15baaf8c52ed192934ea8db629f72901dbb8 (patch)
tree80d32b67ce337fb23426278e37d95e0f6852f719
parent53e144dd60e6a4d75b3bd37c588f3ecdb5724aee (diff)
downloadgnutls-be3b15baaf8c52ed192934ea8db629f72901dbb8.tar.gz
_gnutls_encode_ber_rs_raw: simplified
That is, use a single allocation for temporary data.
-rw-r--r--lib/pk.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/lib/pk.c b/lib/pk.c
index efdb9fe17a..5af82908ed 100644
--- a/lib/pk.c
+++ b/lib/pk.c
@@ -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;
}