[Ace-users] [ace-bugs] ACE_Process::spawn() results in undefined behavior

Johnny Willemsen jwillemsen at remedy.nl
Fri Oct 26 14:06:31 CDT 2007


Hi JT,

Thanks for using the PRF form. I would prefer to use the !ACE_HAS_THREADS
instead of 0. Can you commit this to the repository?

Regards,

Johnny Willemsen
Remedy IT
Postbus 101
2650 AC  Berkel en Rodenrijs
The Netherlands
www.theaceorb.nl / www.remedy.nl  

*** Integrated compile and test statistics see
http://scoreboard.theaceorb.nl ***
*** Commercial service and support for ACE/TAO/CIAO             ***
*** See http://www.theaceorb.nl/en/support.html                 ***

>     ACE VERSION: 5.6.1 (subversion version 79840)
> 
>     HOST MACHINE and OPERATING SYSTEM:
> 
> NetBSD orac.acorntoolworks.com 3.0_STABLE NetBSD 3.0_STABLE 
> (ORAC) #0: Tue Feb 21 20:05:51 PST 2006  
> jtc at orac.acorntoolworks.com:/home/jtc/netbsd/NetBSD-3/src/sys/
> arch/i386/compile/ORAC i386
> 
>     TARGET MACHINE and OPERATING SYSTEM, if different from HOST:
> 
> NetBSD orac.acorntoolworks.com 3.0_STABLE NetBSD 3.0_STABLE 
> (ORAC) #0: Tue Feb 21 20:05:51 PST 2006  
> jtc at orac.acorntoolworks.com:/home/jtc/netbsd/NetBSD-3/src/sys/
> arch/i386/compile/ORAC i386
> 
>     COMPILER NAME AND VERSION (AND PATCHLEVEL):
> 
> gcc version 3.3.3 (NetBSD nb3 20040520)
> 
>     THE $ACE_ROOT/ace/config.h FILE [if you use a link to a platform-
>     specific file, simply state which one]:
> 
> config-netbsd.h
> 
>     THE $ACE_ROOT/include/makeinclude/platform_macros.GNU FILE [if you
>     use a link to a platform-specific file, simply state which one
>     (unless this isn't used in this case, e.g., with Microsoft Visual
>     C++)]:
> 
> platform_netbsd.GNU
> 
>     CONTENTS OF 
> $ACE_ROOT/bin/MakeProjectCreator/config/default.features
>     (used by MPC when you generate your own makefiles):
> 
> N/A
> 
>     AREA/CLASS/EXAMPLE AFFECTED:
>     [What example failed?  What module failed to compile?]
> 
> ACE_Process
> 
>     DOES THE PROBLEM AFFECT:
> 
> EXECUTION
> 
>     SYNOPSIS:
> 
> ACE_Process::spawn() results in undefined behavior 
> 
>     DESCRIPTION:
> 
> Similar to the PRF I sent this morning, ACE_Process::spawn() invokes
> async-signal-unsafe functions between fork() and exec().
> 
> This PRF is for the simplest of those cases.  In the child process,
> if setpgid(), setregid(), or setreuid() fails, it invokes ACE_ERROR
> to note the failure(s).  This will result in an async-signal-unsafe
> call to printf() at the very least (I wouldn't be surprised if tens
> of unsafe functions are called within a single ACE_ERROR invocation).
> 
> This can result in deadlock.
> 
>     REPEAT BY:
> 
> Discovered by code inspection.
> 
>     SAMPLE FIX/WORKAROUND:
> 
> The enclosed patch Adds a #if 0 around each ACE_ERROR call.  A case
> could be made for using #if !ACE_HAS_THREADS instead.  I'm interested
> in opinions over which would be preferable for the master ACE sources.
> 
> Index: Process.cpp
> ===================================================================
> --- Process.cpp	(revision 79869)
> +++ Process.cpp	(working copy)
> @@ -353,9 +353,15 @@
>        if (options.getgroup () != ACE_INVALID_PID
>            && ACE_OS::setpgid (0,
>                                options.getgroup ()) < 0)
> -        ACE_ERROR ((LM_ERROR,
> -                    ACE_TEXT ("%p.\n"),
> -                    ACE_TEXT ("ACE_Process::spawn: setpgid 
> failed.")));
> +	{
> +#if 0
> +	  // We can't emit this log message because ACE_ERROR(), etc.
> +	  // will invoke async signal unsafe functions.
> +	  ACE_ERROR ((LM_ERROR,
> +                      ACE_TEXT ("%p.\n"),
> +                      ACE_TEXT ("ACE_Process::spawn: setpgid 
> failed.")));
> +#endif
> +	}
>  # endif /* ACE_LACKS_SETPGID */
>  
>  # if !defined (ACE_LACKS_SETREGID)
> @@ -363,9 +369,15 @@
>            || options.getegid () != (uid_t) -1)
>          if (ACE_OS::setregid (options.getrgid (),
>                                options.getegid ()) == -1)
> -          ACE_ERROR ((LM_ERROR,
> -                      ACE_TEXT ("%p.\n"),
> -                      ACE_TEXT ("ACE_Process::spawn: 
> setregid failed.")));
> +	  {
> +#if 0
> +	    // We can't emit this log message because ACE_ERROR(), etc.
> +	    // will invoke async signal unsafe functions.
> +	    ACE_ERROR ((LM_ERROR,
> +			ACE_TEXT ("%p.\n"),
> +			ACE_TEXT ("ACE_Process::spawn: setregid 
> failed.")));
> +#endif
> +	  }
>  # endif /* ACE_LACKS_SETREGID */
>  
>  # if !defined (ACE_LACKS_SETREUID)
> @@ -374,9 +386,15 @@
>            || options.geteuid () != (uid_t) -1)
>          if (ACE_OS::setreuid (options.getruid (),
>                                options.geteuid ()) == -1)
> -          ACE_ERROR ((LM_ERROR,
> -                      ACE_TEXT ("%p.\n"),
> -                      ACE_TEXT ("ACE_Process::spawn: 
> setreuid failed.")));
> +	  {
> +#if 0
> +	    // We can't emit this log message because ACE_ERROR(), etc.
> +	    // will invoke async signal unsafe functions.
> +	    ACE_ERROR ((LM_ERROR,
> +			ACE_TEXT ("%p.\n"),
> +			ACE_TEXT ("ACE_Process::spawn: setreuid 
> failed.")));
> +#endif
> +	  }
>  # endif /* ACE_LACKS_SETREUID */
>  
>        this->child (ACE_OS::getppid ());
> 
> -- 
> J.T. Conklin
> 
> _______________________________________________
> ace-bugs mailing list
> ace-bugs at mail.cse.wustl.edu
> http://mail.cse.wustl.edu/mailman/listinfo/ace-bugs
> 



More information about the Ace-users mailing list