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