You've already forked runc
mirror of
https://github.com/opencontainers/runc.git
synced 2025-08-01 05:06:52 +03:00
Return proper exit code for exec errors
Exec erros from the exec() syscall in the container's init should be treated as if the container ran but couldn't execute the process for the user instead of returning a libcontainer error as if it was an issue in the library. Before specifying different commands like `/etc`, `asldfkjasdlfj`, or `/alsdjfkasdlfj` would always return 1 on the command line with a libcontainer specific error message. Now they return the correct message and exit status defined for unix processes. Example: ```bash root@deathstar:/containers/redis# runc start test exec: "/asdlfkjasldkfj": file does not exist root@deathstar:/containers/redis# echo $? 127 root@deathstar:/containers/redis# runc start test exec: "asdlfkjasldkfj": executable file not found in $PATH root@deathstar:/containers/redis# echo $? 127 root@deathstar:/containers/redis# runc start test exec: "/etc": permission denied root@deathstar:/containers/redis# echo $? 126 ``` Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
@ -1,8 +1,11 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
@ -24,8 +27,25 @@ func init() {
|
||||
logrus.Fatalf("unable to initialize for container: %s", err)
|
||||
}
|
||||
if err := factory.StartInitialization(); err != nil {
|
||||
// return proper unix error codes
|
||||
if exerr, ok := err.(*exec.Error); ok {
|
||||
switch exerr.Err {
|
||||
case os.ErrPermission:
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(126)
|
||||
case exec.ErrNotFound:
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(127)
|
||||
default:
|
||||
if os.IsNotExist(exerr.Err) {
|
||||
fmt.Fprintf(os.Stderr, "exec: %s: %v\n", strconv.Quote(exerr.Name), os.ErrNotExist)
|
||||
os.Exit(127)
|
||||
}
|
||||
}
|
||||
}
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
panic("init: init failed to start contianer")
|
||||
}
|
||||
|
||||
var (
|
||||
|
Reference in New Issue
Block a user