[lxc-devel] [PATCH] fix checking hook script exit code

Serge Hallyn serge.hallyn at ubuntu.com
Fri Apr 12 22:32:49 UTC 2013


Quoting Dwight Engen (dwight.engen at oracle.com):
> On Fri, 12 Apr 2013 15:36:03 -0500
> Serge Hallyn <serge.hallyn at ubuntu.com> wrote:
> 
> > Quoting Dwight Engen (dwight.engen at oracle.com):
> > > pclose returns the exit status from wait, we need to check that to
> > > see if the script itself failed or not. Tested a script that
> > > returned 0, 1, and also one that did a sleep and then was killed by
> > > a signal (abnormal termination).
> > > 
> > > Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
> > > ---
> > >  src/lxc/conf.c | 7 +++++--
> > >  1 file changed, 5 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> > > index 6b3f318..07529da 100644
> > > --- a/src/lxc/conf.c
> > > +++ b/src/lxc/conf.c
> > > @@ -299,6 +299,7 @@ static int run_buffer(char *buffer)
> > >  {
> > >  	FILE *f;
> > >  	char *output;
> > > +	int ret;
> > >  
> > >  	f = popen(buffer, "r");
> > >  	if (!f) {
> > > @@ -317,8 +318,10 @@ static int run_buffer(char *buffer)
> > >  
> > >  	free(output);
> > >  
> > > -	if (pclose(f) == -1) {
> > > -		SYSERROR("Script exited on error");
> > > +	ret = pclose(f);
> > > +	if (ret < 0 || !WIFEXITED(ret) || WEXITSTATUS(ret) != 0) {
> > > +		SYSERROR("Script exited:%snormally with:%d",
> > > +			 WIFEXITED(ret) ? "" : "ab",
> > > WEXITSTATUS(ret));
> > 
> > I don't know pclose all that well...  but the manpage says
> >        The pclose() function returns -1 if wait4(2) returns an error,
> > or some  other  error  is detected.
> > 
> > You're treating it as though it contains the status filled in
> > by wait4 et al.  Is that valid?
> > 
> > not nack'ing, just not clear on what we can do with ret :)
> 
> Yes RETURN VALUE section of the man page confused me as well upon
> first reading :) Then I found this
> 
> https://groups.google.com/forum/?fromgroups=#!topic/utah-c/g4MpZVnJ7es
> 
> which was helpful, but more importantly I did some testing with it
> to make sure it actually was the wait status. I did this by writing a
> pre-start hook script that returned different values and verified
> what I saw in the lxc log (which is why I added to that SYSERROR).
> 
> I then read the full pclose man page and at the end of the DESCRIPTION
> section it says "The  pclose()  function  waits  for the associated
> process to terminate and returns the exit status of the command as
> returned by wait4(2)." so I'm pretty sure it does intend to return the
> exit status as opposed to code.

Thanks, I get it :)

My other question then is about (a) other wai4 errors or (b) any other
error that might happen.  pclose will return -1 then, so should your
error message say 'there was some error' on -1, and only say "the
scrip exited with WEXITSTATUS(ret)" if ret != -1?  Else it'll just
report 255, but it could mislead an admin trying to debug his
hooks.

-serge




More information about the lxc-devel mailing list