summaryrefslogtreecommitdiffstats
path: root/fs/afs/internal.h
diff options
context:
space:
mode:
authorMarc Dionne <marc.dionne@auristor.com>2017-03-16 17:27:44 +0100
committerDavid Howells <dhowells@redhat.com>2017-03-16 17:27:44 +0100
commitbcd89270d93b7edebb5de5e5e7dca1a77a33496e (patch)
tree3e196dac7eed6313b0cd3111002434efc8ed0bb8 /fs/afs/internal.h
parentafs: Adjust mode bits processing (diff)
downloadlinux-bcd89270d93b7edebb5de5e5e7dca1a77a33496e.tar.xz
linux-bcd89270d93b7edebb5de5e5e7dca1a77a33496e.zip
afs: Deal with an empty callback array
Servers may send a callback array that is the same size as the FID array, or an empty array. If the callback count is 0, the code would attempt to read (fid_count * 12) bytes of data, which would fail and result in an unmarshalling error. This would lead to stale data for remotely modified files or directories. Store the callback array size in the internal afs_call structure and use that to determine the amount of data to read. Signed-off-by: Marc Dionne <marc.dionne@auristor.com>
Diffstat (limited to 'fs/afs/internal.h')
-rw-r--r--fs/afs/internal.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/afs/internal.h b/fs/afs/internal.h
index 5dfa56903a2d..8499870147ef 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h
@@ -90,7 +90,10 @@ struct afs_call {
unsigned request_size; /* size of request data */
unsigned reply_max; /* maximum size of reply */
unsigned first_offset; /* offset into mapping[first] */
- unsigned last_to; /* amount of mapping[last] */
+ union {
+ unsigned last_to; /* amount of mapping[last] */
+ unsigned count2; /* count used in unmarshalling */
+ };
unsigned char unmarshall; /* unmarshalling phase */
bool incoming; /* T if incoming call */
bool send_pages; /* T if data from mapping should be sent */