Author: schultz Date: Wed Aug 28 14:52:00 2013 New Revision: 1518225 URL: http://svn.apache.org/r1518225 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51813
Add NULL-checking for s->net to avoid SIGSEGV in situations where it appears a socket has been recycled. Modified: tomcat/native/branches/1.1.x/native/src/network.c Modified: tomcat/native/branches/1.1.x/native/src/network.c URL: http://svn.apache.org/viewvc/tomcat/native/branches/1.1.x/native/src/network.c?rev=1518225&r1=1518224&r2=1518225&view=diff ============================================================================== --- tomcat/native/branches/1.1.x/native/src/network.c (original) +++ tomcat/native/branches/1.1.x/native/src/network.c Wed Aug 28 14:52:00 2013 @@ -439,6 +439,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, send)(T return -(jint)APR_ENOTSOCK; } TCN_ASSERT(s->opaque != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } #ifdef TCN_DO_STATISTICS sp_max_send = TCN_MAX(sp_max_send, nbytes); sp_min_send = TCN_MIN(sp_min_send, nbytes); @@ -515,6 +519,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, sendb)( } TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(buf != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } #ifdef TCN_DO_STATISTICS sp_max_send = TCN_MAX(sp_max_send, nbytes); sp_min_send = TCN_MIN(sp_min_send, nbytes); @@ -555,6 +563,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, sendib) } TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(buf != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } #ifdef TCN_DO_STATISTICS sp_max_send = TCN_MAX(sp_max_send, nbytes); sp_min_send = TCN_MIN(sp_min_send, nbytes); @@ -589,6 +601,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, sendbb) } TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(s->jsbbuff != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } #ifdef TCN_DO_STATISTICS sp_max_send = TCN_MAX(sp_max_send, nbytes); sp_min_send = TCN_MIN(sp_min_send, nbytes); @@ -625,6 +641,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, sendibb } TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(s->jsbbuff != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } #ifdef TCN_DO_STATISTICS sp_max_send = TCN_MAX(sp_max_send, nbytes); sp_min_send = TCN_MIN(sp_min_send, nbytes); @@ -656,6 +676,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, sendv)( UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_ASSERT(s->opaque != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } nvec = (*e)->GetArrayLength(e, bufs); if (nvec >= APR_MAX_IOVEC_SIZE) @@ -726,6 +750,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, recv)(T UNREFERENCED(o); TCN_ASSERT(sock != 0); TCN_ASSERT(s->opaque != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } if (toread <= TCN_BUFFER_SZ) { char sb[TCN_BUFFER_SZ]; @@ -783,6 +811,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, recvt)( TCN_ASSERT(sock != 0); TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(buf != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } if ((ss = (*s->net->timeout_get)(s->opaque, &pt)) != APR_SUCCESS) { TCN_ERROR_WRAP(ss); @@ -855,6 +887,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, recvb)( } TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(buf != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); TCN_ASSERT(bytes != NULL); @@ -903,6 +939,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, recvbb) TCN_ASSERT(sock != 0); TCN_ASSERT(s->opaque != NULL); TCN_ASSERT(s->jrbbuff != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } ss = (*s->net->recv)(s->opaque, s->jrbbuff + offset, &nbytes); #ifdef TCN_DO_STATISTICS @@ -954,6 +994,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, recvbt) } TCN_ASSERT(buf != NULL); TCN_ASSERT(s->opaque != NULL); + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } bytes = (char *)(*e)->GetDirectBufferAddress(e, buf); TCN_ASSERT(bytes != NULL); @@ -1023,7 +1067,10 @@ TCN_IMPLEMENT_CALL(jint, Socket, recvbbt } TCN_ASSERT(s->jrbbuff != NULL); TCN_ASSERT(s->opaque != NULL); - + if(!s->net) { + tcn_ThrowAPRException(e, APR_EINVALSOCK); + return -(jint)APR_EINVALSOCK; + } if ((ss = (*s->net->timeout_get)(s->opaque, &pt)) != APR_SUCCESS) { TCN_ERROR_WRAP(ss); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org