Print this page
NEX-14051 Be careful with RPC groups
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
8085 Handle RPC groups better
Reviewed by: "Joshua M. Clulow" <josh@sysmgr.org>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Approved by: Dan McDonald <danmcd@omniti.com>
OS-20 share_nfs(1m) charset handling is unreliable
OS-22 Page fault at nfscmd_dropped_entrysize+0x1e()
OS-23 NFSv2/3/4: READDIR responses are inconsistent when charset conversion fails
OS-24 rfs3_readdir(): Issues related to nfscmd_convdirent()
Reviewed by: Jan Kryl <jan.kryl@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>

*** 22,31 **** --- 22,35 ---- * Copyright 2017 Joyent Inc * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ + /* + * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + */ + #include <sys/types.h> #include <sys/systm.h> #include <sys/cmn_err.h> #include <sys/kmem.h> #include <sys/cred.h>
*** 792,839 **** if (!xdr_uint32(xdrs, &objp->dircount)) return (FALSE); return (xdr_uint32(xdrs, &objp->maxcount)); } - #ifdef nextdp - #undef nextdp - #endif - #define nextdp(dp) ((struct dirent64 *)((char *)(dp) + (dp)->d_reclen)) - bool_t xdr_nfslog_READDIRPLUS3resok(XDR *xdrs, READDIRPLUS3resok *objp) { ! struct dirent64 *dp; bool_t true = TRUE; bool_t false = FALSE; - int nents; - char *name; - entryplus3_info *infop; ! dp = (struct dirent64 *)objp->reply.entries; ! nents = objp->size; ! infop = objp->infop; ! while (nents > 0) { ! if (dp->d_reclen == 0) ! return (FALSE); ! if (dp->d_ino == 0) { ! dp = nextdp(dp); ! infop++; ! nents--; ! continue; ! } ! name = dp->d_name; ! if (!xdr_bool(xdrs, &true) || ! !xdr_post_op_fh3(xdrs, &infop->fh) || ! !xdr_string(xdrs, &name, ~0)) { return (FALSE); } - dp = nextdp(dp); - infop++; - nents--; } if (!xdr_bool(xdrs, &false)) return (FALSE); return (xdr_bool(xdrs, &objp->reply.eof)); } --- 796,821 ---- if (!xdr_uint32(xdrs, &objp->dircount)) return (FALSE); return (xdr_uint32(xdrs, &objp->maxcount)); } bool_t xdr_nfslog_READDIRPLUS3resok(XDR *xdrs, READDIRPLUS3resok *objp) { ! entryplus3 *entry; bool_t true = TRUE; bool_t false = FALSE; ! for (entry = objp->reply.entries; entry != NULL; ! entry = entry->nextentry) { if (!xdr_bool(xdrs, &true) || ! !xdr_post_op_fh3(xdrs, &entry->name_handle) || ! !xdr_string(xdrs, &entry->name, MAXPATHLEN)) { return (FALSE); } } + if (!xdr_bool(xdrs, &false)) return (FALSE); return (xdr_bool(xdrs, &objp->reply.eof)); }