[lxc-devel] [PATCH] Use on_path to find init.lxc

Stéphane Graber stgraber at ubuntu.com
Sat Mar 29 02:28:05 UTC 2014


On Fri, Mar 28, 2014 at 09:22:07PM -0500, Serge Hallyn wrote:
> Quoting Stéphane Graber (stgraber at ubuntu.com):
> > Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
> 
> Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> 
> (just one bit of whining below)
> 
> > ---
> >  src/lxc/conf.c    | 19 ++++++++++++++++---
> >  src/lxc/execute.c | 24 ++++++++++++++++++++++--
> >  src/lxc/utils.c   | 10 +++++-----
> >  src/lxc/utils.h   |  2 +-
> >  4 files changed, 44 insertions(+), 11 deletions(-)
> > 
> > diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> > index e34e034..06235fb 100644
> > --- a/src/lxc/conf.c
> > +++ b/src/lxc/conf.c
> > @@ -3197,10 +3197,23 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
> >  {
> >  	struct lxc_list *iterator;
> >  	struct id_map *map;
> > -	int ret = 0;
> > +	int ret = 0, use_shadow = 0;
> >  	enum idtype type;
> > -	char *buf = NULL, *pos;
> > -	int use_shadow = (on_path("newuidmap") && on_path("newgidmap"));
> > +	char *buf = NULL, *pos, *cmdpath = NULL;
> > +
> > +	cmdpath = on_path("newuidmap");
> > +	if (cmdpath) {
> > +		use_shadow = 1;
> > +		free(cmdpath);
> > +	}
> > +
> > +	if (!use_shadow) {
> > +		cmdpath = on_path("newgidmap");
> > +		if (cmdpath) {
> > +			use_shadow = 1;
> > +			free(cmdpath);
> > +		}
> > +	}
> >  
> >  	if (!use_shadow && geteuid()) {
> >  		ERROR("Missing newuidmap/newgidmap");
> > diff --git a/src/lxc/execute.c b/src/lxc/execute.c
> > index 9a84131..651c47d 100644
> > --- a/src/lxc/execute.c
> > +++ b/src/lxc/execute.c
> > @@ -30,6 +30,7 @@
> >  #include "conf.h"
> >  #include "log.h"
> >  #include "start.h"
> > +#include "utils.h"
> >  
> >  lxc_log_define(lxc_execute, lxc_start);
> >  
> > @@ -43,9 +44,27 @@ struct execute_args {
> >   */
> >  static char *choose_init(void)
> >  {
> > -	char *retv = malloc(PATH_MAX);
> > -	int ret;
> > +	char *retv = NULL;
> > +	int ret, env_set = 0;
> >  	struct stat mystat;
> > +
> > +	if (!getenv("PATH")) {
> > +		if (setenv("PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 0))
> 
> I don't know if standards say otherwise, but personally I don't like
> having it check /usr/local before /.  Often there's cruft in /usr/local
> from development attempts.

I based it on the standard value for Debian/Ubuntu systems which I
suspect most other distros follow.

I agree that cruft in /usr/local is a problem but at the same time, when
used properly, it's also a nice way to override or wrap the real thing
without modifying / or /usr...

> 
> > +			SYSERROR("Failed to setenv");
> > +		env_set = 1;
> > +	}
> > +
> > +	retv = on_path("init.lxc");
> > +
> > +	if (env_set) {
> > +		if (unsetenv("PATH"))
> > +			SYSERROR("Failed to unsetenv");
> > +	}
> > +
> > +	if (retv)
> > +		return retv;
> > +
> > +	retv = malloc(PATH_MAX);
> >  	if (!retv)
> >  		return NULL;
> >  
> > @@ -54,6 +73,7 @@ static char *choose_init(void)
> >  		ERROR("pathname too long");
> >  		goto out1;
> >  	}
> > +
> >  	ret = stat(retv, &mystat);
> >  	if (ret == 0)
> >  		return retv;
> > diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> > index ded8e8e..2fb3396 100644
> > --- a/src/lxc/utils.c
> > +++ b/src/lxc/utils.c
> > @@ -1274,7 +1274,7 @@ int detect_ramfs_rootfs(void)
> >  	return 0;
> >  }
> >  
> > -bool on_path(char *cmd) {
> > +char *on_path(char *cmd) {
> >  	char *path = NULL;
> >  	char *entry = NULL;
> >  	char *saveptr = NULL;
> > @@ -1283,11 +1283,11 @@ bool on_path(char *cmd) {
> >  
> >  	path = getenv("PATH");
> >  	if (!path)
> > -		return false;
> > +		return NULL;
> >  
> >  	path = strdup(path);
> >  	if (!path)
> > -		return false;
> > +		return NULL;
> >  
> >  	entry = strtok_r(path, ":", &saveptr);
> >  	while (entry) {
> > @@ -1298,7 +1298,7 @@ bool on_path(char *cmd) {
> >  
> >  		if (access(cmdpath, X_OK) == 0) {
> >  			free(path);
> > -			return true;
> > +			return strdup(cmdpath);
> >  		}
> >  
> >  next_loop:
> > @@ -1306,5 +1306,5 @@ next_loop:
> >  	}
> >  
> >  	free(path);
> > -	return false;
> > +	return NULL;
> >  }
> > diff --git a/src/lxc/utils.h b/src/lxc/utils.h
> > index a318ec8..b5e054c 100644
> > --- a/src/lxc/utils.h
> > +++ b/src/lxc/utils.h
> > @@ -279,4 +279,4 @@ uint64_t fnv_64a_buf(void *buf, size_t len, uint64_t hval);
> >  
> >  int detect_shared_rootfs(void);
> >  int detect_ramfs_rootfs(void);
> > -bool on_path(char *cmd);
> > +char *on_path(char *cmd);
> > -- 
> > 1.9.1
> > 
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140328/ef6b9c4f/attachment.pgp>


More information about the lxc-devel mailing list