RFR 8240902: JDI shared memory connector can use already closed Handles

Patricio Chilano patricio.chilano.mateo at oracle.com
Wed Mar 18 22:02:00 UTC 2020


Hi Serguei,

On 3/18/20 6:03 PM, serguei.spitsyn at oracle.com wrote:
> Hi Patricio,
>
> Good finding, thank you for taking care about this!
> The fix looks good in general.
>
> There are several spots with the wrong indent (must be 4, not 2):
> 64 #define ENTER_CONNECTION(connection) do { \
> 65 InterlockedIncrement(&connection->refcount); \
> 66 if (IS_STATE_CLOSED(connection->state)) { \
> 67 setLastErrorMsg("stream closed"); \
> 68 InterlockedDecrement(&connection->refcount); \
> 69 return SYS_ERR; \
> 70 } \
> 71 } while (0)
> 72
> 73 #define LEAVE_CONNECTION(connection) do { \
> 74 InterlockedDecrement(&connection->refcount); \
> 75 } while (0)
>   I'd also suggest to move content left and use indent 4 from the side.
Done. I already aligned it the same way as STREAM_INVARIANT and I fixed 
the indent inside ENTER_CONNECTION().

> 414 if (*refcount == 0) {
> 415 sysEventClose(stream->hasData);
> 416 sysEventClose(stream->hasSpace);
>   417           sysIPMutexClose(stream->mutex);
> 418 break;
> 419 } ...
> 535 Stream * stream = &connection->outgoing;
> 536 if (stream->state == STATE_OPEN) {
> 537 (void)closeStream(stream, JNI_TRUE, &connection->refcount);
> 538 }
> 539 stream = &connection->incoming;
> 540 if (stream->state == STATE_OPEN) {
> 541 (void)closeStream(stream, JNI_FALSE, &connection->refcount);
> 542 } ...
> 551 if (connection->shutdown) {
> 552 sysEventClose(connection->shutdown);
> 553 }
> 554 } ... 1022 shmemBase_sendByte(SharedMemoryConnection *connection, 
> jbyte data)
> 1023 {
> 1024 ENTER_CONNECTION(connection);
> 1025 jint rc = shmemBase_sendByte_internal(connection, data);
> 1026 LEAVE_CONNECTION(connection);
> 1027 return rc;
> 1028 }
>   ...
>
> 1055 jint
> 1056 shmemBase_receiveByte(SharedMemoryConnection *connection, jbyte 
> *data)
> 1057 {
> 1058 ENTER_CONNECTION(connection);
> 1059 jint rc = shmemBase_receiveByte_internal(connection, data);
> 1060 LEAVE_CONNECTION(connection);
> 1061 return rc;
> 1062 } ...
> 1136 jint
> 1137 shmemBase_sendPacket(SharedMemoryConnection *connection, const 
> jdwpPacket *packet)
> 1138 {
> 1139 ENTER_CONNECTION(connection);
> 1140 jint rc = shmemBase_sendPacket_internal(connection, packet);
> 1141 LEAVE_CONNECTION(connection);
> 1142 return rc;
> 1143 }
> ...
> 1229 jint
> 1230 shmemBase_receivePacket(SharedMemoryConnection *connection, 
> jdwpPacket *packet)
> 1231 {
> 1232 ENTER_CONNECTION(connection);
> 1233 jint rc = shmemBase_receivePacket_internal(connection, packet);
> 1234 LEAVE_CONNECTION(connection);
> 1235 return rc;
> 1236 }
Done. Fix all those.

> Some other nits were already commented by David and Dan.
>
> I'd suggest to test with tier-5 as well for more safety.
Thanks for looking at this Serguei! I'll give it a new run in mach5 and 
add tier5.


Thanks,
Patricio
> Thanks,
> Serguei
>
>
> On 3/17/20 13:14, Patricio Chilano wrote:
>> Hi all,
>>
>> Please review the following patch:
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8240902
>> Webrev: http://cr.openjdk.java.net/~pchilanomate/8240902/v1/webrev/
>>
>> Calling closeConnection() on an already created/opened connection 
>> includes calls to CloseHandle() on objects that can still be used by 
>> other threads. This can lead to either undefined behavior or, as 
>> detailed in the bug comments, changes of state of unrelated objects. 
>> This issue was found while debugging the reason behind some jshell 
>> test failures seen after pushing 8230594. Not as important, but there 
>> are also calls to closeStream() from createStream()/openStream() when 
>> failing to create/open a stream that will return after executing 
>> "CHECK_ERROR(enterMutex(stream, NULL));" without closing the intended 
>> resources. Then, calling closeConnection() could assert if the reason 
>> of the previous failure was that the stream's mutex failed to be 
>> created/opened. These patch aims to address these issues too.
>>
>> Tested in mach5 with the current baseline, tiers1-3 and several runs 
>> of open/test/langtools/:tier1 which includes the jshell tests where 
>> this connector is used. I also applied patch 
>> http://cr.openjdk.java.net/~pchilanomate/8240902/triggerbug/webrev 
>> mentioned in the comments of the bug, on top of the baseline and run 
>> the langtool tests with and without this fix. Without the fix running 
>> around 30 repetitions already shows failures in tests 
>> jdk/jshell/FailOverExecutionControlTest.java and 
>> jdk/jshell/FailOverExecutionControlHangingLaunchTest.java. With the 
>> fix I run several hundred runs and saw no failures. Let me know if 
>> there is any additional testing I should do.
>>
>> As a side note, I see there are a couple of open issues related with 
>> jshell failures (8209848) which could be related to this bug and 
>> therefore might be fixed by this patch.
>>
>> Thanks,
>> Patricio
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20200318/28289c43/attachment-0001.htm>


More information about the serviceability-dev mailing list