Skip to content

Commit 72ecdad

Browse files
committed
main: Handle failure to allocate argv in Android entry point
1 parent eb5f87a commit 72ecdad

File tree

1 file changed

+37
-28
lines changed

1 file changed

+37
-28
lines changed

src/core/android/SDL_android.c

+37-28
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "SDL_android.h"
2626

2727
#include "../../events/SDL_events_c.h"
28+
#include "../../main/SDL_runapp.h"
2829
#include "../../video/android/SDL_androidkeyboard.h"
2930
#include "../../video/android/SDL_androidmouse.h"
3031
#include "../../video/android/SDL_androidtouch.h"
@@ -817,41 +818,49 @@ JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(JNIEnv *env, jclass cls,
817818
char **argv;
818819
bool isstack;
819820

821+
// Always use the name "app_process" for argv[0] so PHYSFS_platformCalcBaseDir() works.
822+
// https://github.com/love2d/love-android/issues/24
823+
820824
// Prepare the arguments.
821825
len = (*env)->GetArrayLength(env, array);
822-
argv = SDL_small_alloc(char *, 1 + len + 1, &isstack); // !!! FIXME: check for NULL
823-
argc = 0;
824-
/* Use the name "app_process" so PHYSFS_platformCalcBaseDir() works.
825-
https://github.com/love2d/love-android/issues/24
826-
*/
827-
argv[argc++] = SDL_strdup("app_process");
828-
for (i = 0; i < len; ++i) {
829-
char *arg = NULL;
830-
jstring string = (*env)->GetObjectArrayElement(env, array, i);
831-
if (string) {
832-
const char *utf = (*env)->GetStringUTFChars(env, string, 0);
833-
if (utf) {
834-
arg = SDL_strdup(utf);
835-
(*env)->ReleaseStringUTFChars(env, string, utf);
826+
argv = SDL_small_alloc(char *, 1 + len + 1, &isstack);
827+
if (!argv) {
828+
// Failed to allocate the argv (out of memory?). Use a dummy argv instead.
829+
char dummyargv0[] = { 'a', 'p', 'p', '_', 'p', 'r', 'o', 'c', 'e', 's', 's', '\0' };
830+
char *dummyargv[2] = { dummyargv0, NULL };
831+
832+
// Run the application (without arguments).
833+
status = SDL_main(1, dummyargv);
834+
} else {
835+
argc = 0;
836+
argv[argc++] = SDL_strdup("app_process");
837+
for (i = 0; i < len; ++i) {
838+
char *arg = NULL;
839+
jstring string = (*env)->GetObjectArrayElement(env, array, i);
840+
if (string) {
841+
const char *utf = (*env)->GetStringUTFChars(env, string, 0);
842+
if (utf) {
843+
arg = SDL_strdup(utf);
844+
(*env)->ReleaseStringUTFChars(env, string, utf);
845+
}
846+
(*env)->DeleteLocalRef(env, string);
836847
}
837-
(*env)->DeleteLocalRef(env, string);
838-
}
839-
if (arg == NULL) {
840-
arg = SDL_strdup("");
848+
if (arg == NULL) {
849+
arg = SDL_strdup("");
850+
}
851+
argv[argc++] = arg;
841852
}
842-
argv[argc++] = arg;
843-
}
844-
argv[argc] = NULL;
853+
argv[argc] = NULL;
845854

846-
// Run the application.
847-
status = SDL_main(argc, argv);
855+
// Run the application.
856+
status = SDL_main(argc, argv);
848857

849-
// Release the arguments.
850-
for (i = 0; i < argc; ++i) {
851-
SDL_free(argv[i]);
858+
// Release the arguments.
859+
for (i = 0; i < argc; ++i) {
860+
SDL_free(argv[i]);
861+
}
862+
SDL_small_free(argv, isstack);
852863
}
853-
SDL_small_free(argv, isstack);
854-
855864
} else {
856865
__android_log_print(ANDROID_LOG_ERROR, "SDL", "nativeRunMain(): Couldn't find function %s in library %s", function_name, library_file);
857866
}

0 commit comments

Comments
 (0)