summaryrefslogtreecommitdiff
path: root/encoding
diff options
context:
space:
mode:
authorGraham Leggett <minfrin@apache.org>2014-04-21 12:57:43 +0000
committerGraham Leggett <minfrin@apache.org>2014-04-21 12:57:43 +0000
commitd81ecb2730b3545f544016f1d9411cc4568b7bef (patch)
tree6ac87903705986c2295a0c18b2ce65af4fa27d43 /encoding
parenta7219fda36e13f1399b8d413ebf961dccadcdd67 (diff)
downloadapr-d81ecb2730b3545f544016f1d9411cc4568b7bef.tar.gz
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
Diffstat (limited to 'encoding')
-rw-r--r--encoding/apr_escape.c68
1 files changed, 68 insertions, 0 deletions
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;
+}
+