diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-09-04 23:30:46 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-09-04 23:34:35 +0200 |
commit | b334c4172b9836de60f82fe82239ccd1dcf6d2ea (patch) | |
tree | 17246e99557db17ba8394c9ff91a8c6b62022d19 | |
parent | 99726c69e17b2f785813f2c38df68085d7ccc51d (diff) | |
download | gnutls-b334c4172b9836de60f82fe82239ccd1dcf6d2ea.tar.gz |
optimized escaped comma handling
-rw-r--r-- | lib/x509/x509_dn.c | 23 |
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); |