FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Cluster Development

 
 
LinkBack Thread Tools
 
Old 07-09-2012, 04:06 PM
Andrew Price
 
Default mkfs.gfs2: Avoid a rename race when checking file contents

Currently there is a slight chance that mkfs.gfs2 could report the
incorrect contents of the target if another file is renamed into place.
This is because we pass the target name to the file command and file
opens it again. This patch tries to avoid that condition by using the
/proc/$pid/fd/$device_fd symlink, which changes when the open file is
renamed, instead.

Signed-off-by: Andrew Price <anprice@redhat.com>
---
gfs2/mkfs/main_mkfs.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index 957b144..2d529d7 100644
--- a/gfs2/mkfs/main_mkfs.c
+++ b/gfs2/mkfs/main_mkfs.c
@@ -426,7 +426,7 @@ static void check_dev_content(const char *devname)
char content[1024] = { 0, };
char * args[] = {
(char *)"/usr/bin/file",
- (char *)"-bs",
+ (char *)"-bsL",
(char *)devname,
NULL };
int p[2] = {-1, -1};
@@ -557,6 +557,7 @@ void main_mkfs(int argc, char *argv[])
int rgsize_specified = 0;
unsigned char uuid[16];
char *absname = NULL;
+ char *fdpath = NULL;
int islnk = 0;

memset(sdp, 0, sizeof(struct gfs2_sbd));
@@ -587,13 +588,19 @@ void main_mkfs(int argc, char *argv[])
exit(EXIT_FAILURE);
}

+ if (asprintf(&fdpath, "/proc/%d/fd/%d", getpid(), sdp->device_fd) < 0) {
+ perror(_("Failed to build string"));
+ exit(EXIT_FAILURE);
+ }
+
if (!sdp->override) {
islnk = is_symlink(sdp->device_name, &absname);
printf(_("This will destroy any data on %s.
"), islnk ? absname : sdp->device_name);
- check_dev_content(islnk ? absname : sdp->device_name);
free(absname);
+ check_dev_content(fdpath);
are_you_sure();
}
+ free(fdpath);

if (sdp->bsize == -1) {
if (S_ISREG(sdp->dinfo.stat.st_mode))
--
1.7.10.4
 

Thread Tools




All times are GMT. The time now is 07:30 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org