Merge "Fix buffer overflow in Trace's JNI layer" into qt-dev
am: 935a535bc6
Change-Id: I69adf81bea20e08ae59ee1321a2d262006059fc3
This commit is contained in:
@@ -24,26 +24,29 @@
|
|||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
inline static void sanitizeString(char* str, size_t size) {
|
inline static void sanitizeString(char* str) {
|
||||||
for (size_t i = 0; i < size; i++) {
|
while (*str) {
|
||||||
char c = str[i];
|
char c = *str;
|
||||||
if (c == '\0' || c == '\n' || c == '|') {
|
if (c == '\n' || c == '|') {
|
||||||
str[i] = ' ';
|
*str = ' ';
|
||||||
}
|
}
|
||||||
|
str++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static void getString(JNIEnv* env, jstring jstring, char* outBuffer, jsize maxSize) {
|
|
||||||
jsize size = std::min(env->GetStringLength(jstring), maxSize);
|
|
||||||
env->GetStringUTFRegion(jstring, 0, size, outBuffer);
|
|
||||||
sanitizeString(outBuffer, size);
|
|
||||||
outBuffer[size] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename F>
|
template<typename F>
|
||||||
inline static void withString(JNIEnv* env, jstring jstr, F callback) {
|
inline static void withString(JNIEnv* env, jstring jstr, F callback) {
|
||||||
std::array<char, 1024> buffer;
|
// We need to handle the worst case of 1 character -> 4 bytes
|
||||||
getString(env, jstr, buffer.data(), buffer.size());
|
// So make a buffer of size 4097 and let it hold a string with a maximum length
|
||||||
|
// of 1024. The extra last byte for the null terminator.
|
||||||
|
std::array<char, 4097> buffer;
|
||||||
|
// We have no idea of knowing how much data GetStringUTFRegion wrote, so null it out in
|
||||||
|
// advance so we can have a reliable null terminator
|
||||||
|
memset(buffer.data(), 0, buffer.size());
|
||||||
|
jsize size = std::min(env->GetStringLength(jstr), 1024);
|
||||||
|
env->GetStringUTFRegion(jstr, 0, size, buffer.data());
|
||||||
|
sanitizeString(buffer.data());
|
||||||
|
|
||||||
callback(buffer.data());
|
callback(buffer.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user