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