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));
}