From 4d691ae10903e01db4d6b24a4eb02da536cadf7c Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 16 Mar 2011 14:44:56 -0500 Subject: [PATCH] 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 --- src/vol/salvaged.c | 9 ++++++++- src/vol/salvager.c | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) 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; -- 2.39.5