The POSIX specification for the dot command[1] states:

    EXIT STATUS
        Returns the value of the last command executed, or a zero exit
        status if no command is executed.

If an empty file is sourced, then "no command is executed", and hence
the exit status should be zero. If the exit status is not reset before
sourcing an empty file, the exit status of the previous command "leaks"
through. Here's a simple test case:

    false
    . /dev/null
    [ $? = 0 ] && echo "Success" || echo "Failure"

This behaviour becomes more problematic when combined with "set -e". Consider 
the following snippet:

    if [ "$FILETYPE" != "shell" ]; then
        run_external_script "$FILEPATH"
    else
        . "$FILEPATH"
    fi

Assume "set -e", that FILETYPE is set to "shell" and that FILEPATH points to
an empty file. Since the condition returns a non-zero exit status (which is
protected from "set -e" by the if statement), the shell runs the "else" branch
of the code, sources the empty file, and then checks the last exit status
again. Because the exit status from the condition hasn't been cleared, "set -e" 
causes the shell to exit even though no un-handled error has occurred.

[1] http://pubs.opengroup.org/onlinepubs/009695399/utilities/dot.html

Signed-off-by: Timothy Allen <screwt...@froup.com>
---
 src/main.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/src/main.c b/src/main.c
index 1735c67..b4c07e9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -318,6 +318,7 @@ int
 dotcmd(int argc, char **argv)
 {
        int status = 0;
+       exitstatus = 0;
 
        if (argc >= 2) {                /* That's what SVR2 does */
                char *fullname;
-- 
1.7.1




-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to