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; | ||||