|
@@ -1363,7 +1363,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|
goto out;
|
|
goto out;
|
|
if (!(iap->ia_valid & ATTR_MODE))
|
|
if (!(iap->ia_valid & ATTR_MODE))
|
|
iap->ia_mode = 0;
|
|
iap->ia_mode = 0;
|
|
- err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_CREATE);
|
|
|
|
|
|
+ err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_EXEC);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
@@ -1385,6 +1385,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|
if (IS_ERR(dchild))
|
|
if (IS_ERR(dchild))
|
|
goto out_nfserr;
|
|
goto out_nfserr;
|
|
|
|
|
|
|
|
+ /* If file doesn't exist, check for permissions to create one */
|
|
|
|
+ if (!dchild->d_inode) {
|
|
|
|
+ err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_CREATE);
|
|
|
|
+ if (err)
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+
|
|
err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
|
|
err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|