Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1fbbd684 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds
Browse files

[PATCH] uml: prevent umid theft



Behavior when booting two UMLs with the same umid was broken.  The second one
would steal the umid.  This fixes that, making the second UML take a random
umid instead.

Signed-off-by: default avatarJeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 98c18238
Loading
Loading
Loading
Loading
+23 −10
Original line number Original line Diff line number Diff line
@@ -143,8 +143,10 @@ static int not_dead_yet(char *dir)
		goto out_close;
		goto out_close;
	}
	}


	if((kill(p, 0) == 0) || (errno != ESRCH))
	if((kill(p, 0) == 0) || (errno != ESRCH)){
		printk("umid \"%s\" is already in use by pid %d\n", umid, p);
		return 1;
		return 1;
	}


	err = actually_do_remove(dir);
	err = actually_do_remove(dir);
	if(err)
	if(err)
@@ -234,33 +236,44 @@ int __init make_umid(void)
	err = mkdir(tmp, 0777);
	err = mkdir(tmp, 0777);
	if(err < 0){
	if(err < 0){
		err = -errno;
		err = -errno;
		if(errno != EEXIST)
		if(err != -EEXIST)
			goto err;
			goto err;


		if(not_dead_yet(tmp) < 0)
		/* 1   -> this umid is already in use
		 * < 0 -> we couldn't remove the umid directory
		 * In either case, we can't use this umid, so return -EEXIST.
		 */
		if(not_dead_yet(tmp) != 0)
			goto err;
			goto err;


		err = mkdir(tmp, 0777);
		err = mkdir(tmp, 0777);
	}
	}
	if(err < 0){
	if(err){
		printk("Failed to create '%s' - err = %d\n", umid, err);
		err = -errno;
		goto err_rmdir;
		printk("Failed to create '%s' - err = %d\n", umid, -errno);
		goto err;
	}
	}


	umid_setup = 1;
	umid_setup = 1;


	create_pid_file();
	create_pid_file();


	return 0;
	err = 0;

 err_rmdir:
	rmdir(tmp);
 err:
 err:
	return err;
	return err;
}
}


static int __init make_umid_init(void)
static int __init make_umid_init(void)
{
{
	if(!make_umid())
		return 0;

	/* If initializing with the given umid failed, then try again with
	 * a random one.
	 */
	printk("Failed to initialize umid \"%s\", trying with a random umid\n",
	       umid);
	*umid = '\0';
	make_umid();
	make_umid();


	return 0;
	return 0;