r5592: Oops, accidentally committed test version of rpcclient. Reverting changes.
[Samba/gbeck.git] / source3 / lib / ldap_escape.c
blob6c4e8b8c837e59ac0d4bec0bf72dc4136935df35
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 2 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, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "includes.h"
26 /**
27 * Escape a parameter to an LDAP filter string, so they cannot contain
28 * embeded ( ) * or \ chars which may cause it not to parse correctly.
30 * @param s The input string
32 * @return A string allocated with malloc(), containing the escaped string,
33 * and to be free()ed by the caller.
34 **/
36 char *escape_ldap_string_alloc(const char *s)
38 size_t len = strlen(s)+1;
39 char *output = SMB_MALLOC(len);
40 char *output_tmp;
41 const char *sub;
42 int i = 0;
43 char *p = output;
45 while (*s)
47 switch (*s)
49 case '*':
50 sub = "\\2a";
51 break;
52 case '(':
53 sub = "\\28";
54 break;
55 case ')':
56 sub = "\\29";
57 break;
58 case '\\':
59 sub = "\\5c";
60 break;
61 default:
62 sub = NULL;
63 break;
66 if (sub) {
67 len = len + 3;
68 output_tmp = SMB_REALLOC(output, len);
69 if (!output_tmp) {
70 SAFE_FREE(output);
71 return NULL;
73 output = output_tmp;
75 p = &output[i];
76 strncpy (p, sub, 3);
77 p += 3;
78 i += 3;
80 } else {
81 *p = *s;
82 p++;
83 i++;
85 s++;
88 *p = '\0';
89 return output;