commit 886a6f6c535f081e5d845db7ba79b16f2b68ef97 from: rsc date: Thu May 04 18:02:48 2006 UTC rpc fixes (vandebo) 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; inprog; 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)