Michael McConville wrote:
> > On Sun, Dec 13, 2015 at 9:45 PM, Maxim Pugachev <pugachev...@gmail.com> 
> > wrote:
> > > Hi,
> > >
> > > In exec_script_makecmds function, when EXEC_HASFD flag was set, but
> > > copystr/copyinstr returns an error, we need to set *tmpsap to NULL to
> > > terminate a loop (under "fail" label) correctly.
> 
> I spent a while straining to see the forest through the trees, but this
> makes sense to me. ok mmcc@
> 
> Is this allocation chain idiom used elsewhere in sys/kern? Maybe we
> could break it out into ~3 functions. The current state of affairs seems
> bug-prone.

It seems that all possible paths through this nested condition increment
tmpsap. Why not just increment it afterward so no one else ends up with
the headache I now have?

As always: I could be misinterpreting this.


Index: sys/kern/exec_script.c
===================================================================
RCS file: /cvs/src/sys/kern/exec_script.c,v
retrieving revision 1.36
diff -u -p -r1.36 exec_script.c
--- sys/kern/exec_script.c      10 Sep 2015 18:10:35 -0000      1.36
+++ sys/kern/exec_script.c      29 Dec 2015 01:56:11 -0000
@@ -209,23 +209,26 @@ check_shell:
                if (ISSET(p->p_flag, P_SYSTRACE)) {
                        error = systrace_scriptname(p, *tmpsap);
                        if (error == 0)
-                               tmpsap++;
+                               tmpsap;
                        else
                                /*
                                 * Since systrace_scriptname() provides a
                                 * convenience, not a security issue, we are
                                 * safe to do this.
                                 */
-                               error = copystr(epp->ep_name, *tmpsap++,
+                               error = copystr(epp->ep_name, *tmpsap,
                                    MAXPATHLEN, NULL);
                } else
 #endif
-                       error = copyinstr(epp->ep_name, *tmpsap++, MAXPATHLEN,
+                       error = copyinstr(epp->ep_name, *tmpsap, MAXPATHLEN,
                            NULL);
-               if (error != 0)
+               if (error != 0) {
+                       *(tmpsap + 1) = NULL;
                        goto fail;
+               }
        } else
-               snprintf(*tmpsap++, MAXPATHLEN, "/dev/fd/%d", epp->ep_fd);
+               snprintf(*tmpsap, MAXPATHLEN, "/dev/fd/%d", epp->ep_fd);
+       tmpsap++;
        *tmpsap = NULL;
 
        /*

Reply via email to