Fix segmentation fault in vsu_GetVolumeID
authorAntoine Verheijen <antoine@ualberta.ca>
Mon, 8 Feb 2010 23:01:46 +0000 (16:01 -0700)
committerDerrick Brashear <shadow|account-1000005@unknown>
Tue, 9 Feb 2010 03:37:25 +0000 (19:37 -0800)
When determining the volume type of a volume, vsu_GetVolumeID() checks
to see if the volume name ends in '.backup' or '.readonly' by backing
up the appropriate number of characters from the end of the name. It
does not, however, check to see if it skips past the beginning of the
volume name. This can result in a segmentation fault (which it has for
me on many occasions during a vos release) depending on where memory
is allocated or how/if memory is protected.

This patch corrects this behaviour by checking the volume name string
length prior to doing the string comparison.

Change-Id: Ia27fcac76b86ae2707663caa6bff365a4e8dd0da
Reviewed-on: http://gerrit.openafs.org/1269
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/volser/vsutils.c

index 54ad129..6af0b7c 100644 (file)
@@ -449,9 +449,9 @@ vsu_GetVolumeID(char *astring, struct ubik_client *acstruct, afs_int32 *errp)
     vsu_ExtractName(volname, astring);
     vcode = VLDB_GetEntryByName(volname, &entry);
     if (!vcode) {
-      if (!strcmp(&astring[total - 9], ".readonly"))
+      if ((total >= 9) && (!strcmp(&astring[total - 9], ".readonly")))
        return entry.volumeId[ROVOL];
-      else if ((!strcmp(&astring[total - 7], ".backup")))
+      else if ((total >= 7) && (!strcmp(&astring[total - 7], ".backup")))
        return entry.volumeId[BACKVOL];
       else
        return (entry.volumeId[RWVOL]);