Module Name:    src
Committed By:   nakayama
Date:           Sat Nov 15 18:52:45 UTC 2014

Modified Files:
        src/sys/fs/smbfs: smbfs_smb.c smbfs_subr.c smbfs_subr.h
        src/sys/netsmb: mchain.h smb_subr.c subr_mchain.c

Log Message:
Adjust smbfs/netsmb for filenames byte length changes that come as
a result of iconv conversion.  Most codes are taken from FreeBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/sys/fs/smbfs/smbfs_smb.c
cvs rdiff -u -r1.16 -r1.17 src/sys/fs/smbfs/smbfs_subr.c
cvs rdiff -u -r1.21 -r1.22 src/sys/fs/smbfs/smbfs_subr.h
cvs rdiff -u -r1.9 -r1.10 src/sys/netsmb/mchain.h
cvs rdiff -u -r1.36 -r1.37 src/sys/netsmb/smb_subr.c
cvs rdiff -u -r1.22 -r1.23 src/sys/netsmb/subr_mchain.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/smbfs/smbfs_smb.c
diff -u src/sys/fs/smbfs/smbfs_smb.c:1.45 src/sys/fs/smbfs/smbfs_smb.c:1.46
--- src/sys/fs/smbfs/smbfs_smb.c:1.45	Tue Aug 12 06:57:20 2014
+++ src/sys/fs/smbfs/smbfs_smb.c	Sat Nov 15 18:52:44 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: smbfs_smb.c,v 1.45 2014/08/12 06:57:20 maxv Exp $	*/
+/*	$NetBSD: smbfs_smb.c,v 1.46 2014/11/15 18:52:44 nakayama Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smbfs_smb.c,v 1.45 2014/08/12 06:57:20 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smbfs_smb.c,v 1.46 2014/11/15 18:52:44 nakayama Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1129,7 +1129,7 @@ static int
 smbfs_findopenLM2(struct smbfs_fctx *ctx, struct smbnode *dnp,
     const char *wildcard, int wclen, int attr, struct smb_cred *scred)
 {
-	ctx->f_name = malloc(SMB_MAXNAMLEN, M_SMBFSDATA, M_WAITOK);
+	ctx->f_name = malloc(SMB_MAXNAMLEN * 2, M_SMBFSDATA, M_WAITOK);
 	if (ctx->f_name == NULL)
 		return ENOMEM;
 	ctx->f_infolevel = SMB_DIALECT(SSTOVC(ctx->f_ssp)) < SMB_DIALECT_NTLM0_12 ?
@@ -1212,7 +1212,7 @@ smbfs_findnextLM2(struct smbfs_fctx *ctx
 		return EINVAL;
 #endif
 	}
-	nmlen = min(size, SMB_MAXNAMLEN);
+	nmlen = min(size, SMB_MAXNAMLEN * 2);
 	cp = ctx->f_name;
 	error = md_get_mem(mbp, cp, nmlen, MB_MSYSTEM);
 	if (error)
@@ -1316,7 +1316,7 @@ smbfs_findnext(struct smbfs_fctx *ctx, i
 			continue;
 		break;
 	}
-	smbfs_fname_tolocal(SSTOVC(ctx->f_ssp), ctx->f_name, ctx->f_nmlen,
+	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: src/sys/fs/smbfs/smbfs_subr.c
diff -u src/sys/fs/smbfs/smbfs_subr.c:1.16 src/sys/fs/smbfs/smbfs_subr.c:1.17
--- src/sys/fs/smbfs/smbfs_subr.c:1.16	Fri Nov 30 23:24:21 2012
+++ src/sys/fs/smbfs/smbfs_subr.c	Sat Nov 15 18:52:44 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: smbfs_subr.c,v 1.16 2012/11/30 23:24:21 nakayama Exp $	*/
+/*	$NetBSD: smbfs_subr.c,v 1.17 2014/11/15 18:52:44 nakayama Exp $	*/
 
 /*
  * Copyright (c) 2000-2001, Boris Popov
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smbfs_subr.c,v 1.16 2012/11/30 23:24:21 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smbfs_subr.c,v 1.17 2014/11/15 18:52:44 nakayama Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -318,14 +318,36 @@ smbfs_fullpath(struct mbchain *mbp, stru
 }
 
 int
-smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int nmlen,
+smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int *nmlen,
     int caseopt)
 {
-/*	if (caseopt & SMB_CS_UPPER)
+	int error = 0;
+	size_t ilen, olen;
+	const char *ibuf;
+	char *obuf, *outbuf;
+
+#ifdef notyet
+	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;
+		iconv_convmem(vcp->vc_tolower, name, name, nmlen);
+#endif
+	if (vcp->vc_tolocal) {
+		const size_t buflen = SMB_MAXNAMLEN * 2;
+
+		outbuf = malloc(buflen, M_SMBTEMP, M_WAITOK);
+		if (outbuf == NULL)
+			return ENOMEM;
+		ilen = *nmlen;
+		olen = buflen;
+		ibuf = name;
+		obuf = outbuf;
+		error = iconv_conv(vcp->vc_tolocal, &ibuf, &ilen, &obuf, &olen);
+		if (!error) {
+			*nmlen = buflen - olen;
+			memcpy(name, outbuf, *nmlen);
+		}
+		free(outbuf, M_SMBTEMP);
+	}
+	return error;
 }

Index: src/sys/fs/smbfs/smbfs_subr.h
diff -u src/sys/fs/smbfs/smbfs_subr.h:1.21 src/sys/fs/smbfs/smbfs_subr.h:1.22
--- src/sys/fs/smbfs/smbfs_subr.h:1.21	Fri Nov 30 23:24:21 2012
+++ src/sys/fs/smbfs/smbfs_subr.h	Sat Nov 15 18:52:44 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: smbfs_subr.h,v 1.21 2012/11/30 23:24:21 nakayama Exp $	*/
+/*	$NetBSD: smbfs_subr.h,v 1.22 2014/11/15 18:52:44 nakayama Exp $	*/
 
 /*
  * Copyright (c) 2000-2001, Boris Popov
@@ -176,7 +176,7 @@ int  smbfs_fullpath(struct mbchain *mbp,
 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: src/sys/netsmb/mchain.h
diff -u src/sys/netsmb/mchain.h:1.9 src/sys/netsmb/mchain.h:1.10
--- src/sys/netsmb/mchain.h:1.9	Mon Jul 12 02:58:01 2010
+++ src/sys/netsmb/mchain.h	Sat Nov 15 18:52:45 2014
@@ -54,7 +54,8 @@
 struct mbuf;
 struct mbchain;
 
-typedef int mb_copy_t(struct mbchain *, const char *, char *, size_t);
+typedef int mb_copy_t(struct mbchain *, const char *, char *,
+    size_t *, size_t *);
 
 struct mbchain {
 	struct mbuf *	mb_top;		/* head of mbufs chain */

Index: src/sys/netsmb/smb_subr.c
diff -u src/sys/netsmb/smb_subr.c:1.36 src/sys/netsmb/smb_subr.c:1.37
--- src/sys/netsmb/smb_subr.c:1.36	Sun Sep 25 13:42:30 2011
+++ src/sys/netsmb/smb_subr.c	Sat Nov 15 18:52:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: smb_subr.c,v 1.36 2011/09/25 13:42:30 chs Exp $	*/
+/*	$NetBSD: smb_subr.c,v 1.37 2014/11/15 18:52:45 nakayama Exp $	*/
 
 /*
  * Copyright (c) 2000-2001 Boris Popov
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smb_subr.c,v 1.36 2011/09/25 13:42:30 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smb_subr.c,v 1.37 2014/11/15 18:52:45 nakayama Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -307,11 +307,20 @@ smb_maperror(int eclass, int eno)
 }
 
 static int
-smb_copy_iconv(struct mbchain *mbp, const char *src, char *dst, size_t len)
+smb_copy_iconv(struct mbchain *mbp, const char *src, char *dst,
+    size_t *srclen, size_t *dstlen)
 {
-	size_t outlen = len;
+	int error;
+	size_t inlen = *srclen, outlen = *dstlen;
 
-	return iconv_conv((struct iconv_drv*)mbp->mb_udata, &src, &len, &dst, &outlen);
+	error = iconv_conv((struct iconv_drv*)mbp->mb_udata, &src, &inlen,
+	    &dst, &outlen);
+	if (inlen != *srclen || outlen != *dstlen) {
+		*srclen -= inlen;
+		*dstlen -= outlen;
+		return 0;
+	} else
+		return error;
 }
 
 int

Index: src/sys/netsmb/subr_mchain.c
diff -u src/sys/netsmb/subr_mchain.c:1.22 src/sys/netsmb/subr_mchain.c:1.23
--- src/sys/netsmb/subr_mchain.c:1.22	Sat May 12 01:40:37 2012
+++ src/sys/netsmb/subr_mchain.c	Sat Nov 15 18:52:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_mchain.c,v 1.22 2012/05/12 01:40:37 nakayama Exp $	*/
+/*	$NetBSD: subr_mchain.c,v 1.23 2014/11/15 18:52:45 nakayama Exp $	*/
 
 /*
  * Copyright (c) 2000, 2001 Boris Popov
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_mchain.c,v 1.22 2012/05/12 01:40:37 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_mchain.c,v 1.23 2014/11/15 18:52:45 nakayama Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -251,6 +251,7 @@ mb_put_mem(struct mbchain *mbp, const ch
 	const char *src;
 	int error;
 	size_t cplen, mleft, count;
+	size_t srclen, dstlen;
 
 	m = mbp->mb_cur;
 	mleft = mbp->mb_mleft;
@@ -267,10 +268,17 @@ mb_put_mem(struct mbchain *mbp, const ch
 			continue;
 		}
 		cplen = mleft > size ? size : mleft;
+		srclen = dstlen = cplen;
 		dst = mtod(m, char *) + m->m_len;
 		switch (type) {
 		    case MB_MCUSTOM:
-			error = mbp->mb_copy(mbp, source, dst, cplen);
+			srclen = size;
+			dstlen = mleft;
+			error = mbp->mb_copy(mbp, source, dst, &srclen, &dstlen);
+			if (error == E2BIG) {
+				mleft = 0;
+				continue;
+			}
 			if (error)
 				return error;
 			break;
@@ -290,11 +298,11 @@ mb_put_mem(struct mbchain *mbp, const ch
 			memset(dst, 0, cplen);
 			break;
 		}
-		size -= cplen;
-		source += cplen;
-		m->m_len += cplen;
-		mleft -= cplen;
-		mbp->mb_count += cplen;
+		size -= srclen;
+		source += srclen;
+		m->m_len += dstlen;
+		mleft -= dstlen;
+		mbp->mb_count += dstlen;
 	}
 	mbp->mb_cur = m;
 	mbp->mb_mleft = mleft;

Reply via email to