summaryrefslogtreecommitdiff
path: root/lib/ldap.c
diff options
context:
space:
mode:
authorSteve Holme <steve_holme@hotmail.com>2015-01-07 19:45:24 +0000
committerSteve Holme <steve_holme@hotmail.com>2015-01-07 20:01:29 +0000
commitf7d5ecec9c99d283a9a196eca88ba70560321eaf (patch)
tree0cd0c35f4638715fa88f66e14b9e705df7c87b7b /lib/ldap.c
parent4e420600c1266ee9afdab51657c76089606314e1 (diff)
downloadcurl-f7d5ecec9c99d283a9a196eca88ba70560321eaf.tar.gz
ldap: Convert attribute output to UTF-8 when Unicode
Diffstat (limited to 'lib/ldap.c')
-rw-r--r--lib/ldap.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/lib/ldap.c b/lib/ldap.c
index 4390a4dff..f27fa9008 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -490,18 +490,32 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
for(attribute = ldap_first_attribute(server, entryIterator, &ber);
attribute;
attribute = ldap_next_attribute(server, entryIterator, ber)) {
+ BerValue **vals;
+ size_t attr_len;
#if defined(CURL_LDAP_WIN)
- size_t attr_len = _tcslen(attribute);
+ char *attr = Curl_convert_tchar_to_UTF8(attribute);
+ if(!attr) {
+ if(ber)
+ ber_free(ber, 0);
+
+ result = CURLE_OUT_OF_MEMORY;
+
+ goto quit;
+ }
#else
- size_t attr_len = strlen(attribute);
+ char *attr = attribute;
#endif
- BerValue **vals = ldap_get_values_len(server, entryIterator, attribute);
+ attr_len = strlen(attr);
+ vals = ldap_get_values_len(server, entryIterator, attribute);
if(vals != NULL) {
for(i = 0; (vals[i] != NULL); i++) {
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1);
if(result) {
ldap_value_free_len(vals);
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -510,9 +524,12 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
}
result = Curl_client_write(conn, CLIENTWRITE_BODY,
- (char *)attribute, attr_len);
+ (char *) attr, attr_len);
if(result) {
ldap_value_free_len(vals);
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -523,6 +540,9 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2);
if(result) {
ldap_value_free_len(vals);
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -533,7 +553,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
dlsize += attr_len + 3;
if((attr_len > 7) &&
- (strcmp(";binary", (char *) attribute + (attr_len - 7)) == 0)) {
+ (strcmp(";binary", (char *) attr + (attr_len - 7)) == 0)) {
/* Binary attribute, encode to base64. */
result = Curl_base64_encode(data,
vals[i]->bv_val,
@@ -542,6 +562,9 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
&val_b64_sz);
if(result) {
ldap_value_free_len(vals);
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -555,6 +578,9 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
free(val_b64);
if(result) {
ldap_value_free_len(vals);
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -570,6 +596,9 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
vals[i]->bv_len);
if(result) {
ldap_value_free_len(vals);
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -583,6 +612,9 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);
if(result) {
ldap_value_free_len(vals);
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
if(ber)
ber_free(ber, 0);
@@ -598,6 +630,9 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
}
/* Free the attribute as we are done with it */
+#if defined(CURL_LDAP_WIN)
+ Curl_unicodefree(attr);
+#endif
ldap_memfree(attribute);
result = Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\n", 1);