Crash problem in net.dll
Jonathan Lu
luchsh at linux.vnet.ibm.com
Mon Aug 29 02:20:15 PDT 2011
Hi Michael,
Thanks for reminding, I checked the source under src/windows folder and
found two more places to change.
Here's the updated patch:
diff -r 9b8c96f96a0f src/windows/native/java/net/NetworkInterface.c
--- a/src/windows/native/java/net/NetworkInterface.c Mon Jun 27
13:21:34 2011 -0700
+++ b/src/windows/native/java/net/NetworkInterface.c Mon Aug 29
17:02:56 2011 +0800
@@ -504,8 +504,7 @@
*/
if (netaddrCount < 0) {
netaddrCount = enumAddresses_win(env, ifs, &netaddrP);
- if ((*env)->ExceptionOccurred(env)) {
- free_netaddr(netaddrP);
+ if (netaddrCount == -1) {
return NULL;
}
}
diff -r 9b8c96f96a0f src/windows/native/java/net/NetworkInterface_winXP.c
--- a/src/windows/native/java/net/NetworkInterface_winXP.c Mon Jun 27
13:21:34 2011 -0700
+++ b/src/windows/native/java/net/NetworkInterface_winXP.c Mon Aug 29
17:02:56 2011 +0800
@@ -194,8 +194,7 @@
while (curr != NULL) {
netaddr *netaddrP;
ret = enumAddresses_win(env, curr, &netaddrP);
- if ((*env)->ExceptionOccurred(env)) {
- free_netaddr(netaddrP);
+ if (ret == -1) {
return -1;
}
curr->addrs = netaddrP;
@@ -449,8 +448,7 @@
*/
if (netaddrCount < 0) {
netaddrCount = enumAddresses_win(env, ifs, &netaddrP);
- if ((*env)->ExceptionOccurred(env)) {
- free_netaddr(netaddrP);
+ if (count == -1) {
return NULL;
}
}
And from my point of view, such scenario may also appear in other parts,
maybe a more thorough check is needed for all modules.
Regards!
- Jonathan Lu
On 08/29/2011 04:40 PM, Michael McMahon wrote:
> Jonathan,
>
> I think the change looks reasonable. But, we should make the equivalent
> change at the other site where enumAddresses_win() is called in the
> same file.
>
> - Michael.
>
> On 29/08/11 09:14, Jonathan Lu wrote:
>> Hello everybody,
>>
>> I got one crash issue on OpenJDK7 windows build.
>>
>> I captured the stack trace of such a crash, which happens
>> intermittently on my 64bit Windows 2008 server. But unfortunately I
>> have no simple test case to reproduce this problem.
>>
>> RtlInterlockedFlushSList+0x2ea (0x779F2A7F [ntdll+0x32a7f])
>> RtlInterlockedFlushSList+0x572 (0x779F2D07 [ntdll+0x32d07])
>> RtlInterlockedFlushSList+0x45d (0x779F2BF2 [ntdll+0x32bf2])
>> HeapFree+0x14 (0x755A14D1 [kernel32+0x114d1])
>> free+0x1c (0x7284016A [msvcr100+0x1016a])
>> free_netaddr+0x11 (networkinterface.c:107, 0x725A12AC [net+0x12ac])
>> getAllInterfacesAndAddresses+0xb6 (networkinterface_winxp.c:199,
>> 0x725AB4C8 [net+0xb4c8])
>> Java_java_net_NetworkInterface_getAll_XP+0x12
>> (networkinterface_winxp.c:693, 0x725AB7AB [net+0xb7ab])
>>
>> From the code at
>> src/windows/native/java/net/NetworkInterface_winXP.c:195, I believe
>> it is the dangling pointers that caused this problem. The
>> uninitialized pointer netaddrP is exceptionally freed if the call to
>> Windows API "GetIpAddrTable()" fails.
>>
>> So here's one proposed solution for this issue, can anybody please
>> help to take a look?
>>
>> diff -r 9b8c96f96a0f
>> src/windows/native/java/net/NetworkInterface_winXP.c
>> --- a/src/windows/native/java/net/NetworkInterface_winXP.c Mon Jun
>> 27 13:21:34 2011 -0700
>> +++ b/src/windows/native/java/net/NetworkInterface_winXP.c Mon Aug
>> 29 14:59:09 2011 +0800
>> @@ -194,8 +194,7 @@
>> while (curr != NULL) {
>> netaddr *netaddrP;
>> ret = enumAddresses_win(env, curr, &netaddrP);
>> - if ((*env)->ExceptionOccurred(env)) {
>> - free_netaddr(netaddrP);
>> + if (ret == -1) {
>> return -1;
>> }
>> curr->addrs = netaddrP;
>>
>> Best regards!
>>
>>
>> Jonathan Lu
>>
>
More information about the net-dev
mailing list