summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2014-09-04 23:30:46 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2014-09-04 23:34:35 +0200
commitb334c4172b9836de60f82fe82239ccd1dcf6d2ea (patch)
tree17246e99557db17ba8394c9ff91a8c6b62022d19
parent99726c69e17b2f785813f2c38df68085d7ccc51d (diff)
downloadgnutls-b334c4172b9836de60f82fe82239ccd1dcf6d2ea.tar.gz
optimized escaped comma handling
-rw-r--r--lib/x509/x509_dn.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/x509/x509_dn.c b/lib/x509/x509_dn.c
index 03cdc7e8ec..b6fe3f61fe 100644
--- a/lib/x509/x509_dn.c
+++ b/lib/x509/x509_dn.c
@@ -42,7 +42,7 @@ int dn_attr_crt_set(set_dn_func f, void *crt, const gnutls_datum_t * name,
gnutls_datum_t tmp;
const char *oid;
int ret;
- unsigned i;
+ unsigned i,j;
if (name->size == 0 || val->size == 0)
return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
@@ -75,19 +75,22 @@ int dn_attr_crt_set(set_dn_func f, void *crt, const gnutls_datum_t * name,
if (val->data[0] == '#')
return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
- ret = _gnutls_set_datum(&tmp, val->data, val->size);
- if (ret < 0)
+ tmp.size = val->size;
+ tmp.data = gnutls_malloc(tmp.size+1);
+ if (tmp.data == NULL) {
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+ }
- if (val->size > 1) {
- /* remove \\, */
- for (i=1;i<tmp.size-1;i++) {
- if (tmp.data[i] == '\\' && tmp.data[i+1] == ',') {
- memmove(&tmp.data[i], &tmp.data[i+1], tmp.size-i-1);
- tmp.size--;
- }
+ for (j=i=0;i<tmp.size;i++) {
+ if (1+j!=val->size && val->data[j] == '\\' && val->data[j+1] == ',') {
+ tmp.data[i] = ',';
+ j+=2;
+ tmp.size--;
+ } else {
+ tmp.data[i] = val->data[j++];
}
}
+ tmp.data[tmp.size] = 0;
ret = f(crt, oid, 0, tmp.data, tmp.size);
gnutls_free(tmp.data);