Print this page
Try to remove assumption that zone's root vnode is marked VROOT


 422                 }
 423         }
 424 
 425         dva.va_mask = AT_ALL;
 426         dvap = VOP_GETATTR(dvp, &dva, 0, cr, NULL) ? NULL : &dva;
 427 
 428         if (args->what.name == nfs3nametoolong) {
 429                 resp->status = NFS3ERR_NAMETOOLONG;
 430                 goto out1;
 431         }
 432 
 433         if (args->what.name == NULL || *(args->what.name) == '\0') {
 434                 resp->status = NFS3ERR_ACCES;
 435                 goto out1;
 436         }
 437 
 438         fhp = &args->what.dir;
 439         if (strcmp(args->what.name, "..") == 0 &&
 440             EQFID(&exi->exi_fid, FH3TOFIDP(fhp))) {
 441                 if ((exi->exi_export.ex_flags & EX_NOHIDE) &&
 442                     (dvp->v_flag & VROOT)) {
 443                         /*
 444                          * special case for ".." and 'nohide'exported root
 445                          */
 446                         if (rfs_climb_crossmnt(&dvp, &exi, cr) != 0) {
 447                                 resp->status = NFS3ERR_ACCES;
 448                                 goto out1;
 449                         }
 450                 } else {
 451                         resp->status = NFS3ERR_NOENT;
 452                         goto out1;
 453                 }
 454         }
 455 
 456         ca = (struct sockaddr *)svc_getrpccaller(req->rq_xprt)->buf;
 457         name = nfscmd_convname(ca, exi, args->what.name,
 458             NFSCMD_CONV_INBOUND, MAXPATHLEN + 1);
 459 
 460         if (name == NULL) {
 461                 resp->status = NFS3ERR_ACCES;
 462                 goto out1;




 422                 }
 423         }
 424 
 425         dva.va_mask = AT_ALL;
 426         dvap = VOP_GETATTR(dvp, &dva, 0, cr, NULL) ? NULL : &dva;
 427 
 428         if (args->what.name == nfs3nametoolong) {
 429                 resp->status = NFS3ERR_NAMETOOLONG;
 430                 goto out1;
 431         }
 432 
 433         if (args->what.name == NULL || *(args->what.name) == '\0') {
 434                 resp->status = NFS3ERR_ACCES;
 435                 goto out1;
 436         }
 437 
 438         fhp = &args->what.dir;
 439         if (strcmp(args->what.name, "..") == 0 &&
 440             EQFID(&exi->exi_fid, FH3TOFIDP(fhp))) {
 441                 if ((exi->exi_export.ex_flags & EX_NOHIDE) &&
 442                     ((dvp->v_flag & VROOT) || VN_IS_CURZONEROOT(dvp))) {
 443                         /*
 444                          * special case for ".." and 'nohide'exported root
 445                          */
 446                         if (rfs_climb_crossmnt(&dvp, &exi, cr) != 0) {
 447                                 resp->status = NFS3ERR_ACCES;
 448                                 goto out1;
 449                         }
 450                 } else {
 451                         resp->status = NFS3ERR_NOENT;
 452                         goto out1;
 453                 }
 454         }
 455 
 456         ca = (struct sockaddr *)svc_getrpccaller(req->rq_xprt)->buf;
 457         name = nfscmd_convname(ca, exi, args->what.name,
 458             NFSCMD_CONV_INBOUND, MAXPATHLEN + 1);
 459 
 460         if (name == NULL) {
 461                 resp->status = NFS3ERR_ACCES;
 462                 goto out1;