记一次 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结束符;

否则就会报错了;问题解决;如有不对,望指正;