--- nss_ldap-210/util.c.original 2003-07-21 15:02:54 +0300 +++ nss_ldap-210/util.c 2003-09-04 19:53:42 +0300 @@ -367,6 +367,7 @@ if (strncasecmp (*p, rdnava, rdnavalen) == 0) { char *r = *p + rdnavalen; + int i,j; rdnlen = strlen (r); if (*buflen <= rdnlen) @@ -376,7 +377,32 @@ return NSS_TRYAGAIN; } rdnvalue = *buffer; - strncpy (rdnvalue, r, rdnlen); + i = 0; j = 0; + while (i < rdnlen) { + if (*(r+i) == '\\') { + unsigned char ch1 = *(r+i+1); + int code1 = (((ch1 >= '0') && (ch1 <= '9')) ? ch1-'0' : -1) + + (((ch1 >= 'A') && (ch1 <= 'F')) ? ch1-'A'+10 : -1) + + (((ch1 >= 'a') && (ch1 <= 'f')) ? ch1-'a'+10 : -1) + 3; + if (code1 != 0) { + unsigned char ch2 = *(r+i+2); + int code2 = (((ch2 >= '0') && (ch2 <= '9')) ? ch2-'0' : -1) + + (((ch2 >= 'A') && (ch2 <= 'F')) ? ch2-'A'+10 : -1) + + (((ch2 >= 'a') && (ch2 <= 'f')) ? ch2-'a'+10 : -1) + 3; + if (code2 != 0) { + *(rdnvalue+j) = ((code1-1) << 4)+(code2-1); + i += 3; j++; + continue; + } + } + *(rdnvalue+j) = ch1; + i+=2; j++; + continue; + } + *(rdnvalue+j) = *(r+i); + i++; j++; + } + rdnlen = j; break; } }