Details
Details
- Reviewers
- None
- Group Reviewers
hg-reviewers - Commits
- rHGd6227c6c0814: osutil: tolerate Py_GetArgcArgv not being set up properly
Diff Detail
Diff Detail
- Repository
- rHG Mercurial
- Lint
Lint Skipped - Unit
Unit Tests Skipped
hg-reviewers |
Lint Skipped |
Unit Tests Skipped |
Path | Packages | |||
---|---|---|---|---|
M | mercurial/cext/osutil.c (9 lines) |
Commit | Parents | Author | Summary | Date |
---|---|---|---|---|
32a5300763de | 396f51dbf27e | Kyle Lippincott | Sep 17 2019, 6:09 PM |
static char *argvstart = NULL; | static char *argvstart = NULL; | ||||
static size_t argvsize = 0; | static size_t argvsize = 0; | ||||
if (argvstart == NULL) { | if (argvstart == NULL) { | ||||
int argc = 0, i; | int argc = 0, i; | ||||
char **argv = NULL; | char **argv = NULL; | ||||
char *argvend; | char *argvend; | ||||
extern void Py_GetArgcArgv(int *argc, char ***argv); | extern void Py_GetArgcArgv(int *argc, char ***argv); | ||||
Py_GetArgcArgv(&argc, &argv); | Py_GetArgcArgv(&argc, &argv); | ||||
/* Py_GetArgcArgv may not do much if a custom python | |||||
* launcher is used that doesn't record the information | |||||
* it needs. Let's handle this gracefully instead of | |||||
* segfaulting. */ | |||||
if (argv != NULL) | |||||
argvend = argvstart = argv[0]; | |||||
else | |||||
argvend = argvstart = NULL; | |||||
/* Check the memory we can use. Typically, argv[i] and | /* Check the memory we can use. Typically, argv[i] and | ||||
* argv[i + 1] are continuous. */ | * argv[i + 1] are continuous. */ | ||||
argvend = argvstart = argv[0]; | |||||
for (i = 0; i < argc; ++i) { | for (i = 0; i < argc; ++i) { | ||||
if (argv[i] > argvend || argv[i] < argvstart) | if (argv[i] > argvend || argv[i] < argvstart) | ||||
break; /* not continuous */ | break; /* not continuous */ | ||||
size_t len = strlen(argv[i]); | size_t len = strlen(argv[i]); | ||||
argvend = argv[i] + len + 1 /* '\0' */; | argvend = argv[i] + len + 1 /* '\0' */; | ||||
} | } | ||||
if (argvend > argvstart) /* sanity check */ | if (argvend > argvstart) /* sanity check */ | ||||
argvsize = argvend - argvstart; | argvsize = argvend - argvstart; |