diff --git a/nx/source/runtime/argv.c b/nx/source/runtime/argv.c
index 67250003..5fd3f7c3 100644
--- a/nx/source/runtime/argv.c
+++ b/nx/source/runtime/argv.c
@@ -20,8 +20,8 @@ void argvSetup(void)
 
     u8 *argdata = (u8*)&__argdata__;
     u32 *arg32 = (u32*)argdata;
-    u32 argdata_allocsize;
-    u32 argdata_strsize;
+    u64 argdata_allocsize;
+    u64 argdata_strsize;
     u32 argvptr_pos;
     u32 max_argv;
     u32 argi;
@@ -35,6 +35,7 @@ void argvSetup(void)
     __system_argc = 0;
     __system_argv = NULL;
 
+    memset(&meminfo, 0, sizeof(meminfo));
     rc = svcQueryMemory(&meminfo, &pageinfo, (u64)argdata);
 
     // TODO: Use envHasArgv() here.
@@ -43,12 +44,15 @@ void argvSetup(void)
     if (R_FAILED(rc) || meminfo.perm != 0x3)
         return;
 
-    argdata_allocsize = arg32[0];
-    argdata_strsize = arg32[1];
+    argdata_allocsize = (u64)arg32[0];
+    argdata_strsize = (u64)arg32[1];
     args = (char*)&argdata[0x20];
 
     if (argdata_allocsize==0 || argdata_strsize==0) return;
 
+    if ((u64)argdata < meminfo.addr) return;
+    if (((u64)argdata - meminfo.addr) + argdata_allocsize > meminfo.size) return;
+
     argvptr_pos = 0x20 + argdata_strsize+1;
     if (argvptr_pos >= argdata_allocsize) return;
     argstorage = (char*)&argdata[argvptr_pos];