Skip to content

Commit e68c4ab

Browse files
committed
main: Handle argv allocation failure in Android entry point
1 parent f56757d commit e68c4ab

File tree

1 file changed

+36
-29
lines changed

1 file changed

+36
-29
lines changed

src/core/android/SDL_android.c

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -846,41 +846,48 @@ JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(JNIEnv *env, jclass cls,
846846
char **argv;
847847
bool isstack;
848848

849-
// Prepare the arguments.
849+
// Always use the name "app_process" for argv[0] so PHYSFS_platformCalcBaseDir() works.
850+
// https://github.com/love2d/love-android/issues/24
851+
850852
len = (*env)->GetArrayLength(env, array);
851-
argv = SDL_small_alloc(char *, 1 + len + 1, &isstack); // !!! FIXME: check for NULL
852-
argc = 0;
853-
/* Use the name "app_process" so PHYSFS_platformCalcBaseDir() works.
854-
https://github.com/love2d/love-android/issues/24
855-
*/
856-
argv[argc++] = SDL_strdup("app_process");
857-
for (i = 0; i < len; ++i) {
858-
char *arg = NULL;
859-
jstring string = (*env)->GetObjectArrayElement(env, array, i);
860-
if (string) {
861-
const char *utf = (*env)->GetStringUTFChars(env, string, 0);
862-
if (utf) {
863-
arg = SDL_strdup(utf);
864-
(*env)->ReleaseStringUTFChars(env, string, utf);
853+
argv = SDL_small_alloc(char *, 1 + len + 1, &isstack);
854+
if (!argv) {
855+
// Failed to allocate the argv (out of memory). Use a dummy argv instead.
856+
char fallbackargv0[] = { 'a', 'p', 'p', '_', 'p', 'r', 'o', 'c', 'e', 's', 's', '\0' };
857+
char *fallbackargv[2] = { fallbackargv0, NULL };
858+
859+
// Run the application (without arguments).
860+
status = SDL_main(1, fallbackargv);
861+
} else {
862+
argc = 0;
863+
argv[argc++] = SDL_strdup("app_process");
864+
for (i = 0; i < len; ++i) {
865+
char *arg = NULL;
866+
jstring string = (*env)->GetObjectArrayElement(env, array, i);
867+
if (string) {
868+
const char *utf = (*env)->GetStringUTFChars(env, string, 0);
869+
if (utf) {
870+
arg = SDL_strdup(utf);
871+
(*env)->ReleaseStringUTFChars(env, string, utf);
872+
}
873+
(*env)->DeleteLocalRef(env, string);
865874
}
866-
(*env)->DeleteLocalRef(env, string);
867-
}
868-
if (arg == NULL) {
869-
arg = SDL_strdup("");
875+
if (arg == NULL) {
876+
arg = SDL_strdup("");
877+
}
878+
argv[argc++] = arg;
870879
}
871-
argv[argc++] = arg;
872-
}
873-
argv[argc] = NULL;
880+
argv[argc] = NULL;
874881

875-
// Run the application.
876-
status = SDL_main(argc, argv);
882+
// Run the application.
883+
status = SDL_main(argc, argv);
877884

878-
// Release the arguments.
879-
for (i = 0; i < argc; ++i) {
880-
SDL_free(argv[i]);
885+
// Release the arguments.
886+
for (i = 0; i < argc; ++i) {
887+
SDL_free(argv[i]);
888+
}
889+
SDL_small_free(argv, isstack);
881890
}
882-
SDL_small_free(argv, isstack);
883-
884891
} else {
885892
__android_log_print(ANDROID_LOG_ERROR, "SDL", "nativeRunMain(): Couldn't find function %s in library %s", function_name, library_file);
886893
}

0 commit comments

Comments
 (0)