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,10 +22,14 @@
* 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,48 +796,26 @@
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;
+ entryplus3 *entry;
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;
-
+ for (entry = objp->reply.entries; entry != NULL;
+ entry = entry->nextentry) {
if (!xdr_bool(xdrs, &true) ||
- !xdr_post_op_fh3(xdrs, &infop->fh) ||
- !xdr_string(xdrs, &name, ~0)) {
+ !xdr_post_op_fh3(xdrs, &entry->name_handle) ||
+ !xdr_string(xdrs, &entry->name, MAXPATHLEN)) {
return (FALSE);
}
- dp = nextdp(dp);
- infop++;
- nents--;
}
+
if (!xdr_bool(xdrs, &false))
return (FALSE);
return (xdr_bool(xdrs, &objp->reply.eof));
}