From 649d3a0957eef0c607a63b47f11bd4a0ca8655ca Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Wed, 21 Sep 2011 20:31:33 -0400 Subject: [PATCH] fs: fix setserverprefs where long is larger than afs_int32 Make the fscanf and scanf format specifiers match the type of the target variable. This prevents trying to store a long int into an afs_int32 variable which may be smaller, and overwriting neighbouring data on the stack. The effect on a 64-bit Linux system was that the high bits of "rank" would overwrite the first 4 bytes of the scanned host name, causing setserverprefs to fail with: : couldn't resolve name. Change-Id: I2100e7fe77a137257eb308ad127c151de84756bc Reviewed-on: http://gerrit.openafs.org/5486 Tested-by: BuildBot Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/venus/fs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/venus/fs.c b/src/venus/fs.c index 8cc842f..31d20d4 100644 --- a/src/venus/fs.c +++ b/src/venus/fs.c @@ -3150,7 +3150,7 @@ SetPrefCmd(struct cmd_syndesc *as, void *arock) afs_int32 code; struct cmd_item *ti; char name[80]; - afs_int32 rank; + int rank; struct setspref *ssp; int error = 0; /* -1 means error message printed, * >0 means errno value for unprinted message */ @@ -3177,7 +3177,7 @@ SetPrefCmd(struct cmd_syndesc *as, void *arock) perror(ti->data); error = -1; } else { - while (fscanf(infd, "%79s%ld", name, (long int *)&rank) != EOF) { + while (fscanf(infd, "%79s%d", name, &rank) != EOF) { code = addServer(name, (unsigned short)rank); if (code) error = code; @@ -3187,7 +3187,7 @@ SetPrefCmd(struct cmd_syndesc *as, void *arock) ti = as->parms[3].items; /* -stdin */ if (ti) { - while (scanf("%79s%ld", name, (long int *)&rank) != EOF) { + while (scanf("%79s%d", name, &rank) != EOF) { code = addServer(name, (unsigned short)rank); if (code) error = code; -- 1.9.4