- (NSData *)kd_AES128EncryptWithKey:(NSString *)key {
if (key.length == 0) {
return nil;
}
char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
NSUInteger newSize = 0;
if (diff > 0) {
newSize = dataLength + diff;
}
char dataPtr[newSize];
memcpy(dataPtr, [self bytes], [self length]); // crash EXC_BAD_ACCESS
...
free(buffer);
return nil;
}
在这次崩溃中: newSize = 800016 dataSize = 800001
当我为NSData(800001字节)进行AES128加密时,在memcry(),but if
the data is smaller
中崩溃,它正常工作
有人可以帮助我吗?
答案 0 :(得分:1)
你的dataPtr
被分配在堆栈中,总是有一定的限制。如果你正在处理大块内存,那么请改用堆:
char *dataPtr = (char *)malloc(newSize);
并且不要忘记稍后释放
答案 1 :(得分:0)
如果diff <= 0
newSize
为0
,则不会将内存分配给dataPtr
:char dataPtr[newSize];
,以便memcpy
崩溃。