From daichi@ongs.co.jp  Sat Feb 26 09:39:25 2005
Return-Path: <daichi@ongs.co.jp>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 8181216A4D0
	for <FreeBSD-gnats-submit@freebsd.org>; 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 <FreeBSD-gnats-submit@freebsd.org>; 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 <daichi@freebsd.org>
Reply-To: Daichi GOTO <daichi@freebsd.org>
To: FreeBSD-gnats-submit@freebsd.org
Cc: Boris Popov <bp@freebsd.org>, ozawa@ongs.co.jp
Subject: [BUGFIX] fixed multibyte treatment of Samba FS (smb/ctx.c).
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         78110
>Category:       kern
>Synopsis:       [patch] fixed multibyte treatment of Samba FS (smb/ctx.c).
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    bp
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Feb 26 09:40:14 GMT 2005
>Closed-Date:    Wed May 04 15:12:57 GMT 2005
>Last-Modified:  Wed May 04 15:12:57 GMT 2005
>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:
Responsible-Changed-From-To: freebsd-bugs->bp 
Responsible-Changed-By: takawata 
Responsible-Changed-When: Tue Apr 12 07:18:50 GMT 2005 
Responsible-Changed-Why:  
Over  to maintainer  of smbfs. (Submitter intended so. ) 

http://www.freebsd.org/cgi/query-pr.cgi?pr=78110 

From: takawata@jp.freebsd.org
To: freebsd-gnats-submit@FreeBSD.org, daichi@freebsd.org
Cc: takawata@freebsd.org, freebsd-fs@freebsd.org
Subject: Re: kern/78110: [patch] fixed multibyte treatment of Samba FS (smb/ctx.c).
Date: Thu, 14 Apr 2005 11:09:39 +0900

 I wrote a patch that can applied to -CURRENT at a few days ago.
 Please review it. 
 If anyone don't make objections in a week, I'll commit it.
 
 
 Index: contrib/smbfs/lib/smb/ctx.c
 ===================================================================
 RCS file: /home/ncvs/src/contrib/smbfs/lib/smb/ctx.c,v
 retrieving revision 1.3
 diff -u -r1.3 ctx.c
 --- contrib/smbfs/lib/smb/ctx.c	27 Jul 2003 11:41:38 -0000	1.3
 +++ contrib/smbfs/lib/smb/ctx.c	7 Apr 2005 23:30:42 -0000
 @@ -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);
 Index: sys/fs/smbfs/smbfs_smb.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/fs/smbfs/smbfs_smb.c,v
 retrieving revision 1.14
 diff -u -r1.14 smbfs_smb.c
 --- sys/fs/smbfs/smbfs_smb.c	6 Jan 2005 18:10:41 -0000	1.14
 +++ sys/fs/smbfs/smbfs_smb.c	7 Apr 2005 23:30:42 -0000
 @@ -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;
  }
 Index: sys/fs/smbfs/smbfs_subr.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/fs/smbfs/smbfs_subr.c,v
 retrieving revision 1.5
 diff -u -r1.5 smbfs_subr.c
 --- sys/fs/smbfs/smbfs_subr.c	6 Jan 2005 18:10:41 -0000	1.5
 +++ sys/fs/smbfs/smbfs_subr.c	7 Apr 2005 23:40:24 -0000
 @@ -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, (const char **)&ibuf, &ilen, &obuf, &olen, copt);
 +		if (!error) {
 +			*nmlen = sizeof(outbuf) - olen;
 +			memcpy(name, outbuf, *nmlen);
 +		}
 +	}
 +	return error;
  }
 Index: sys/fs/smbfs/smbfs_subr.h
 ===================================================================
 RCS file: /home/ncvs/src/sys/fs/smbfs/smbfs_subr.h,v
 retrieving revision 1.5
 diff -u -r1.5 smbfs_subr.h
 --- sys/fs/smbfs/smbfs_subr.h	10 Feb 2005 12:07:02 -0000	1.5
 +++ sys/fs/smbfs/smbfs_subr.h	7 Apr 2005 23:30:42 -0000
 @@ -174,7 +174,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);
 Index: usr.bin/smbutil/Makefile
 ===================================================================
 RCS file: /home/ncvs/src/usr.bin/smbutil/Makefile,v
 retrieving revision 1.1
 diff -u -r1.1 Makefile
 --- usr.bin/smbutil/Makefile	14 Dec 2001 11:41:22 -0000	1.1
 +++ usr.bin/smbutil/Makefile	12 Apr 2005 04:32:52 -0000
 @@ -3,8 +3,8 @@
  PROG=	smbutil
  SRCS=	smbutil.c dumptree.c login.c lookup.c view.c print.c
  
 -DPADD=	${LIBSMB}
 -LDADD=	-lsmb
 +DPADD=	${LIBSMB} ${LIBKICONV}
 +LDADD=	-lsmb -lkiconv
  
  CONTRIBDIR=	${.CURDIR}/../../contrib/smbfs
  CFLAGS+=	-I${CONTRIBDIR}/include
 Index: usr.sbin/mount_smbfs/Makefile
 ===================================================================
 RCS file: /home/ncvs/src/usr.sbin/mount_smbfs/Makefile,v
 retrieving revision 1.6
 diff -u -r1.6 Makefile
 --- usr.sbin/mount_smbfs/Makefile	21 Dec 2004 09:59:44 -0000	1.6
 +++ usr.sbin/mount_smbfs/Makefile	12 Apr 2005 04:32:26 -0000
 @@ -9,8 +9,8 @@
  CONTRIBDIR=	${.CURDIR}/../../contrib/smbfs
  CFLAGS+=	-DSMBFS -I${MOUNTDIR} -I${CONTRIBDIR}/include
  
 -LDADD=	-lsmb
 -DPADD=	${LIBSMB}
 +LDADD=	-lsmb -lkiconv
 +DPADD=	${LIBSMB} ${LIBKICONV}
  
  # Needs to be dynamically linked for optional dlopen() access to
  # userland libiconv (see the -E option).
 
 
State-Changed-From-To: open->closed 
State-Changed-By: takawata 
State-Changed-When: Wed May 4 15:07:42 GMT 2005 
State-Changed-Why:  
Commited. Thanks. 


http://www.freebsd.org/cgi/query-pr.cgi?pr=78110 
>Unformatted:
