8210242: vmTestbase/nsk/stress/jni/jnistress001.java crashes with EXCEPTION_ACCESS_VIOLATION on windows-x86

Non-NUL-terminated string was passed to %s - use %.*s to specify the actual length.

Reviewed-by: lfoltan, hseigel
This commit is contained in:
David Holmes 2018-10-25 19:12:39 -04:00
parent 589b596bec
commit 3837f1abc1
2 changed files with 30 additions and 17 deletions
test/hotspot/jtreg/vmTestbase/nsk/stress/jni

@ -21,6 +21,16 @@
* questions. * questions.
*/ */
#include <stdlib.h>
// checked malloc to trap OOM conditions
static void* c_malloc(JNIEnv* env, size_t size) {
void* ret = malloc(size);
if (ret == NULL)
env->FatalError("malloc failed");
return ret;
}
// Asserts every exception as fatal one // Asserts every exception as fatal one
#define CE {\ #define CE {\
if (env->ExceptionOccurred())\ if (env->ExceptionOccurred())\

@ -66,11 +66,11 @@ Java_nsk_stress_jni_JNIter001_jnistress (JNIEnv *env, jobject jobj, jstring jstr
env->MonitorEnter(jobj); CE env->MonitorEnter(jobj); CE
if (!allocs) { if (!allocs) {
element = (CHAR_ARRAY *)malloc(sizeof(CHAR_ARRAY)); element = (CHAR_ARRAY *)c_malloc(env, sizeof(CHAR_ARRAY));
element->str = (const char **)malloc(nstr*sizeof(const char *)); element->str = (const char **)c_malloc(env, nstr*sizeof(const char *));
element->checkstr = (char **)malloc(nstr*sizeof(char *)); element->checkstr = (char **)c_malloc(env, nstr*sizeof(char *));
for (j=0;j<nstr;j++) for (j=0;j<nstr;j++)
element->checkstr[j] = (char *)malloc(DIGESTLENGTH*sizeof(char)); element->checkstr[j] = (char *)c_malloc(env, DIGESTLENGTH*sizeof(char));
} }
for(j=0;j<DIGESTLENGTH;j++) { for(j=0;j<DIGESTLENGTH;j++) {
digest[j]=0; digest[j]=0;
@ -148,6 +148,7 @@ Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr
static long len=0; static long len=0;
static unsigned int equal=1; static unsigned int equal=1;
char *elem; char *elem;
int elem_len = -1;
const char *clsName = "nsk/stress/jni/JNIter001"; const char *clsName = "nsk/stress/jni/JNIter001";
const char *name="setpass"; const char *name="setpass";
@ -160,30 +161,32 @@ Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr
env->MonitorEnter(jobj); CE env->MonitorEnter(jobj); CE
if (!index) { if (!index) {
javachars = (JCHAR_ARRAY *)malloc(sizeof(JCHAR_ARRAY)); javachars = (JCHAR_ARRAY *)c_malloc(env, sizeof(JCHAR_ARRAY));
javachars->str = (const jchar **)malloc(nstr*sizeof(const jchar *)); javachars->str = (const jchar **)c_malloc(env, nstr*sizeof(const jchar *));
javachars->checkstr = (char **)malloc(nstr*sizeof(char *)); javachars->checkstr = (char **)c_malloc(env, nstr*sizeof(char *));
javachars->size = (int *)malloc(nstr*sizeof(int)); javachars->size = (int *)c_malloc(env, nstr*sizeof(int));
for (j=0;j<nstr;j++) for (j=0;j<nstr;j++)
javachars->checkstr[j] = (char *)malloc(DIGESTLENGTH*sizeof(char)); javachars->checkstr[j] = (char *)c_malloc(env, DIGESTLENGTH*sizeof(char));
} }
for(j=0;j<DIGESTLENGTH;j++) { for(j=0;j<DIGESTLENGTH;j++) {
digest[j]=0; digest[j]=0;
} }
javachars->str[index] = env->GetStringChars(jstr,0); CE javachars->str[index] = env->GetStringChars(jstr,0); CE
javachars->size[index] = env->GetStringUTFLength(jstr); CE javachars->size[index] = env->GetStringUTFLength(jstr); CE
len += javachars->size[index]; elem_len = javachars->size[index];
elem = (char*) malloc(javachars->size[index]*sizeof(char)); len += elem_len;
for (j=0; j < javachars->size[index]; j++) { elem = (char*) c_malloc(env, elem_len*sizeof(char));
for (j=0; j < elem_len; j++) {
elem[j] = (char) javachars->str[index][j]; elem[j] = (char) javachars->str[index][j];
} }
//memcpy(digest, elem, javachars->size[index]); //memcpy(digest, elem, javachars->size[index]);
for(j=0;j<javachars->size[index]; j++) { for(j=0;j<elem_len; j++) {
digest[j % DIGESTLENGTH]+=elem[j]; digest[j % DIGESTLENGTH]+=elem[j];
} }
memcpy(javachars->checkstr[index++],digest,DIGESTLENGTH); memcpy(javachars->checkstr[index++],digest,DIGESTLENGTH);
if (index%printperiod==0) { if (index%printperiod==0) {
printf("Check string sum for thread %s is ",elem); printf("Check string sum for thread %.*s is ", elem_len, elem);
for (j=0;j<DIGESTLENGTH;j++) for (j=0;j<DIGESTLENGTH;j++)
printf("%02x", digest[j]); printf("%02x", digest[j]);
printf("\n"); printf("\n");
@ -191,9 +194,9 @@ Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr
free(elem); free(elem);
if (index==nstr) { if (index==nstr) {
printf("JNI Unicode strings memory=%ld\n",len); printf("JNI Unicode strings memory=%ld\n",len);
tmpstr=env->NewString(javachars->str[index-1],javachars->size[index-1]); CE tmpstr=env->NewString(javachars->str[index-1],elem_len); CE
for (j=0; j<nstr; j++) { for (j=0; j<nstr; j++) {
elem = (char*) malloc(javachars->size[j]*sizeof(char)); elem = (char*) c_malloc(env, javachars->size[j]*sizeof(char));
for (i=0; i < javachars->size[j]; i++) { for (i=0; i < javachars->size[j]; i++) {
elem[i] = (char) javachars->str[j][i]; elem[i] = (char) javachars->str[j][i];
} }
@ -237,7 +240,7 @@ Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr
return(tmpstr); return(tmpstr);
} }
env->MonitorExit(jobj); CE env->MonitorExit(jobj); CE
return(env->NewString(javachars->str[index-1],javachars->size[index-1])); return(env->NewString(javachars->str[index-1],elem_len));
} }
} }