minijail0_cli_unittest: fix random crashes/failures
The GNU getopt API cannot handle being passed different argv vectors
by default. Changing optind back to 1 will trigger a reset of state,
but only relative to the previous argv getopt saw. Instead, optind
has to be set to 0 so all internal state is reset. This extension is
from GNU (glibc), but Android's bionic also supports it.
Otherwise, when we pass in a different argv, the internal state might
randomly refer to the old argv memory which in turn can lead to random
errors or memory violations.
Bug: None
Test: `./minijail0_cli_unittest --gtest_repeat=-1` no longer randomly crashes
Change-Id: I79276518bb51e297719049c7efa9824d6f97c7ab
diff --git a/minijail0_cli_unittest.cc b/minijail0_cli_unittest.cc
index a774d55..2427a01 100644
--- a/minijail0_cli_unittest.cc
+++ b/minijail0_cli_unittest.cc
@@ -42,8 +42,10 @@
// as it parses things (which is normally permissible with argv).
int parse_args_(const std::vector<std::string>& argv, int *exit_immediately,
ElfType *elftype) {
- // Make sure we reset the getopts state when scanning a new argv.
- optind = 1;
+ // Make sure we reset the getopts state when scanning a new argv. Setting
+ // this to 0 is a GNU extension, but AOSP/BSD also checks this (as an alias
+ // to their "optreset").
+ optind = 0;
std::vector<const char *> pargv;
pargv.push_back("minijail0");