tags 465249 + patch thanks Attached is a patch for escaping lookup values. This patch isn't extensively tested yet.
-- -- arthur - [EMAIL PROTECTED] - http://people.debian.org/~adejong --
--- autofs-4.1.4/modules/lookup_ldap.c 2005-02-27 06:37:14.000000000 +0100
+++ autofs-4.1.4+debian/modules/lookup_ldap.c 2008-02-23 09:07:32.000000000 +0100
@@ -188,6 +188,47 @@
return !(ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1));
}
+/* This function escapes the string in src into the provided buffer.
+ It will return 0 on success and -1 on if it did not fit in the buffer. */
+static int query_escape(const char *src,char *buffer,size_t buflen)
+{
+ size_t pos=0;
+ /* go over all characters in source string */
+ for (;*src!='\0';src++) {
+ /* check if char will fit */
+ if (pos>=(buflen+4)) {
+ buffer[pos]='\0';
+ return -1;
+ }
+ /* do escaping for some characters */
+ switch (*src) {
+ case '*':
+ strcpy(buffer+pos,"\\2a");
+ pos+=3;
+ break;
+ case '(':
+ strcpy(buffer+pos,"\\28");
+ pos+=3;
+ break;
+ case ')':
+ strcpy(buffer+pos,"\\29");
+ pos+=3;
+ break;
+ case '\\':
+ strcpy(buffer+pos,"\\5c");
+ pos+=3;
+ break;
+ default:
+ /* just copy character */
+ buffer[pos++]=*src;
+ break;
+ }
+ }
+ /* terminate destination string */
+ buffer[pos]='\0';
+ return 0;
+}
+
static int read_one_map(const char *root,
const char *class, char *key,
const char *keyval, int keyvallen, char *type,
@@ -201,12 +242,22 @@
char **values = NULL;
char *attrs[] = { key, type, NULL };
LDAP *ldap;
+ char keyvalbuf[KEY_MAX_LEN + 1];
if (ctxt == NULL) {
crit(MODPREFIX "context was NULL");
return 0;
}
+ /* Escape the lookup keyval. */
+ if (keyvallen > 0) {
+ if (query_escape(keyval,keyvalbuf,sizeof(keyvalbuf))) {
+ debug(MODPREFIX "error escaping keyval string");
+ }
+ keyval=keyvalbuf;
+ keyvallen=strlen(keyvalbuf);
+ }
+
/* Build a query string. */
l = strlen("(objectclass=)") + strlen(class) + 1;
if (keyvallen > 0) {
@@ -391,12 +442,19 @@
LDAP *ldap;
struct mapent_cache *me = NULL;
int ret = CHE_OK;
+ char qKeybuf[KEY_MAX_LEN + 1];
if (ctxt == NULL) {
crit(MODPREFIX "context was NULL");
return 0;
}
+ /* Escape the lookup qKey. */
+ if (query_escape(qKey,qKeybuf,sizeof(qKeybuf))) {
+ debug(MODPREFIX "error escaping keyval string");
+ }
+ qKey=qKeybuf;
+
/* Build a query string. */
l = strlen("(&(objectclass=") + strlen(class) + strlen(")");
l += strlen("(") + strlen(key) + strlen("=")
signature.asc
Description: This is a digitally signed message part

