Skip to content

Commit

Permalink
[CARBONDATA-3108][CARBONDATA-3044] Fix the error of jvm will crash wh…
Browse files Browse the repository at this point in the history
…en CarbonRow use wrong index number in CSDK

1. fix the error of jvm will crash when CarbonRow use wrong index number in CSDK
   including getString, getVarchar, getArray, getDecimal
2. delete/release the data after running
3. init the variable to NULL

This closes #2929
  • Loading branch information
xubo245 authored and kunal642 committed Nov 21, 2018
1 parent b8d6025 commit 0fa0a96
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 35 deletions.
7 changes: 5 additions & 2 deletions store/CSDK/src/CarbonReader.cpp
Expand Up @@ -31,7 +31,7 @@ void CarbonReader::builder(JNIEnv *env, char *path, char *tableName) {
throw std::runtime_error("tableName parameter can't be NULL.");
}
jniEnv = env;
jclass carbonReaderClass = env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
carbonReaderClass = env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
if (carbonReaderClass == NULL) {
throw std::runtime_error("Can't find the class in java: org/apache/carbondata/sdk/file/CarbonReader");
}
Expand All @@ -56,7 +56,7 @@ void CarbonReader::builder(JNIEnv *env, char *path) {
throw std::runtime_error("path parameter can't be NULL.");
}
jniEnv = env;
jclass carbonReaderClass = env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
carbonReaderClass = env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
if (carbonReaderClass == NULL) {
throw std::runtime_error("Can't find the class in java: org/apache/carbondata/sdk/file/CarbonReader");
}
Expand Down Expand Up @@ -230,4 +230,7 @@ void CarbonReader::close() {
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
jniEnv->DeleteLocalRef(carbonReaderBuilderObject);
jniEnv->DeleteLocalRef(carbonReaderObject);
jniEnv->DeleteLocalRef(carbonReaderClass);
}
5 changes: 5 additions & 0 deletions store/CSDK/src/CarbonReader.h
Expand Up @@ -45,6 +45,11 @@ class CarbonReader {
*/
jobject carbonReaderObject = NULL;

/**
* carbonReader class for reading data
*/
jclass carbonReaderClass = NULL;

/**
* Return true if carbonReaderBuilder Object isn't NULL
* Throw exception if carbonReaderBuilder Object is NULL
Expand Down
60 changes: 52 additions & 8 deletions store/CSDK/src/CarbonRow.cpp
Expand Up @@ -87,6 +87,9 @@ CarbonRow::CarbonRow(JNIEnv *env) {
if (getArrayId == NULL) {
throw std::runtime_error("Can't find the method in java: getArray");
}
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
}

void CarbonRow::setCarbonRow(jobject data) {
Expand Down Expand Up @@ -114,7 +117,11 @@ short CarbonRow::getShort(int ordinal) {
jvalue args[2];
args[0].l = carbonRow;
args[1].i = ordinal;
return jniEnv->CallStaticShortMethodA(rowUtilClass, getShortId, args);
short result = jniEnv->CallStaticShortMethodA(rowUtilClass, getShortId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
return result;
}

int CarbonRow::getInt(int ordinal) {
Expand All @@ -123,7 +130,11 @@ int CarbonRow::getInt(int ordinal) {
jvalue args[2];
args[0].l = carbonRow;
args[1].i = ordinal;
return jniEnv->CallStaticIntMethodA(rowUtilClass, getIntId, args);
int result = jniEnv->CallStaticIntMethodA(rowUtilClass, getIntId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
return result;
}

long CarbonRow::getLong(int ordinal) {
Expand All @@ -132,7 +143,11 @@ long CarbonRow::getLong(int ordinal) {
jvalue args[2];
args[0].l = carbonRow;
args[1].i = ordinal;
return jniEnv->CallStaticLongMethodA(rowUtilClass, getLongId, args);
long result = jniEnv->CallStaticLongMethodA(rowUtilClass, getLongId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
return result;
}

double CarbonRow::getDouble(int ordinal) {
Expand All @@ -141,17 +156,24 @@ double CarbonRow::getDouble(int ordinal) {
jvalue args[2];
args[0].l = carbonRow;
args[1].i = ordinal;
return jniEnv->CallStaticDoubleMethodA(rowUtilClass, getDoubleId, args);
double result = jniEnv->CallStaticDoubleMethodA(rowUtilClass, getDoubleId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
return result;
}


float CarbonRow::getFloat(int ordinal) {
checkCarbonRow();
checkOrdinal(ordinal);
jvalue args[2];
args[0].l = carbonRow;
args[1].i = ordinal;
return jniEnv->CallStaticFloatMethodA(rowUtilClass, getFloatId, args);
float result = jniEnv->CallStaticFloatMethodA(rowUtilClass, getFloatId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
return result;
}

jboolean CarbonRow::getBoolean(int ordinal) {
Expand All @@ -160,7 +182,11 @@ jboolean CarbonRow::getBoolean(int ordinal) {
jvalue args[2];
args[0].l = carbonRow;
args[1].i = ordinal;
return jniEnv->CallStaticBooleanMethodA(rowUtilClass, getBooleanId, args);
bool result = jniEnv->CallStaticBooleanMethodA(rowUtilClass, getBooleanId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
return result;
}

char *CarbonRow::getString(int ordinal) {
Expand All @@ -170,6 +196,9 @@ char *CarbonRow::getString(int ordinal) {
args[0].l = carbonRow;
args[1].i = ordinal;
jobject data = jniEnv->CallStaticObjectMethodA(rowUtilClass, getStringId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
char *str = (char *) jniEnv->GetStringUTFChars((jstring) data, JNI_FALSE);
jniEnv->DeleteLocalRef(data);
return str;
Expand All @@ -182,6 +211,9 @@ char *CarbonRow::getDecimal(int ordinal) {
args[0].l = carbonRow;
args[1].i = ordinal;
jobject data = jniEnv->CallStaticObjectMethodA(rowUtilClass, getDecimalId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
char *str = (char *) jniEnv->GetStringUTFChars((jstring) data, JNI_FALSE);
jniEnv->DeleteLocalRef(data);
return str;
Expand All @@ -194,6 +226,9 @@ char *CarbonRow::getVarchar(int ordinal) {
args[0].l = carbonRow;
args[1].i = ordinal;
jobject data = jniEnv->CallStaticObjectMethodA(rowUtilClass, getVarcharId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
char *str = (char *) jniEnv->GetStringUTFChars((jstring) data, JNI_FALSE);
jniEnv->DeleteLocalRef(data);
return str;
Expand All @@ -205,5 +240,14 @@ jobjectArray CarbonRow::getArray(int ordinal) {
jvalue args[2];
args[0].l = carbonRow;
args[1].i = ordinal;
return (jobjectArray) jniEnv->CallStaticObjectMethodA(rowUtilClass, getArrayId, args);
jobjectArray result = (jobjectArray) jniEnv->CallStaticObjectMethodA(rowUtilClass, getArrayId, args);
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
return result;
}

void CarbonRow::close() {
jniEnv->DeleteLocalRef(rowUtilClass);
jniEnv->DeleteLocalRef(carbonRow);
}
6 changes: 6 additions & 0 deletions store/CSDK/src/CarbonRow.h
Expand Up @@ -154,4 +154,10 @@ class CarbonRow {
* @return jobjectArray data type data
*/
jobjectArray getArray(int ordinal);

/**
* delete data and release
* @return
*/
void close();
};
3 changes: 3 additions & 0 deletions store/CSDK/src/CarbonWriter.cpp
Expand Up @@ -164,4 +164,7 @@ void CarbonWriter::close() {
if (jniEnv->ExceptionCheck()) {
throw jniEnv->ExceptionOccurred();
}
jniEnv->DeleteLocalRef(carbonWriterBuilderObject);
jniEnv->DeleteLocalRef(carbonWriterObject);
jniEnv->DeleteLocalRef(carbonWriter);
}

0 comments on commit 0fa0a96

Please sign in to comment.