]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
volser: Check vnode length on dump
authorAndrew Deason <adeason@sinenomine.net>
Fri, 14 Dec 2012 21:05:53 +0000 (15:05 -0600)
committerDerrick Brashear <shadow@your-file-system.com>
Wed, 26 Dec 2012 19:36:35 +0000 (11:36 -0800)
Commit aadf69eabb1962496fa93745ab560a5b48cacd61 adds length checks on
vnodes during fileserver read/write operations. Do the same thing when
we dump volume data from the volserver, to ensure that we don't
transmit incorrect data e.g. to other RO sites when releasing.

FIXES 131530

Change-Id: I662489d0466d38af74a9604a2c97a4a5c72525c7
Reviewed-on: http://gerrit.openafs.org/8836
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
src/volser/dumpstuff.c

index bcb2c84de24bdcb737b5974404fa2a562090ae7d..3945d448376f09c9824dc9cd9f27b3f54e215e2a 100644 (file)
@@ -1080,6 +1080,7 @@ DumpVnode(struct iod *iodp, struct VnodeDiskObject *v, int volid,
                               VAclDiskSize(v));
     }
     if (VNDISK_GET_INO(v)) {
+       afs_sfsize_t indexlen, disklen;
        IH_INIT(ihP, iodp->device, iodp->parentId, VNDISK_GET_INO(v));
        fdP = IH_OPEN(ihP);
        if (fdP == NULL) {
@@ -1087,6 +1088,17 @@ DumpVnode(struct iod *iodp, struct VnodeDiskObject *v, int volid,
            IH_RELEASE(ihP);
            return VOLSERREAD_DUMPERROR;
        }
+       VNDISK_GET_LEN(indexlen, v);
+       disklen = FDH_SIZE(fdP);
+       if (indexlen != disklen) {
+           FDH_REALLYCLOSE(fdP);
+           IH_RELEASE(ihP);
+           Log("DumpVnode: volume %lu vnode %lu has inconsistent length "
+               "(index %lu disk %lu); aborting dump\n",
+               (unsigned long)volid, (unsigned long)vnodeNumber,
+               (unsigned long)indexlen, (unsigned long)disklen);
+           return VOLSERREAD_DUMPERROR;
+       }
        code = DumpFile(iodp, vnodeNumber, fdP);
        FDH_CLOSE(fdP);
        IH_RELEASE(ihP);