8067030: JDWP crash in transport_startTransport on OOM

Check for result of jvmtiAllocate

Reviewed-by: jbachorik, sspitsyn
This commit is contained in:
Dmitry Samersoff 2014-12-11 06:49:12 -08:00
parent cb8bd7875b
commit a36baa5d15

@ -66,8 +66,10 @@ printLastError(jdwpTransportEnv *t, jdwpTransportError err)
len = (int)strlen(msg); len = (int)strlen(msg);
maxlen = len+len/2+2; /* Should allow for plenty of room */ maxlen = len+len/2+2; /* Should allow for plenty of room */
utf8msg = (jbyte*)jvmtiAllocate(maxlen+1); utf8msg = (jbyte*)jvmtiAllocate(maxlen+1);
(void)utf8FromPlatform(msg, len, utf8msg, maxlen); if (utf8msg != NULL) {
utf8msg[maxlen] = 0; (void)utf8FromPlatform(msg, len, utf8msg, maxlen);
utf8msg[maxlen] = 0;
}
} }
if (rv == JDWPTRANSPORT_ERROR_NONE) { if (rv == JDWPTRANSPORT_ERROR_NONE) {
ERROR_MESSAGE(("transport error %d: %s",err, utf8msg)); ERROR_MESSAGE(("transport error %d: %s",err, utf8msg));
@ -391,6 +393,10 @@ launch(char *command, char *name, char *address)
/* Convert commandLine from UTF-8 to platform encoding */ /* Convert commandLine from UTF-8 to platform encoding */
len = (int)strlen(commandLine); len = (int)strlen(commandLine);
buf = jvmtiAllocate(len*3+3); buf = jvmtiAllocate(len*3+3);
if (buf == NULL) {
jvmtiDeallocate(commandLine);
return JDWP_ERROR(OUT_OF_MEMORY);
}
(void)utf8ToPlatform((jbyte*)commandLine, len, buf, len*3+3); (void)utf8ToPlatform((jbyte*)commandLine, len, buf, len*3+3);
/* Exec commandLine */ /* Exec commandLine */
@ -447,21 +453,23 @@ transport_startTransport(jboolean isServer, char *name, char *address,
if (info == NULL) { if (info == NULL) {
return JDWP_ERROR(OUT_OF_MEMORY); return JDWP_ERROR(OUT_OF_MEMORY);
} }
info->name = jvmtiAllocate((int)strlen(name)+1);
(void)strcpy(info->name, name);
info->address = NULL;
info->timeout = timeout; info->timeout = timeout;
info->name = jvmtiAllocate((int)strlen(name)+1);
if (info->name == NULL) { if (info->name == NULL) {
serror = JDWP_ERROR(OUT_OF_MEMORY); serror = JDWP_ERROR(OUT_OF_MEMORY);
goto handleError; goto handleError;
} }
(void)strcpy(info->name, name);
info->address = NULL;
if (address != NULL) { if (address != NULL) {
info->address = jvmtiAllocate((int)strlen(address)+1); info->address = jvmtiAllocate((int)strlen(address)+1);
(void)strcpy(info->address, address);
if (info->address == NULL) { if (info->address == NULL) {
serror = JDWP_ERROR(OUT_OF_MEMORY); serror = JDWP_ERROR(OUT_OF_MEMORY);
goto handleError; goto handleError;
} }
(void)strcpy(info->address, address);
} }
info->transport = trans; info->transport = trans;
@ -478,6 +486,10 @@ transport_startTransport(jboolean isServer, char *name, char *address,
*/ */
len = (int)strlen(name) + (int)strlen(retAddress) + 2; /* ':' and '\0' */ len = (int)strlen(name) + (int)strlen(retAddress) + 2; /* ':' and '\0' */
prop_value = (char*)jvmtiAllocate(len); prop_value = (char*)jvmtiAllocate(len);
if (prop_value == NULL) {
serror = JDWP_ERROR(OUT_OF_MEMORY);
goto handleError;
}
strcpy(prop_value, name); strcpy(prop_value, name);
strcat(prop_value, ":"); strcat(prop_value, ":");
strcat(prop_value, retAddress); strcat(prop_value, retAddress);