Don't double free call structure
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Sat, 16 Jan 2010 15:35:34 +0000 (15:35 +0000)
committerDerrick Brashear <shadow|account-1000005@unknown>
Sat, 16 Jan 2010 15:49:25 +0000 (07:49 -0800)
If the rx_Read() of the number of bytes in the FetchData64 response
fails, then it sets code, and disposes of the call structure. However,
the length safety check that was added in
c7b92a3018044f7aca4d9a77644e5c06ef64d1e9 executes regardless of whether
code is set, and the call has already been freed. So we end up calling
rx_Error with a NULL call structure, and panic.

Change-Id: Ia2e341b7a9a2ddc1d656e8b8a31698c0d1771d5e
Reviewed-on: http://gerrit.openafs.org/1112
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/afs_fetchstore.c

index 771ce0b..c17a434 100644 (file)
@@ -992,7 +992,7 @@ rxfs_fetchInit(struct afs_conn *tc, struct vcache *avc, afs_offs_t base,
     /* We need to cast here, in order to avoid issues if *alength is
      * negative. Some, older, fileservers can return a negative length,
      * which the rest of the code deals correctly with. */
-    if (*alength > (afs_int32) size) {
+    if (code == 0 && *alength > (afs_int32) size) {
        /* The fileserver told us it is going to send more data than we
         * requested. It shouldn't do that, and accepting that much data
         * can make us take up more cache space than we're supposed to,