Skip to content

Commit 06e9f96

Browse files
committed
8210242: [TESTBUG] 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. Backport-of: 3837f1a
1 parent dcc010d commit 06e9f96

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

test/hotspot/jtreg/vmTestbase/nsk/stress/jni/jnihelper.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@
2121
* questions.
2222
*/
2323

24+
#include <stdlib.h>
25+
26+
// checked malloc to trap OOM conditions
27+
static void* c_malloc(JNIEnv* env, size_t size) {
28+
void* ret = malloc(size);
29+
if (ret == NULL)
30+
env->FatalError("malloc failed");
31+
return ret;
32+
}
33+
2434
// Asserts every exception as fatal one
2535
#define CE {\
2636
if (env->ExceptionOccurred())\

test/hotspot/jtreg/vmTestbase/nsk/stress/jni/libjnistress001.cpp

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ Java_nsk_stress_jni_JNIter001_jnistress (JNIEnv *env, jobject jobj, jstring jstr
6868

6969
env->MonitorEnter(jobj); CE
7070
if (!allocs) {
71-
element = (CHAR_ARRAY *)malloc(sizeof(CHAR_ARRAY));
72-
element->str = (const char **)malloc(nstr*sizeof(const char *));
73-
element->checkstr = (char **)malloc(nstr*sizeof(char *));
71+
element = (CHAR_ARRAY *)c_malloc(env, sizeof(CHAR_ARRAY));
72+
element->str = (const char **)c_malloc(env, nstr*sizeof(const char *));
73+
element->checkstr = (char **)c_malloc(env, nstr*sizeof(char *));
7474
for (j=0;j<nstr;j++)
75-
element->checkstr[j] = (char *)malloc(DIGESTLENGTH*sizeof(char));
75+
element->checkstr[j] = (char *)c_malloc(env, DIGESTLENGTH*sizeof(char));
7676
}
7777
for(j=0;j<DIGESTLENGTH;j++) {
7878
digest[j]=0;
@@ -150,6 +150,7 @@ Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr
150150
static long len=0;
151151
static unsigned int equal=1;
152152
char *elem;
153+
int elem_len = -1;
153154

154155
const char *clsName = "nsk/stress/jni/JNIter001";
155156
const char *name="setpass";
@@ -162,40 +163,42 @@ Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr
162163

163164
env->MonitorEnter(jobj); CE
164165
if (!index) {
165-
javachars = (JCHAR_ARRAY *)malloc(sizeof(JCHAR_ARRAY));
166-
javachars->str = (const jchar **)malloc(nstr*sizeof(const jchar *));
167-
javachars->checkstr = (char **)malloc(nstr*sizeof(char *));
168-
javachars->size = (int *)malloc(nstr*sizeof(int));
166+
javachars = (JCHAR_ARRAY *)c_malloc(env, sizeof(JCHAR_ARRAY));
167+
javachars->str = (const jchar **)c_malloc(env, nstr*sizeof(const jchar *));
168+
javachars->checkstr = (char **)c_malloc(env, nstr*sizeof(char *));
169+
javachars->size = (int *)c_malloc(env, nstr*sizeof(int));
169170
for (j=0;j<nstr;j++)
170-
javachars->checkstr[j] = (char *)malloc(DIGESTLENGTH*sizeof(char));
171+
javachars->checkstr[j] = (char *)c_malloc(env, DIGESTLENGTH*sizeof(char));
171172
}
172173
for(j=0;j<DIGESTLENGTH;j++) {
173174
digest[j]=0;
174175
}
175176
javachars->str[index] = env->GetStringChars(jstr,0); CE
176177
javachars->size[index] = env->GetStringUTFLength(jstr); CE
177-
len += javachars->size[index];
178-
elem = (char*) malloc(javachars->size[index]*sizeof(char));
179-
for (j=0; j < javachars->size[index]; j++) {
178+
elem_len = javachars->size[index];
179+
len += elem_len;
180+
elem = (char*) c_malloc(env, elem_len*sizeof(char));
181+
for (j=0; j < elem_len; j++) {
180182
elem[j] = (char) javachars->str[index][j];
181183
}
184+
182185
//memcpy(digest, elem, javachars->size[index]);
183-
for(j=0;j<javachars->size[index]; j++) {
186+
for(j=0;j<elem_len; j++) {
184187
digest[j % DIGESTLENGTH]+=elem[j];
185188
}
186189
memcpy(javachars->checkstr[index++],digest,DIGESTLENGTH);
187190
if (index%printperiod==0) {
188-
printf("Check string sum for thread %s is ",elem);
191+
printf("Check string sum for thread %.*s is ", elem_len, elem);
189192
for (j=0;j<DIGESTLENGTH;j++)
190193
printf("%02x", digest[j]);
191194
printf("\n");
192195
}
193196
free(elem);
194197
if (index==nstr) {
195198
printf("JNI Unicode strings memory=%ld\n",len);
196-
tmpstr=env->NewString(javachars->str[index-1],javachars->size[index-1]); CE
199+
tmpstr=env->NewString(javachars->str[index-1],elem_len); CE
197200
for (j=0; j<nstr; j++) {
198-
elem = (char*) malloc(javachars->size[j]*sizeof(char));
201+
elem = (char*) c_malloc(env, javachars->size[j]*sizeof(char));
199202
for (i=0; i < javachars->size[j]; i++) {
200203
elem[i] = (char) javachars->str[j][i];
201204
}
@@ -239,7 +242,7 @@ Java_nsk_stress_jni_JNIter001_jnistress1(JNIEnv *env, jobject jobj, jstring jstr
239242
return(tmpstr);
240243
}
241244
env->MonitorExit(jobj); CE
242-
return(env->NewString(javachars->str[index-1],javachars->size[index-1]));
245+
return(env->NewString(javachars->str[index-1],elem_len));
243246
}
244247

245248
#ifdef __cplusplus

0 commit comments

Comments
 (0)