From: Andrew Deason Date: Wed, 16 Mar 2011 19:44:56 +0000 (-0500) Subject: salvager: Fix volume parsing on 64-bit X-Git-Tag: upstream/1.6.0.pre4^2~19 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=4d691ae10903e01db4d6b24a4eb02da536cadf7c;p=packages%2Fo%2Fopenafs.git salvager: Fix volume parsing on 64-bit When an unsigned long is wider than an afs_uint32, comparing the afs_uint32 vid to ULONG_MAX is always going to be false (which the compiler can warn us about). Fix this by storing to an unsigned long, and converting to a volume id after ensuring that the result is not too large. (cherry picked from commit ce5e263b488f8cb85662031ee08eea448dab2d27) Reviewed-on: http://gerrit.openafs.org/4244 Tested-by: BuildBot Reviewed-by: Simon Wilkinson Tested-by: Derrick Brashear Reviewed-by: Derrick Brashear Change-Id: Iec2d640daed1e9c175d17823750f272297f890a7 Reviewed-on: http://gerrit.openafs.org/4283 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/src/vol/salvaged.c b/src/vol/salvaged.c index ddf4fbe82..106d5d3bb 100644 --- a/src/vol/salvaged.c +++ b/src/vol/salvaged.c @@ -271,8 +271,15 @@ handleit(struct cmd_syndesc *as, void *arock) strlcpy(pname, ti->data, sizeof(pname)); } if ((ti = as->parms[1].items)) { /* -volumeid */ + char *end; + unsigned long vid_l; seenvol = 1; - vid = atoi(ti->data); + vid_l = strtoul(ti->data, &end, 10); + if (vid_l >= MAX_AFS_UINT32 || vid_l == ULONG_MAX || *end != '\0') { + printf("Invalid volume id specified; salvage aborted\n"); + exit(-1); + } + vid = (VolumeId)vid_l; } if (ShowLog) { diff --git a/src/vol/salvager.c b/src/vol/salvager.c index 6439b0fb3..26a82b574 100644 --- a/src/vol/salvager.c +++ b/src/vol/salvager.c @@ -180,13 +180,20 @@ handleit(struct cmd_syndesc *as, void *arock) strncpy(pname, ti->data, 100); } if ((ti = as->parms[1].items)) { /* -volumeid */ + char *end; + unsigned long vid_l; if (!seenpart) { printf ("You must also specify '-partition' option with the '-volumeid' option\n"); exit(-1); } seenvol = 1; - vid = atoi(ti->data); + vid_l = strtoul(ti->data, &end, 10); + if (vid_l >= MAX_AFS_UINT32 || vid_l == ULONG_MAX || *end != '\0') { + Log("salvage: invalid volume id specified; salvage aborted\n"); + Exit(1); + } + vid = (VolumeId)vid_l; } if (as->parms[2].items) /* -debug */ debug = 1;