Commit Diff


commit - e77222a4ecdf427c2eed2eb44251b8841ef81b3c
commit + 886a6f6c535f081e5d845db7ba79b16f2b68ef97
blob - ee5f98502eb8e33f810e3d8de9333722c66c187d
blob + 836f0bf2afa89d6d99c64aa5ca41f6a0049cc06a
--- src/libsunrpc/nfs3.c
+++ src/libsunrpc/nfs3.c
@@ -2937,6 +2937,11 @@ nfs3entrysize(Nfs3Entry *x)
 	USED(x);
 	a = 0 + 4 + 8 + sunstringsize(x->name) + 8;
 	return a;
+}
+static int
+sunstringvpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int n)
+{
+	return sunvaropaquepack(a, ea, pa, (uchar**)&s, &n, -1);
 }
 int
 nfs3entrypack(uchar *a, uchar *ea, uchar **pa, Nfs3Entry *x)
@@ -2946,7 +2951,7 @@ nfs3entrypack(uchar *a, uchar *ea, uchar **pa, Nfs3Ent
 	one = 1;
 	if(sunuint1pack(a, ea, &a, &one) < 0) goto Err;
 	if(sunuint64pack(a, ea, &a, &x->fileid) < 0) goto Err;
-	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
+	if(sunstringvpack(a, ea, &a, &x->name, x->namelen) < 0) goto Err;
 	if(sunuint64pack(a, ea, &a, &x->cookie) < 0) goto Err;
 	*pa = a;
 	return 0;
@@ -2963,6 +2968,7 @@ nfs3entryunpack(uchar *a, uchar *ea, uchar **pa, Nfs3E
 	if(sunuint1unpack(a, ea, &a, &one) < 0 || one != 1) goto Err;
 	if(sunuint64unpack(a, ea, &a, &x->fileid) < 0) goto Err;
 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
+	x->namelen = strlen(x->name);
 	if(sunuint64unpack(a, ea, &a, &x->cookie) < 0) goto Err;
 	*pa = a;
 	return 0;
blob - 4c32442941779e756b4789c512019a96c115cedb
blob + bf042317bc70afd1f8280c03ee3af5329b40f442
--- src/libsunrpc/rpc.c
+++ src/libsunrpc/rpc.c
@@ -140,6 +140,7 @@ sunrpcsize(SunRpc *rpc)
 		case SunRpcMismatch:
 		case SunProgMismatch:
 			a += 3*4;
+			break;
 		default:
 			a += 4;
 		}
@@ -439,7 +440,7 @@ sunstringunpack(uchar *a, uchar *ea, uchar **pa, char 
 		goto Err;
 	/* slide string down over length to make room for NUL */
 	memmove(dat-1, dat, n);
-	dat[-1+n] = 0;
+	dat[n-1] = 0;
 	*s = (char*)(dat-1);
 	return 0;
 Err:
blob - 813585876b7f134d75d2e353f80c60c8ae4584f4
blob + 43b0f77306732f1f43e86f458bf882c8f7aa7453
--- src/libsunrpc/server.c
+++ src/libsunrpc/server.c
@@ -144,11 +144,12 @@ if(srv->chatty) fprint(2, "sun msg %p count %d\n", m, 
 static SunProg*
 sunfindprog(SunSrv *srv, SunMsg *m, SunRpc *rpc, Channel **pc)
 {
-	int i, vlo, vhi;
+	int i, vlo, vhi, any;
 	SunProg *pg;
 
-	vlo = 0x7fffffff;
-	vhi = -1;
+	vlo = 0;
+	vhi = 0;
+	any = 0;
 
 	for(i=0; i<srv->nprog; i++){
 		pg = srv->prog[i];
@@ -159,10 +160,15 @@ sunfindprog(SunSrv *srv, SunMsg *m, SunRpc *rpc, Chann
 			return pg;
 		}
 		/* right program, wrong version: record range */
-		if(pg->vers < vlo)
+		if(!any++){
 			vlo = pg->vers;
-		if(pg->vers > vhi)
 			vhi = pg->vers;
+		}else{
+			if(pg->vers < vlo)
+				vlo = pg->vers;
+			if(pg->vers > vhi)
+				vhi = pg->vers;
+		}
 	}
 	if(vhi == -1){
 		if(srv->chatty)