s4-dsdb/reanimate: Swap rename->modify operations to modify->rename sequence
[Samba.git] / source3 / lib / ldap_escape.c
bloba731cb986421d440913282f53be01d1ece1a5209
1 /*
2 Unix SMB/CIFS implementation.
3 ldap filter argument escaping
5 Copyright (C) 1998, 1999, 2000 Luke Howard <lukeh@padl.com>,
6 Copyright (C) 2003 Andrew Bartlett <abartlet@samba.org>
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "includes.h"
25 /**
26 * Escape a parameter to an LDAP filter string, so they cannot contain
27 * embeded ( ) * or \ chars which may cause it not to parse correctly.
29 * @param s The input string
31 * @return A string allocated with malloc(), containing the escaped string,
32 * and to be free()ed by the caller.
33 **/
35 char *escape_ldap_string(TALLOC_CTX *mem_ctx, const char *s)
37 size_t len = strlen(s)+1;
38 char *output = talloc_array(mem_ctx, char, len);
39 const char *sub;
40 int i = 0;
41 char *p = output;
43 if (output == NULL) {
44 return NULL;
47 while (*s)
49 switch (*s)
51 case '*':
52 sub = "\\2a";
53 break;
54 case '(':
55 sub = "\\28";
56 break;
57 case ')':
58 sub = "\\29";
59 break;
60 case '\\':
61 sub = "\\5c";
62 break;
63 default:
64 sub = NULL;
65 break;
68 if (sub) {
69 char *tmp;
70 len = len + 3;
71 tmp = talloc_realloc(mem_ctx, output, char, len);
72 if (tmp == NULL) {
73 TALLOC_FREE(output);
74 return NULL;
76 output = tmp;
78 p = &output[i];
79 strncpy (p, sub, 3);
80 p += 3;
81 i += 3;
83 } else {
84 *p = *s;
85 p++;
86 i++;
88 s++;
91 *p = '\0';
92 return output;
95 char *escape_rdn_val_string_alloc(const char *s)
97 char *output, *p;
99 /* The maximum size of the escaped string can be twice the actual size */
100 output = (char *)SMB_MALLOC(2*strlen(s) + 1);
102 if (output == NULL) {
103 return NULL;
106 p = output;
108 while (*s)
110 switch (*s)
112 case ',':
113 case '=':
114 case '+':
115 case '<':
116 case '>':
117 case '#':
118 case ';':
119 case '\\':
120 case '\"':
121 *p++ = '\\';
122 *p++ = *s;
123 break;
124 default:
125 *p = *s;
126 p++;
129 s++;
132 *p = '\0';
134 /* resize the string to the actual final size */
135 output = (char *)SMB_REALLOC(output, strlen(output) + 1);
136 return output;