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>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/nfs/nfs_log_xdr.c
          +++ new/usr/src/uts/common/fs/nfs/nfs_log_xdr.c
↓ open down ↓ 16 lines elided ↑ open up ↑
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright 2017 Joyent Inc
  23   23   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   */
  26   26  
       27 +/*
       28 + * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
       29 + */
       30 +
  27   31  #include <sys/types.h>
  28   32  #include <sys/systm.h>
  29   33  #include <sys/cmn_err.h>
  30   34  #include <sys/kmem.h>
  31   35  #include <sys/cred.h>
  32   36  #include <sys/dirent.h>
  33   37  #include <sys/debug.h>
  34   38  #include <rpc/types.h>
  35   39  #include <nfs/nfs.h>
  36   40  #include <nfs/export.h>
↓ open down ↓ 455 lines elided ↑ open up ↑
 492  496  
 493  497  bool_t
 494  498  xdr_nfslog_createhow3(XDR *xdrs, createhow3 *objp)
 495  499  {
 496  500          if (!xdr_enum(xdrs, (enum_t *)&objp->mode))
 497  501                  return (FALSE);
 498  502          switch (objp->mode) {
 499  503          case UNCHECKED:
 500  504          case GUARDED:
 501  505                  if (!xdr_set_size3(xdrs,
 502      -                        &objp->createhow3_u.obj_attributes.size))
      506 +                    &objp->createhow3_u.obj_attributes.size))
 503  507                          return (FALSE);
 504  508                  break;
 505  509          case EXCLUSIVE:
 506  510                  break;
 507  511          default:
 508  512                  return (FALSE);
 509  513          }
 510  514          return (TRUE);
 511  515  }
 512  516  
↓ open down ↓ 274 lines elided ↑ open up ↑
 787  791  bool_t
 788  792  xdr_nfslog_READDIRPLUS3args(XDR *xdrs, READDIRPLUS3args *objp)
 789  793  {
 790  794          if (!xdr_nfslog_nfs_fh3(xdrs, &objp->dir))
 791  795                  return (FALSE);
 792  796          if (!xdr_uint32(xdrs, &objp->dircount))
 793  797                  return (FALSE);
 794  798          return (xdr_uint32(xdrs, &objp->maxcount));
 795  799  }
 796  800  
 797      -#ifdef  nextdp
 798      -#undef  nextdp
 799      -#endif
 800      -#define nextdp(dp)      ((struct dirent64 *)((char *)(dp) + (dp)->d_reclen))
 801      -
 802  801  bool_t
 803  802  xdr_nfslog_READDIRPLUS3resok(XDR *xdrs, READDIRPLUS3resok *objp)
 804  803  {
 805      -        struct dirent64 *dp;
      804 +        entryplus3 *entry;
 806  805          bool_t true = TRUE;
 807  806          bool_t false = FALSE;
 808      -        int nents;
 809      -        char *name;
 810      -        entryplus3_info *infop;
 811  807  
 812      -        dp = (struct dirent64 *)objp->reply.entries;
 813      -        nents = objp->size;
 814      -        infop = objp->infop;
 815      -        while (nents > 0) {
 816      -                if (dp->d_reclen == 0)
 817      -                        return (FALSE);
 818      -                if (dp->d_ino == 0) {
 819      -                        dp = nextdp(dp);
 820      -                        infop++;
 821      -                        nents--;
 822      -                        continue;
 823      -                }
 824      -                name = dp->d_name;
 825      -
      808 +        for (entry = objp->reply.entries; entry != NULL;
      809 +            entry = entry->nextentry) {
 826  810                  if (!xdr_bool(xdrs, &true) ||
 827      -                    !xdr_post_op_fh3(xdrs, &infop->fh) ||
 828      -                    !xdr_string(xdrs, &name, ~0)) {
      811 +                    !xdr_post_op_fh3(xdrs, &entry->name_handle) ||
      812 +                    !xdr_string(xdrs, &entry->name, MAXPATHLEN)) {
 829  813                          return (FALSE);
 830  814                  }
 831      -                dp = nextdp(dp);
 832      -                infop++;
 833      -                nents--;
 834  815          }
      816 +
 835  817          if (!xdr_bool(xdrs, &false))
 836  818                  return (FALSE);
 837  819  
 838  820          return (xdr_bool(xdrs, &objp->reply.eof));
 839  821  }
 840  822  
 841  823  bool_t
 842  824  xdr_nfslog_READDIRPLUS3res(XDR *xdrs, READDIRPLUS3res *objp)
 843  825  {
 844  826          if (!xdr_enum(xdrs, (enum_t *)&objp->status))
↓ open down ↓ 76 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX