diff options
Diffstat (limited to 'sys/netsmb/smb_conn.c')
-rw-r--r-- | sys/netsmb/smb_conn.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/sys/netsmb/smb_conn.c b/sys/netsmb/smb_conn.c index 2095eb1..2ee851b 100644 --- a/sys/netsmb/smb_conn.c +++ b/sys/netsmb/smb_conn.c @@ -444,13 +444,29 @@ smb_vc_create(struct smb_vcspec *vcspec, goto fail; if (vcspec->servercs[0]) { error = (int)iconv_open(vcspec->servercs, vcspec->localcs, - &vcp->vc_toserver); + &vcp->vc_cp_toserver); if (error) goto fail; error = (int)iconv_open(vcspec->localcs, vcspec->servercs, - &vcp->vc_tolocal); + &vcp->vc_cp_tolocal); if (error) goto fail; + vcp->vc_toserver = vcp->vc_cp_toserver; + vcp->vc_tolocal = vcp->vc_cp_tolocal; + iconv_add(ENCODING_UNICODE, ENCODING_UNICODE, SMB_UNICODE_NAME); + iconv_add(ENCODING_UNICODE, SMB_UNICODE_NAME, ENCODING_UNICODE); + error = (int)iconv_open(SMB_UNICODE_NAME, vcspec->localcs, + &vcp->vc_ucs_toserver); + if (!error) { + error = (int)iconv_open(vcspec->localcs, SMB_UNICODE_NAME, + &vcp->vc_ucs_tolocal); + } + if (error) { + if (vcp->vc_ucs_toserver) + iconv_close(vcp->vc_ucs_toserver); + vcp->vc_ucs_toserver = NULL; + vcp->vc_ucs_tolocal = NULL; + } } error = (int)smb_iod_create(vcp); if (error) @@ -486,9 +502,17 @@ smb_vc_free(struct smb_connobj *cp) if (vcp->vc_toupper) iconv_close(vcp->vc_toupper); if (vcp->vc_tolocal) - iconv_close(vcp->vc_tolocal); + vcp->vc_tolocal = NULL; if (vcp->vc_toserver) - iconv_close(vcp->vc_toserver); + vcp->vc_toserver = NULL; + if (vcp->vc_cp_tolocal) + iconv_close(vcp->vc_cp_tolocal); + if (vcp->vc_cp_toserver) + iconv_close(vcp->vc_cp_toserver); + if (vcp->vc_ucs_tolocal) + iconv_close(vcp->vc_ucs_tolocal); + if (vcp->vc_ucs_toserver) + iconv_close(vcp->vc_ucs_toserver); smb_co_done(VCTOCP(vcp)); smb_sl_destroy(&vcp->vc_stlock); free(vcp, M_SMBCONN); |