summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/ios
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@digia.com>2014-10-24 17:12:35 +0200
committerTor Arne Vestbø <tor.arne.vestbo@digia.com>2014-10-25 00:20:21 +0200
commit27a321e1ed929a3de72ede000a38d95f98f68150 (patch)
treeffd5e70af3d1bfe23bb7c0b74a74ff58c43d0645 /src/plugins/platforms/ios
parent0c482869fb342d7a7ed44d8101e84aec9f981549 (diff)
iOS: Make room for zero-terminator when building argv from NSProcessInfo
[NSString lengthOfBytesUsingEncoding] only returns the number of bytes required for the actual string, not including the zero terminator, so when we then used cStringUsingEncoding to fill the malloced buffer with data, we overwrote the byte after our buffer with 0, resulting in random and hard to reproduce crashes at application startup, seemingly depending on the application name. Change-Id: I35d261bea5924e917475b0270bfa280bfb0c787a Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
Diffstat (limited to 'src/plugins/platforms/ios')
-rw-r--r--src/plugins/platforms/ios/qioseventdispatcher.mm10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/plugins/platforms/ios/qioseventdispatcher.mm b/src/plugins/platforms/ios/qioseventdispatcher.mm
index 821599d113..ce7dfe2606 100644
--- a/src/plugins/platforms/ios/qioseventdispatcher.mm
+++ b/src/plugins/platforms/ios/qioseventdispatcher.mm
@@ -259,10 +259,16 @@ static void __attribute__((noinline, noreturn)) user_main_trampoline()
NSArray *arguments = [[NSProcessInfo processInfo] arguments];
int argc = arguments.count;
char **argv = new char*[argc];
+
for (int i = 0; i < argc; ++i) {
NSString *arg = [arguments objectAtIndex:i];
- argv[i] = reinterpret_cast<char *>(malloc([arg lengthOfBytesUsingEncoding:[NSString defaultCStringEncoding]]));
- strcpy(argv[i], [arg cStringUsingEncoding:[NSString defaultCStringEncoding]]);
+
+ NSStringEncoding cStringEncoding = [NSString defaultCStringEncoding];
+ unsigned int bufferSize = [arg lengthOfBytesUsingEncoding:cStringEncoding] + 1;
+ argv[i] = reinterpret_cast<char *>(malloc(bufferSize));
+
+ if (![arg getCString:argv[i] maxLength:bufferSize encoding:cStringEncoding])
+ qFatal("Could not convert argv[%d] to C string", i);
}
int exitCode = qtmn(argc, argv);