1/* 2 Unix SMB/CIFS implementation. 3 ldap filter argument escaping 4 5 Copyright (C) 1998, 1999, 2000 Luke Howard <lukeh@padl.com>, 6 Copyright (C) 2003 Andrew Bartlett <abartlet@samba.org> 7 8 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. 13 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. 18 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. 22*/ 23 24#include "includes.h" 25 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. 29 * 30 * @param s The input string 31 * 32 * @return A string allocated with malloc(), containing the escaped string, 33 * and to be free()ed by the caller. 34 **/ 35 36char *escape_ldap_string_alloc(const char *s) 37{ 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; 44 45 while (*s) 46 { 47 switch (*s) 48 { 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; 64 } 65 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; 72 } 73 output = output_tmp; 74 75 p = &output[i]; 76 strncpy (p, sub, 3); 77 p += 3; 78 i += 3; 79 80 } else { 81 *p = *s; 82 p++; 83 i++; 84 } 85 s++; 86 } 87 88 *p = '\0'; 89 return output; 90} 91