mirror of
https://github.com/samba-team/samba.git
synced 2025-03-27 22:50:26 +03:00
HEIMDAL:lib/krb5: add utf8 support to build_logon_name() for the PAC
Pair-Programmed-With: Arvid Requate <requate@univention.de> metze Autobuild-User: Stefan Metzmacher <metze@samba.org> Autobuild-Date: Wed Nov 16 02:00:12 CET 2011 on sn-devel-104
This commit is contained in:
parent
d158a5cb91
commit
dd504b1899
@ -706,7 +706,7 @@ build_logon_name(krb5_context context,
|
||||
krb5_storage *sp;
|
||||
uint64_t t;
|
||||
char *s, *s2;
|
||||
size_t i, len;
|
||||
size_t s2_len;
|
||||
|
||||
t = unix2nttime(authtime);
|
||||
|
||||
@ -726,29 +726,60 @@ build_logon_name(krb5_context context,
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
len = strlen(s);
|
||||
{
|
||||
size_t ucs2_len;
|
||||
uint16_t *ucs2;
|
||||
unsigned int flags;
|
||||
|
||||
CHECK(ret, krb5_store_uint16(sp, len * 2), out);
|
||||
ret = wind_utf8ucs2_length(s, &ucs2_len);
|
||||
if (ret) {
|
||||
free(s);
|
||||
krb5_set_error_message(context, ret, "Failed to count length of UTF-8 string");
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 1 /* cheat for now */
|
||||
s2 = malloc(len * 2);
|
||||
if (s2 == NULL) {
|
||||
ret = krb5_enomem(context);
|
||||
ucs2 = malloc(sizeof(ucs2[0]) * ucs2_len);
|
||||
if (ucs2 == NULL) {
|
||||
free(s);
|
||||
return krb5_enomem(context);
|
||||
}
|
||||
|
||||
ret = wind_utf8ucs2(s, ucs2, &ucs2_len);
|
||||
free(s);
|
||||
goto out;
|
||||
}
|
||||
for (i = 0; i < len; i++) {
|
||||
s2[i * 2] = s[i];
|
||||
s2[i * 2 + 1] = 0;
|
||||
}
|
||||
free(s);
|
||||
#else
|
||||
/* write libwind code here */
|
||||
#endif
|
||||
if (ret) {
|
||||
free(ucs2);
|
||||
krb5_set_error_message(context, ret, "Failed to convert string to UCS-2");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = krb5_storage_write(sp, s2, len * 2);
|
||||
s2_len = (ucs2_len + 1) * 2;
|
||||
s2 = malloc(s2_len);
|
||||
if (ucs2 == NULL) {
|
||||
free(ucs2);
|
||||
return krb5_enomem(context);
|
||||
}
|
||||
|
||||
flags = WIND_RW_LE;
|
||||
ret = wind_ucs2write(ucs2, ucs2_len,
|
||||
&flags, s2, &s2_len);
|
||||
free(ucs2);
|
||||
if (ret) {
|
||||
free(s2);
|
||||
krb5_set_error_message(context, ret, "Failed to write to UCS-2 buffer");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* we do not want zero termination
|
||||
*/
|
||||
s2_len = ucs2_len * 2;
|
||||
}
|
||||
|
||||
CHECK(ret, krb5_store_uint16(sp, s2_len), out);
|
||||
|
||||
ret = krb5_storage_write(sp, s2, s2_len);
|
||||
free(s2);
|
||||
if (ret != (int)(len * 2)) {
|
||||
if (ret != (int)s2_len) {
|
||||
ret = krb5_enomem(context);
|
||||
goto out;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user