]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
fs: fix setserverprefs where long is larger than afs_int32
authorMarc Dionne <marc.c.dionne@gmail.com>
Thu, 22 Sep 2011 00:31:33 +0000 (20:31 -0400)
committerDerrick Brashear <shadow@dementix.org>
Fri, 7 Oct 2011 12:39:25 +0000 (05:39 -0700)
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.

Reviewed-on: http://gerrit.openafs.org/5486
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: Derrick Brashear <shadow@dementix.org>
(cherry picked from commit 649d3a0957eef0c607a63b47f11bd4a0ca8655ca)

Change-Id: I5869423a8512e6e5d64162b17a69106355ca3639
Reviewed-on: http://gerrit.openafs.org/5535
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
src/venus/fs.c

index a8c17123eaeb2da37f127cf99dbc874457277fe4..31b2f56217b1217d4ce2ecf60374eec2d3be90b5 100644 (file)
@@ -3113,7 +3113,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 */
@@ -3140,7 +3140,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;
@@ -3150,7 +3150,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;