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: [email protected]
For additional commands, e-mail: [email protected]