Index: helpers/basic_auth/LDAP/squid_ldap_auth.c =================================================================== RCS file: /cvsroot/squid/squid/helpers/basic_auth/LDAP/squid_ldap_auth.c,v retrieving revision 1.35 diff -u -p -r1.35 squid_ldap_auth.c --- helpers/basic_auth/LDAP/squid_ldap_auth.c 27 Aug 2007 14:52:51 -0000 1.35 +++ helpers/basic_auth/LDAP/squid_ldap_auth.c 4 Jul 2008 08:29:16 -0000 @@ -608,24 +608,37 @@ static int ldap_escape_value(char *escaped, int size, const char *src) { int n = 0; - while (size > 4 && *src) { - switch (*src) { + unsigned char ch; + while (size > 1 && (ch = (unsigned char) *src++) != 0) { + switch (ch) { case '*': case '(': case ')': case '\\': + if (size < 4) + break; n += 3; size -= 3; if (size > 0) { - *escaped++ = '\\'; - snprintf(escaped, 3, "%02x", (unsigned char) *src++); - escaped += 2; + snprintf(escaped, 4, "\\%02x", ch); + escaped += 3; } break; default: - *escaped++ = *src++; - n++; - size--; + if (ch < 0x80) { + *escaped++ = ch; + n++; + size--; + } else { + if (size < 7) + break; + snprintf(escaped, 7, "\\%02x\\%02x", + (ch >> 6) | 0xc0, + (ch & 0x3f) | 0x80); + escaped += 6; + n += 6; + size -= 6; + } } } *escaped = '\0'; @@ -656,7 +669,7 @@ checkLDAP(LDAP * persistent_ld, const ch LDAPMessage *res = NULL; LDAPMessage *entry; char *searchattr[] = - {(char *)LDAP_NO_ATTRS, NULL}; + {(char *) LDAP_NO_ATTRS, NULL}; char *userdn; int rc; LDAP *search_ld = persistent_ld; Index: helpers/digest_auth/ldap/ldap_backend.c =================================================================== RCS file: /cvsroot/squid/squid/helpers/digest_auth/ldap/ldap_backend.c,v retrieving revision 1.6 diff -u -p -r1.6 ldap_backend.c --- helpers/digest_auth/ldap/ldap_backend.c 13 Aug 2007 09:20:13 -0000 1.6 +++ helpers/digest_auth/ldap/ldap_backend.c 4 Jul 2008 08:29:16 -0000 @@ -160,24 +160,37 @@ static int ldap_escape_value(char *escaped, int size, const char *src) { int n = 0; - while (size > 4 && *src) { - switch (*src) { + unsigned char ch; + while (size > 1 && (ch = (unsigned char) *src++) != 0) { + switch (ch) { case '*': case '(': case ')': case '\\': + if (size < 4) + break; n += 3; size -= 3; if (size > 0) { - *escaped++ = '\\'; - snprintf(escaped, 3, "%02x", (int) *src++); - escaped += 2; + snprintf(escaped, 4, "\\%02x", ch); + escaped += 3; } break; default: - *escaped++ = *src++; - n++; - size--; + if (ch < 0x80) { + *escaped++ = ch; + n++; + size--; + } else { + if (size < 7) + break; + snprintf(escaped, 7, "\\%02x\\%02x", + (ch >> 6) | 0xc0, + (ch & 0x3f) | 0x80); + escaped += 6; + n += 6; + size -= 6; + } } } *escaped = '\0'; Index: helpers/external_acl/ldap_group/squid_ldap_group.c =================================================================== RCS file: /cvsroot/squid/squid/helpers/external_acl/ldap_group/squid_ldap_group.c,v retrieving revision 1.16 diff -u -p -r1.16 squid_ldap_group.c --- helpers/external_acl/ldap_group/squid_ldap_group.c 18 Mar 2008 02:44:56 -0000 1.16 +++ helpers/external_acl/ldap_group/squid_ldap_group.c 4 Jul 2008 08:29:16 -0000 @@ -608,24 +608,37 @@ static int ldap_escape_value(char *escaped, int size, const char *src) { int n = 0; - while (size > 4 && *src) { - switch (*src) { + unsigned char ch; + while (size > 1 && (ch = (unsigned char) *src++) != 0) { + switch (ch) { case '*': case '(': case ')': case '\\': + if (size < 4) + break; n += 3; size -= 3; if (size > 0) { - *escaped++ = '\\'; - snprintf(escaped, 3, "%02x", (unsigned char) *src++); - escaped += 2; + snprintf(escaped, 4, "\\%02x", ch); + escaped += 3; } break; default: - *escaped++ = *src++; - n++; - size--; + if (ch < 0x80) { + *escaped++ = ch; + n++; + size--; + } else { + if (size < 7) + break; + snprintf(escaped, 7, "\\%02x\\%02x", + (ch >> 6) | 0xc0, + (ch & 0x3f) | 0x80); + escaped += 6; + n += 6; + size -= 6; + } } } *escaped = '\0';