191 utfSource = getUTF(env, source, sourceBuf, sizeof(sourceBuf)); 192 if (utfSource == NULL) { 193 JNU_ThrowOutOfMemoryError(env, NULL); 194 goto free_utfName; 195 } 196 } else { 197 utfSource = NULL; 198 } 199 result = JVM_DefineClassWithSource(env, utfName, loader, body, length, pd, utfSource); 200 201 if (utfSource && utfSource != sourceBuf) 202 free(utfSource); 203 204 free_utfName: 205 if (utfName && utfName != buf) 206 free(utfName); 207 208 return result; 209 } 210 211 /* 212 * Returns NULL if class not found. 213 */ 214 JNIEXPORT jclass JNICALL 215 Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader, 216 jstring classname) 217 { 218 char *clname; 219 jclass cls = 0; 220 char buf[128]; 221 222 if (classname == NULL) { 223 return 0; 224 } 225 226 clname = getUTF(env, classname, buf, sizeof(buf)); 227 if (clname == NULL) { 228 JNU_ThrowOutOfMemoryError(env, NULL); 229 return NULL; 230 } | 191 utfSource = getUTF(env, source, sourceBuf, sizeof(sourceBuf)); 192 if (utfSource == NULL) { 193 JNU_ThrowOutOfMemoryError(env, NULL); 194 goto free_utfName; 195 } 196 } else { 197 utfSource = NULL; 198 } 199 result = JVM_DefineClassWithSource(env, utfName, loader, body, length, pd, utfSource); 200 201 if (utfSource && utfSource != sourceBuf) 202 free(utfSource); 203 204 free_utfName: 205 if (utfName && utfName != buf) 206 free(utfName); 207 208 return result; 209 } 210 211 JNIEXPORT jclass JNICALL 212 Java_java_lang_ClassLoader_defineClass0(JNIEnv *env, 213 jclass cls, 214 jobject loader, 215 jclass lookup, 216 jstring name, 217 jbyteArray data, 218 jint offset, 219 jint length, 220 jobject pd, 221 jboolean initialize, 222 jint flags, 223 jobject classData) 224 { 225 jbyte *body; 226 char *utfName; 227 jclass result = 0; 228 char buf[128]; 229 230 if (data == NULL) { 231 JNU_ThrowNullPointerException(env, 0); 232 return 0; 233 } 234 235 /* Work around 4153825. malloc crashes on Solaris when passed a 236 * negative size. 237 */ 238 if (length < 0) { 239 JNU_ThrowArrayIndexOutOfBoundsException(env, 0); 240 return 0; 241 } 242 243 body = (jbyte *)malloc(length); 244 if (body == 0) { 245 JNU_ThrowOutOfMemoryError(env, 0); 246 return 0; 247 } 248 249 (*env)->GetByteArrayRegion(env, data, offset, length, body); 250 251 if ((*env)->ExceptionOccurred(env)) 252 goto free_body; 253 254 if (name != NULL) { 255 utfName = getUTF(env, name, buf, sizeof(buf)); 256 if (utfName == NULL) { 257 goto free_body; 258 } 259 fixClassname(utfName); 260 } else { 261 utfName = NULL; 262 } 263 264 return JVM_LookupDefineClass(env, lookup, utfName, loader, body, length, pd, initialize, flags, classData); 265 266 free_body: 267 free(body); 268 return result; 269 } 270 271 /* 272 * Returns NULL if class not found. 273 */ 274 JNIEXPORT jclass JNICALL 275 Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader, 276 jstring classname) 277 { 278 char *clname; 279 jclass cls = 0; 280 char buf[128]; 281 282 if (classname == NULL) { 283 return 0; 284 } 285 286 clname = getUTF(env, classname, buf, sizeof(buf)); 287 if (clname == NULL) { 288 JNU_ThrowOutOfMemoryError(env, NULL); 289 return NULL; 290 } |