From owner-freebsd-bugs@FreeBSD.ORG Sat Feb 26 09:40:15 2005 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9B08816A4CE for ; Sat, 26 Feb 2005 09:40:15 +0000 (GMT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4399643D5A for ; Sat, 26 Feb 2005 09:40:15 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.1/8.13.1) with ESMTP id j1Q9eF5K001725 for ; Sat, 26 Feb 2005 09:40:15 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.1/8.13.1/Submit) id j1Q9eFZM001724; Sat, 26 Feb 2005 09:40:15 GMT (envelope-from gnats) Resent-Date: Sat, 26 Feb 2005 09:40:15 GMT Resent-Message-Id: <200502260940.j1Q9eFZM001724@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Daichi GOTO Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8181216A4D0 for ; Sat, 26 Feb 2005 09:39:25 +0000 (GMT) Received: from ongs.co.jp (natial.ongs.co.jp [202.216.232.58]) by mx1.FreeBSD.org (Postfix) with SMTP id AA0A743D2D for ; Sat, 26 Feb 2005 09:39:23 +0000 (GMT) (envelope-from daichi@ongs.co.jp) Received: (qmail 9745 invoked from network); 26 Feb 2005 09:31:46 -0000 Received: from dullmdaler.ongs.co.jp (HELO parancell.ongs.co.jp) (202.216.232.62) by natial.ongs.co.jp with SMTP; 26 Feb 2005 09:31:46 -0000 Received: from parancell.ongs.co.jp (localhost.ongs.co.jp [127.0.0.1]) by parancell.ongs.co.jp (8.13.1/8.13.1) with ESMTP id j1Q9d2xL083095; Sat, 26 Feb 2005 18:39:02 +0900 (JST) (envelope-from daichi@parancell.ongs.co.jp) Received: (from daichi@localhost) by parancell.ongs.co.jp (8.13.1/8.13.1/Submit) id j1Q9d1dS083094; Sat, 26 Feb 2005 18:39:01 +0900 (JST) (envelope-from daichi) Message-Id: <200502260939.j1Q9d1dS083094@parancell.ongs.co.jp> Date: Sat, 26 Feb 2005 18:39:01 +0900 (JST) From: Daichi GOTO To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 cc: Boris Popov cc: ozawa@ongs.co.jp Subject: kern/78110: [BUGFIX] fixed multibyte treatment of Samba FS (smb/ctx.c). X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Daichi GOTO List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 Feb 2005 09:40:15 -0000 >Number: 78110 >Category: kern >Synopsis: [BUGFIX] fixed multibyte treatment of Samba FS (smb/ctx.c). >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Feb 26 09:40:14 GMT 2005 >Closed-Date: >Last-Modified: >Originator: Daichi GOTO >Release: FreeBSD 5.3-RELEASE-p5 i386 >Organization: ONGS Inc. >Environment: System: FreeBSD parancell.ongs.co.jp 5.3-RELEASE-p5 FreeBSD 5.3-RELEASE-p5 #0: Thu Feb 3 14:43:53 JST 2005 root@parancell.ongs.co.jp:/usr/obj/usr/src/sys/GENERIC i386 >Description: Current mount_smbfs can not treat multibyte characters correctly. description as follow and those threads: http://home.jp.freebsd.org/cgi-bin/showmail/FreeBSD-users-jp/73012 http://home.jp.freebsd.org/cgi-bin/showmail/FreeBSD-users-jp/73034 I had found that src/contrib/smbfs/lib/smb/ctx.c caused problem. The ctx.c transforms charactor as 1 byte only. This is problem. >How-To-Repeat: Do mount_smbfs with -E EUC-JP:CP932 option. You cannot use it correctly. >Fix: Please merge patch as follow. I expect that this correction is merged by FreeBSD 5.4-RELEASE. diff -urN src.orig/contrib/smbfs/lib/smb/ctx.c src/contrib/smbfs/lib/smb/ctx.c --- src.orig/contrib/smbfs/lib/smb/ctx.c Sun Jul 27 20:41:38 2003 +++ src/contrib/smbfs/lib/smb/ctx.c Fri Feb 25 22:55:12 2005 @@ -473,8 +473,6 @@ struct sockaddr *sap; struct sockaddr_nb *salocal, *saserver; char *cp; - u_char cstbl[256]; - u_int i; int error = 0; ctx->ct_flags &= ~SMBCF_RESOLVED; @@ -496,7 +494,7 @@ if (error) return error; if (ssn->ioc_localcs[0] == 0) - strcpy(ssn->ioc_localcs, "default"); /* XXX: locale name ? */ + strcpy(ssn->ioc_localcs, "ISO8859-1"); error = smb_addiconvtbl("tolower", ssn->ioc_localcs, nls_lower); if (error) return error; @@ -504,18 +502,9 @@ if (error) return error; if (ssn->ioc_servercs[0] != 0) { - for(i = 0; i < sizeof(cstbl); i++) - cstbl[i] = i; - nls_mem_toext(cstbl, cstbl, sizeof(cstbl)); - error = smb_addiconvtbl(ssn->ioc_servercs, ssn->ioc_localcs, cstbl); - if (error) - return error; - for(i = 0; i < sizeof(cstbl); i++) - cstbl[i] = i; - nls_mem_toloc(cstbl, cstbl, sizeof(cstbl)); - error = smb_addiconvtbl(ssn->ioc_localcs, ssn->ioc_servercs, cstbl); - if (error) - return error; + error = kiconv_add_xlat16_cspairs + (ssn->ioc_localcs, ssn->ioc_servercs); + if (error) return error; } if (ctx->ct_srvaddr) { error = nb_resolvehost_in(ctx->ct_srvaddr, &sap); diff -urN src.orig/lib/libsmb/Makefile src/lib/libsmb/Makefile --- src.orig/lib/libsmb/Makefile Sat Sep 28 09:25:31 2002 +++ src/lib/libsmb/Makefile Fri Feb 25 22:56:00 2005 @@ -12,6 +12,7 @@ nb.c nb_name.c nb_net.c nbns_rq.c CONTRIBDIR= ${.CURDIR}/../../contrib/smbfs CFLAGS+= -DSMB_CFG_FILE=\"/etc/nsmb.conf\" -I${CONTRIBDIR}/include +LDFLAGS+= -lkiconv .PATH: ${CONTRIBDIR}/lib/smb diff -urN src.orig/sys/fs/smbfs/smbfs_smb.c src/sys/fs/smbfs/smbfs_smb.c --- src.orig/sys/fs/smbfs/smbfs_smb.c Mon Jan 12 23:43:49 2004 +++ src/sys/fs/smbfs/smbfs_smb.c Fri Feb 25 22:53:06 2005 @@ -1449,8 +1449,8 @@ continue; break; } - smbfs_fname_tolocal(SSTOVC(ctx->f_ssp), ctx->f_name, ctx->f_nmlen, - ctx->f_dnp->n_mount->sm_caseopt); + smbfs_fname_tolocal(SSTOVC(ctx->f_ssp), ctx->f_name, &ctx->f_nmlen, + ctx->f_dnp->n_mount->sm_caseopt); ctx->f_attr.fa_ino = smbfs_getino(ctx->f_dnp, ctx->f_name, ctx->f_nmlen); return 0; } diff -urN src.orig/sys/fs/smbfs/smbfs_subr.c src/sys/fs/smbfs/smbfs_subr.c --- src.orig/sys/fs/smbfs/smbfs_subr.c Sun Jun 15 00:24:54 2003 +++ src/sys/fs/smbfs/smbfs_subr.c Fri Feb 25 22:53:06 2005 @@ -316,13 +316,33 @@ } int -smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int nmlen, int caseopt) +smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int *nmlen, int caseopt) { -/* if (caseopt & SMB_CS_UPPER) - iconv_convmem(vcp->vc_toupper, name, name, nmlen); - else if (caseopt & SMB_CS_LOWER) - iconv_convmem(vcp->vc_tolower, name, name, nmlen);*/ - if (vcp->vc_tolocal) - iconv_convmem(vcp->vc_tolocal, name, name, nmlen); - return 0; + int copt = (caseopt == SMB_CS_LOWER ? KICONV_FROM_LOWER : + (caseopt == SMB_CS_UPPER ? KICONV_FROM_UPPER : 0)); + int error = 0; + int ilen = *nmlen; + int olen; + char *ibuf = name; + char outbuf[SMB_MAXFNAMELEN]; + char *obuf = outbuf; + + if (vcp->vc_tolocal) { + olen = sizeof(outbuf); + bzero(outbuf, sizeof(outbuf)); + + /* + error = iconv_conv_case + (vcp->vc_tolocal, NULL, NULL, &obuf, &olen, copt); + if (error) return error; + */ + + error = iconv_conv_case + (vcp->vc_tolocal, &ibuf, &ilen, &obuf, &olen, copt); + if (!error) { + *nmlen = sizeof(outbuf) - olen; + memcpy(name, outbuf, *nmlen); + } + } + return error; } diff -urN src.orig/sys/fs/smbfs/smbfs_subr.h src/sys/fs/smbfs/smbfs_subr.h --- src.orig/sys/fs/smbfs/smbfs_subr.h Wed Sep 18 18:27:04 2002 +++ src/sys/fs/smbfs/smbfs_subr.h Fri Feb 25 22:53:06 2005 @@ -177,7 +177,7 @@ int smbfs_smb_lookup(struct smbnode *dnp, const char *name, int nmlen, struct smbfattr *fap, struct smb_cred *scred); -int smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int nmlen, int caseopt); +int smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int *nmlen, int caseopt); void smb_time_local2server(struct timespec *tsp, int tzoff, u_long *seconds); void smb_time_server2local(u_long seconds, int tzoff, struct timespec *tsp); >Release-Note: >Audit-Trail: >Unformatted: