summaryrefslogtreecommitdiffstats
path: root/sys/netsmb/smb_conn.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netsmb/smb_conn.c')
-rw-r--r--sys/netsmb/smb_conn.c32
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);
OpenPOWER on IntegriCloud