记一次 Native Crash Abort message:‘FORTIPY :vsprintf:prevented 33-byte write into 32-byte buffer ’
先贴上关键日志
第一眼看到日志,以为是缺少了Arm64 的so文件,查看后发现并没缺少;
无奈之下,只有复现这个Crash,一点点缩小排查范围;最终将问题的矛头指向了项目中Native 层Md5加密的地方:
extern "C" JNIEXPORT jstring JNICALL Java_com_symbol_business_NdkMethods_signatureParams(JNIEnv *env, jclass type, jstring params_) { if (is_verify == 0) { return env->NewStringUTF("error signature"); } const char *params = env->GetStringUTFChars(params_, 0); string signature_str(params); signature_str.insert(0, EXTRA_SIGNATURE); signature_str = signature_str.substr(0, signature_str.length() - 2); MD5_CTX *ctx = new MD5_CTX(); MD5Init(ctx); MD5Update(ctx, (unsigned char *) signature_str.c_str(), (unsigned int) signature_str.length()); unsigned char digest[16] = {0}; MD5Final(ctx, digest); //char md5_str[32] = {0}; char md5_str[33] = {0}; for (int i = 0; i < 16; i++) { sprintf(md5_str, "%s%02x", md5_str, digest[i]); } env->ReleaseStringUTFChars(params_, params); return env->NewStringUTF(md5_str); }
根据报错日志,我将以上代码中注释掉的那一行改为下面那一行。异常崩溃就好了,我也是百思不得解;
Md5加密32位的不应该是md5_str[32]吗?
原来md5_str[32]应该是md5_str[33]留一位给/0结束符;
否则就会报错了;问题解决;如有不对,望指正;