48 static const jint magicNumber = 0x12345678;
49
50 /* ========================================================================== */
51
52 /** callback functions **/
53
54 static void JNICALL
55 ClassFileLoadHook(jvmtiEnv *jvmti_env, JNIEnv *jni_env,
56 jclass class_being_redefined, jobject loader,
57 const char* name, jobject protection_domain,
58 jint class_data_len, const unsigned char* class_data,
59 jint *new_class_data_len, unsigned char** new_class_data) {
60 jint i;
61
62 if (name != NULL && (strcmp(name, CLASS_NAME) == 0)) {
63 ClassFileLoadHookEventFlag = NSK_TRUE;
64 NSK_DISPLAY0("ClassFileLoadHook event\n");
65
66 if (class_being_redefined == NULL) {
67 /* sent by class load */
68 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB3(Allocate,
69 jvmti_env, class_data_len, &klass_bytes)))
70 nsk_jvmti_setFailStatus();
71 else {
72 memcpy(klass_bytes, class_data, class_data_len);
73 klass_byte_count = class_data_len;
74 for (i = 0; i < klass_byte_count - 3; i++) {
75 if (((jint)klass_bytes[i+3] |
76 ((jint)klass_bytes[i+2] << 8) |
77 ((jint)klass_bytes[i+1] << 16) |
78 ((jint)klass_bytes[i] << 24)) == magicNumber) {
79 magicIndex = i;
80 break;
81 }
82 }
83 if (klass_byte_count == 0) {
84 NSK_COMPLAIN0("Cannot find magic number\n");
85 nsk_jvmti_setFailStatus();
86 }
87 }
88 }
89 }
90 }
91
92 /* ========================================================================== */
93
94 static int prepare(jvmtiEnv* jvmti, JNIEnv* jni) {
95
96 NSK_DISPLAY1("Find class: %s\n", CLASS_NAME);
97 if (!NSK_JNI_VERIFY(jni, (testedClass =
98 NSK_CPP_STUB2(FindClass, jni, CLASS_NAME)) != NULL))
99 return NSK_FALSE;
100
101 if (!NSK_JNI_VERIFY(jni, (testedClass = (jclass)
102 NSK_CPP_STUB2(NewGlobalRef, jni, testedClass)) != NULL))
103 return NSK_FALSE;
104
105 return NSK_TRUE;
106 }
107
108 /* ========================================================================== */
109
110 static int redefine(jvmtiEnv* jvmti, jint value) {
111 jvmtiClassDefinition class_def;
112
113 if (!NSK_VERIFY(klass_byte_count != 0 && klass_bytes != NULL))
114 return NSK_FALSE;
115
116 if (!NSK_VERIFY(magicIndex != 0))
117 return NSK_FALSE;
118
119 NSK_DISPLAY1("Redefining with %d\n", value);
120
121 klass_bytes[magicIndex] = 0;
122 klass_bytes[magicIndex+1] = 0;
123 klass_bytes[magicIndex+2] = 0;
124 klass_bytes[magicIndex+3] = (jbyte)value;
125
126 class_def.klass = testedClass;
127 class_def.class_byte_count = klass_byte_count;
128 class_def.class_bytes = klass_bytes;
129 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB3(RedefineClasses, jvmti, 1, &class_def)))
130 return NSK_FALSE;
131
132 return NSK_TRUE;
133 }
134
135 /* ========================================================================== */
136
137 /** Agent algorithm. */
138 static void JNICALL
139 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
140
141 if (!nsk_jvmti_waitForSync(timeout))
142 return;
143
144 if (!NSK_VERIFY(ClassFileLoadHookEventFlag)) {
145 NSK_COMPLAIN0("Missing initial ClassFileLoadHook event\n");
146 nsk_jvmti_setFailStatus();
147 return;
148 }
149
164 return;
165
166 if (!NSK_VERIFY(ClassFileLoadHookEventFlag)) {
167 NSK_COMPLAIN0("Missing ClassFileLoadHook event #1\n");
168 nsk_jvmti_setFailStatus();
169 }
170
171 ClassFileLoadHookEventFlag = NSK_FALSE;
172
173 /* resume debugee and wait for sync */
174 if (!nsk_jvmti_resumeSync())
175 return;
176 if (!nsk_jvmti_waitForSync(timeout))
177 return;
178
179 if (!NSK_VERIFY(ClassFileLoadHookEventFlag)) {
180 NSK_COMPLAIN0("Missing ClassFileLoadHook event #3\n");
181 nsk_jvmti_setFailStatus();
182 }
183
184 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB4(SetEventNotificationMode,
185 jvmti, JVMTI_DISABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)))
186 nsk_jvmti_setFailStatus();
187
188 NSK_TRACE(NSK_CPP_STUB2(DeleteGlobalRef, jni, testedClass));
189
190 if (!nsk_jvmti_resumeSync())
191 return;
192 }
193
194 /* ========================================================================== */
195
196 /** Agent library initialization. */
197 #ifdef STATIC_BUILD
198 JNIEXPORT jint JNICALL Agent_OnLoad_ma06t001(JavaVM *jvm, char *options, void *reserved) {
199 return Agent_Initialize(jvm, options, reserved);
200 }
201 JNIEXPORT jint JNICALL Agent_OnAttach_ma06t001(JavaVM *jvm, char *options, void *reserved) {
202 return Agent_Initialize(jvm, options, reserved);
203 }
204 JNIEXPORT jint JNI_OnLoad_ma06t001(JavaVM *jvm, char *options, void *reserved) {
205 return JNI_VERSION_1_8;
206 }
207 #endif
208 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
209 jvmtiEnv* jvmti = NULL;
210 jvmtiEventCallbacks callbacks;
211 jvmtiCapabilities caps;
212
213 NSK_DISPLAY0("Agent_OnLoad\n");
214
215 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
216 return JNI_ERR;
217
218 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
219
220 if (!NSK_VERIFY((jvmti =
221 nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
222 return JNI_ERR;
223
224 memset(&caps, 0, sizeof(caps));
225 caps.can_redefine_classes = 1;
226 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB2(AddCapabilities, jvmti, &caps)))
227 return JNI_ERR;
228
229 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
230 return JNI_ERR;
231
232 memset(&callbacks, 0, sizeof(callbacks));
233 callbacks.ClassFileLoadHook = &ClassFileLoadHook;
234 if (!NSK_VERIFY(nsk_jvmti_init_MA(&callbacks)))
235 return JNI_ERR;
236
237 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB4(SetEventNotificationMode,
238 jvmti, JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)))
239 return JNI_ERR;
240
241 return JNI_OK;
242 }
243
244 /* ========================================================================== */
245
246 }
|
48 static const jint magicNumber = 0x12345678;
49
50 /* ========================================================================== */
51
52 /** callback functions **/
53
54 static void JNICALL
55 ClassFileLoadHook(jvmtiEnv *jvmti_env, JNIEnv *jni_env,
56 jclass class_being_redefined, jobject loader,
57 const char* name, jobject protection_domain,
58 jint class_data_len, const unsigned char* class_data,
59 jint *new_class_data_len, unsigned char** new_class_data) {
60 jint i;
61
62 if (name != NULL && (strcmp(name, CLASS_NAME) == 0)) {
63 ClassFileLoadHookEventFlag = NSK_TRUE;
64 NSK_DISPLAY0("ClassFileLoadHook event\n");
65
66 if (class_being_redefined == NULL) {
67 /* sent by class load */
68 if (!NSK_JVMTI_VERIFY(jvmti_env->Allocate(class_data_len, &klass_bytes)))
69 nsk_jvmti_setFailStatus();
70 else {
71 memcpy(klass_bytes, class_data, class_data_len);
72 klass_byte_count = class_data_len;
73 for (i = 0; i < klass_byte_count - 3; i++) {
74 if (((jint)klass_bytes[i+3] |
75 ((jint)klass_bytes[i+2] << 8) |
76 ((jint)klass_bytes[i+1] << 16) |
77 ((jint)klass_bytes[i] << 24)) == magicNumber) {
78 magicIndex = i;
79 break;
80 }
81 }
82 if (klass_byte_count == 0) {
83 NSK_COMPLAIN0("Cannot find magic number\n");
84 nsk_jvmti_setFailStatus();
85 }
86 }
87 }
88 }
89 }
90
91 /* ========================================================================== */
92
93 static int prepare(jvmtiEnv* jvmti, JNIEnv* jni) {
94
95 NSK_DISPLAY1("Find class: %s\n", CLASS_NAME);
96 if (!NSK_JNI_VERIFY(jni, (testedClass = jni->FindClass(CLASS_NAME)) != NULL))
97 return NSK_FALSE;
98
99 if (!NSK_JNI_VERIFY(jni, (testedClass = (jclass) jni->NewGlobalRef(testedClass)) != NULL))
100 return NSK_FALSE;
101
102 return NSK_TRUE;
103 }
104
105 /* ========================================================================== */
106
107 static int redefine(jvmtiEnv* jvmti, jint value) {
108 jvmtiClassDefinition class_def;
109
110 if (!NSK_VERIFY(klass_byte_count != 0 && klass_bytes != NULL))
111 return NSK_FALSE;
112
113 if (!NSK_VERIFY(magicIndex != 0))
114 return NSK_FALSE;
115
116 NSK_DISPLAY1("Redefining with %d\n", value);
117
118 klass_bytes[magicIndex] = 0;
119 klass_bytes[magicIndex+1] = 0;
120 klass_bytes[magicIndex+2] = 0;
121 klass_bytes[magicIndex+3] = (jbyte)value;
122
123 class_def.klass = testedClass;
124 class_def.class_byte_count = klass_byte_count;
125 class_def.class_bytes = klass_bytes;
126 if (!NSK_JVMTI_VERIFY(jvmti->RedefineClasses(1, &class_def)))
127 return NSK_FALSE;
128
129 return NSK_TRUE;
130 }
131
132 /* ========================================================================== */
133
134 /** Agent algorithm. */
135 static void JNICALL
136 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
137
138 if (!nsk_jvmti_waitForSync(timeout))
139 return;
140
141 if (!NSK_VERIFY(ClassFileLoadHookEventFlag)) {
142 NSK_COMPLAIN0("Missing initial ClassFileLoadHook event\n");
143 nsk_jvmti_setFailStatus();
144 return;
145 }
146
161 return;
162
163 if (!NSK_VERIFY(ClassFileLoadHookEventFlag)) {
164 NSK_COMPLAIN0("Missing ClassFileLoadHook event #1\n");
165 nsk_jvmti_setFailStatus();
166 }
167
168 ClassFileLoadHookEventFlag = NSK_FALSE;
169
170 /* resume debugee and wait for sync */
171 if (!nsk_jvmti_resumeSync())
172 return;
173 if (!nsk_jvmti_waitForSync(timeout))
174 return;
175
176 if (!NSK_VERIFY(ClassFileLoadHookEventFlag)) {
177 NSK_COMPLAIN0("Missing ClassFileLoadHook event #3\n");
178 nsk_jvmti_setFailStatus();
179 }
180
181 if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)))
182 nsk_jvmti_setFailStatus();
183
184 NSK_TRACE(jni->DeleteGlobalRef(testedClass));
185
186 if (!nsk_jvmti_resumeSync())
187 return;
188 }
189
190 /* ========================================================================== */
191
192 /** Agent library initialization. */
193 #ifdef STATIC_BUILD
194 JNIEXPORT jint JNICALL Agent_OnLoad_ma06t001(JavaVM *jvm, char *options, void *reserved) {
195 return Agent_Initialize(jvm, options, reserved);
196 }
197 JNIEXPORT jint JNICALL Agent_OnAttach_ma06t001(JavaVM *jvm, char *options, void *reserved) {
198 return Agent_Initialize(jvm, options, reserved);
199 }
200 JNIEXPORT jint JNI_OnLoad_ma06t001(JavaVM *jvm, char *options, void *reserved) {
201 return JNI_VERSION_1_8;
202 }
203 #endif
204 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
205 jvmtiEnv* jvmti = NULL;
206 jvmtiEventCallbacks callbacks;
207 jvmtiCapabilities caps;
208
209 NSK_DISPLAY0("Agent_OnLoad\n");
210
211 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
212 return JNI_ERR;
213
214 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
215
216 if (!NSK_VERIFY((jvmti =
217 nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
218 return JNI_ERR;
219
220 memset(&caps, 0, sizeof(caps));
221 caps.can_redefine_classes = 1;
222 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps)))
223 return JNI_ERR;
224
225 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
226 return JNI_ERR;
227
228 memset(&callbacks, 0, sizeof(callbacks));
229 callbacks.ClassFileLoadHook = &ClassFileLoadHook;
230 if (!NSK_VERIFY(nsk_jvmti_init_MA(&callbacks)))
231 return JNI_ERR;
232
233 if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)))
234 return JNI_ERR;
235
236 return JNI_OK;
237 }
238
239 /* ========================================================================== */
240
241 }
|