]> Pileus Git - ~andy/linux/commitdiff
nfsd: fix encode_entryplus_baggage stack usage
authorJ. Bruce Fields <bfields@redhat.com>
Thu, 9 Jan 2014 21:24:35 +0000 (16:24 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Thu, 23 Jan 2014 18:50:27 +0000 (13:50 -0500)
We stick an extra svc_fh in nfsd3_readdirres to save the need to
kmalloc, though maybe it would be fine to kmalloc instead.

Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs3xdr.c
fs/nfsd/xdr3.h

index 1ee6baec5fa167961583737028cefd9e797fcc7f..de6e39e12cb3e4655ab2017cda8bea11383335ed 100644 (file)
@@ -842,21 +842,21 @@ out:
 
 static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen)
 {
-       struct svc_fh   fh;
+       struct svc_fh   *fh = &cd->scratch;
        __be32 err;
 
-       fh_init(&fh, NFS3_FHSIZE);
-       err = compose_entry_fh(cd, &fh, name, namlen);
+       fh_init(fh, NFS3_FHSIZE);
+       err = compose_entry_fh(cd, fh, name, namlen);
        if (err) {
                *p++ = 0;
                *p++ = 0;
                goto out;
        }
-       p = encode_post_op_attr(cd->rqstp, p, &fh);
+       p = encode_post_op_attr(cd->rqstp, p, fh);
        *p++ = xdr_one;                 /* yes, a file handle follows */
-       p = encode_fh(p, &fh);
+       p = encode_fh(p, fh);
 out:
-       fh_put(&fh);
+       fh_put(fh);
        return p;
 }
 
index b6d5542a4ac8e185e48d9d7c64fab36f5068dd88..335e04aaf7db18842fb63923feebfb31e26e4353 100644 (file)
@@ -174,6 +174,9 @@ struct nfsd3_linkres {
 struct nfsd3_readdirres {
        __be32                  status;
        struct svc_fh           fh;
+       /* Just to save kmalloc on every readdirplus entry (svc_fh is a
+        * little large for the stack): */
+       struct svc_fh           scratch;
        int                     count;
        __be32                  verf[2];