@@ -3496,6 +3496,10 @@ static int decode_pathname(struct xdr_stream *xdr, struct nfs4_pathname *path)
n = be32_to_cpup(p);
if (n == 0)
goto root_path;
+ if (n > NFS4_PATHNAME_MAXCOMPONENTS) {
+ dprintk("%s: server cheating client ncomponents :%d\n", __func__, n);
+ goto out_eio;
+ }
dprintk("pathname4: ");
path->ncomponents = 0;
while (path->ncomponents < n) {
@@ -3557,6 +3561,10 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
n = be32_to_cpup(p);
if (n <= 0)
goto out_eio;
+ if (n > NFS4_FS_LOCATIONS_MAXENTRIES) {
+ dprintk("%s: server cheating client nlocations :%d\n", __func__, n);
+ goto out_eio;
+ }
res->nlocations = 0;
while (res->nlocations < n) {
u32 m;
@@ -3566,7 +3574,10 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st
if (unlikely(!p))
goto out_overflow;
m = be32_to_cpup(p);
-
+ if (m > NFS4_FS_LOCATION_MAXSERVERS) {
+ dprintk("%s: server cheating client nservers :%d\n", __func__, m);
+ goto out_eio;
+ }
loc->nservers = 0;
dprintk("%s: servers:\n", __func__);
while (loc->nservers < m) {