From d81ecb2730b3545f544016f1d9411cc4568b7bef Mon Sep 17 00:00:00 2001 From: Graham Leggett Date: Mon, 21 Apr 2014 12:57:43 +0000 Subject: Add apr_escape_ldap() and apr_pescape_ldap(), escaping characters as described by RFC4514 and RFC4515 respectively. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1588878 13f79535-47bb-0310-9956-ffa450edef68 --- encoding/apr_escape.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'encoding') diff --git a/encoding/apr_escape.c b/encoding/apr_escape.c index 2bcfec418..33705c739 100644 --- a/encoding/apr_escape.c +++ b/encoding/apr_escape.c @@ -1179,3 +1179,71 @@ APR_DECLARE(const void *) apr_punescape_hex(apr_pool_t *p, const char *str, return NULL; } + +APR_DECLARE(apr_status_t) apr_escape_ldap(char *escaped, const void *str, + apr_ssize_t slen, apr_size_t *len) +{ + apr_size_t size = 1; + int found = 0; + const unsigned char *s = (const unsigned char *) str; + unsigned char *d = (unsigned char *) escaped; + unsigned c; + + if (s) { + if (d) { + while (((c = *s) && slen) || (slen > 0)) { + if (TEST_CHAR(c, T_ESCAPE_LDAP)) { + d = c2x(c, '\\', d); + size += 2; + found = 1; + } + else { + *d++ = c; + } + ++s; + size++; + slen--; + } + *d = '\0'; + } + else { + while (((c = *s) && slen) || (slen > 0)) { + if (TEST_CHAR(c, T_ESCAPE_LDAP)) { + size += 2; + found = 1; + } + ++s; + size++; + slen--; + } + } + } + + if (len) { + *len = size; + } + if (!found) { + return APR_NOTFOUND; + } + + return APR_SUCCESS; +} + +APR_DECLARE(const char *) apr_pescape_ldap(apr_pool_t *p, const void *src, apr_ssize_t srclen) +{ + apr_size_t len; + + switch (apr_escape_ldap(NULL, src, srclen, &len)) { + case APR_SUCCESS: { + char *encoded = apr_palloc(p, len); + apr_escape_ldap(encoded, src, srclen, NULL); + return encoded; + } + case APR_NOTFOUND: { + break; + } + } + + return src; +} + -- cgit v1.2.1