On Thu, Oct 27, 2011 at 02:03:25PM +0200, Pavel Zuna wrote:
> On 10/25/2011 01:08 PM, Pavel Zuna wrote:
> >On 10/21/2011 06:44 PM, Stephen Gallagher wrote:
> >>On Fri, 2011-10-21 at 15:28 +0200, Pavel Zuna wrote:
> >>>Base on the second proposal:
> >>>
> >>>https://fedorahosted.org/sssd/wiki/DesignDocs/SigChld
> >>>
> >>>There is some old SIGCHLD handling code in 
> >>>src/providers/child_common.[ch], that
> >>>should probably go away if this gets accepted. There was also a naming 
> >>>conflict
> >>>with the sss_child_ctx structure. This structure is only used internally by
> >>>functions defined src/providers/child_common.c. I renamed the original 
> >>>structure
> >>>to sss_child_ctx_old for now.
> >>
> >>
> >>Nack (but a good start)
> >>
> >>sss_child_destructor() cannot return the result of hash_delete(). Talloc
> >>destructors may only return 0 on success or -1 on failure. However,
> >>because destructor failure results in cancelling the free(), we should
> >>just log an error here and return 0.
> >>
> >>sss_child_register:
> >>Don't initialize sss_child_ctx *tmp to the child_ctx passed in. We want
> >>to leave child_ctx untouched until successful completion. Also, please
> >>don't use the variable name "tmp". It's not descriptive. Call it
> >>"child".
> >>
> >>Instead of allocating *child_ctx at the beginning, allocate "child" on
> >>the mem_ctx.
> >>
> >>child = talloc_zero(mem_ctx, struct sss_child_ctx);
> >>
> >>Then, only at the end of execution, right before returning EOK, do
> >>*child_ctx = child;
> >>

In sss_child_register():

+    error = hash_enter(sigchld_ctx->children, &key, &value);
+    if (error != HASH_SUCCESS && error != HASH_ERROR_KEY_NOT_FOUND) {

I don't think hash_enter can return HASH_ERROR_KEY_NOT_FOUND (what would
it mean?) and even if it did, why ignore it?

> >>
> >>sss_child_invoke_cb():
> >>I'm wary of having the callback invocation free the child_ctx. It needs
> >>to be documented well (so that consumers know they must not free it once
> >>the callback has fired or they'll get a double-free).

This still needs fixing.

> >>
> >>sss_child_handler():
> >>You need to check whether waitpid() returned an error and handle that
> >>appropriately. waitpid() will return -1 on error and set errno. If the
> >>errno value is EINTR, you should retry (because waitpid() was
> >>interrupted by a signal at the time). Other errors should generate a
> >>DEBUG message.

I think you misunderstood how the error handling should be done:

+        if (pid == -1) {
+            if (errno == ECHILD) {
+                DEBUG(0, ("waitpid failed with ECHILD\n"));
+            } else if (errno == EINVAL) {
+                DEBUG(0, ("waitpid failed with EINVAL\n"));
+            }
+            return;
+        }

Instead of having a DEBUG() call per retval, it would be better to inform user
on why the child process exited, similarly to how child_sig_handler() does it
now.

> >>
> >
> >Ok, I'm done with all of this. It was pretty straight forward, but...
> >
> >>
> >>Please separate any changes you make to the existing sss_child_ctx into
> >>its own patch. I don't like just renaming it to _old, either. Please
> >>find a more appropriate way to replace this old object (preferably by
> >>converting it to use your new mechanism, also in a new patch).
> >>
> >
> >... this, I'm trying to find a way to make the old code use the new 
> >mechanism. I
> >think it would be better to remove the old one completely and replace it with
> >the new one everywhere where it's used.
> >
> >Pavel
> 
> New patch with the above mentioned issues fixed is attached to this email.
> 
> We agreed that we're going to replace all uses of the old system by
> the new. Expect about 3 patches to follow on this one - one for each
> provider using the old system.
> 
> Pavel

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to