Open
Description
I'm using dockerc for a simple program that takes input via STDIN.
It works well when passing data interactively (i.e: the user entering it directly in their terminal), but when using any non-interactive inputs, the dockerc generated binaries crash instantly.
POC
main.c:
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Dockerfile:
# Build stage
FROM alpine:latest AS builder
WORKDIR /build
RUN apk add --no-cache gcc musl-dev
COPY main.c .
RUN gcc -O0 -o c-program main.c -no-pie -fno-stack-protector
# Final stage
FROM alpine:latest
WORKDIR /challenge
COPY --from=builder /build/c-program .
ENTRYPOINT ["./c-program"]
build.sh
#!/bin/bash
docker build -t test-image .
dockerc_x86-64 --image "docker-daemon:test-image:latest" --output "dockerc-program"
Output
Launching normally (works):
./dockerc-program
newuidmap failed, falling back to single user mapping
newgidmap failed, falling back to single group mapping
unknown argument ignored: lazytime
Hello, world!
Launching with non-interactive STDIN:
cat | ./dockerc-program
newuidmap failed, falling back to single user mapping
newgidmap failed, falling back to single group mapping
unknown argument ignored: lazytime
thread 1032321 panic: failed to run container (status/errno: 25) (-1): tcgetattr
Unwind error at address `exe:0x1083476` (error.InvalidDebugInfo), trace may be incomplete
thread 1032307 panic: container didn't exist normally : 134
Unwind error at address `exe:0x1083476` (error.InvalidDebugInfo), trace may be incomplete
Aborted (core dumped)
For the record, the normal behaviour is well implemented by docker run
:
cat | sudo docker run -i test-image
Hello, world!
I havent included actual user input handling in this example to pinpoint the fact that dockerc binaries crash in all cases, but docker run -i
handles it correctly too.
This crash prevents using dockerc binaries as regular "UNIX-y" command-line utilities.
Metadata
Metadata
Assignees
Labels
No labels