Skip to content

TSAN reexec of shebang script results in unexpected argv[] #102579

Open
@awelzel

Description

@awelzel

We've run into spurious testing failures when running a TSAN instrumented executable as script interpreter in a shebang:
zeek/zeek#3774

This was tracked down to TSAN deciding to reexecute and then the shebang arguments are duplicated in argv[].

Here's a short reproducer, notice the -b -- and ./main.sh entries duplicated after a reexec is forced with ulimit -s unlimited. For us it was a spurious failure because the reexec wasn't deterministic.

$ cat main.c
#include <stdio.h>

int main(int argc, const char *argv[]) {
  printf("argc=%d\n", argc);
  for ( int i = 0; i < argc; i++) {
    printf("argv[%d]=%s\n", i, argv[i]);
  }
}

$ cat main.sh 
#!./main -b --

$ clang-18 -fsanitize=thread main.c -o main 

$ ./main.sh -a
argc=4
argv[0]=./main
argv[1]=-b --
argv[2]=./main.sh
argv[3]=-a

# force a tsan re-exec
$ ulimit -s unlimited

$ ./main.sh -a
argc=6
argv[0]=./main
argv[1]=-b --           # duplicate
argv[2]=./main.sh       # duplicate
argv[3]=-b --
argv[4]=./main.sh
argv[5]=-a

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions