1
0
Fork 0

prevent endless connection attempts by arangosh

This commit is contained in:
Jan Steemann 2014-07-02 15:18:24 +02:00
parent 804099aa1a
commit 98a0ef0ded
5 changed files with 44 additions and 21 deletions

View File

@ -93,7 +93,7 @@ int TRI_closesocket (TRI_socket_t s) {
if (s.fileDescriptor != TRI_INVALID_SOCKET) { if (s.fileDescriptor != TRI_INVALID_SOCKET) {
res = close(s.fileDescriptor); res = close(s.fileDescriptor);
} }
#endif #endif
return res; return res;
} }

View File

@ -230,20 +230,20 @@ namespace triagens {
LOG_DEBUG("trying to establish secure connection"); LOG_DEBUG("trying to establish secure connection");
// convert in a SSL BIO structure // convert in a SSL BIO structure
BIO * sbio = BIO_new_socket((int) TRI_get_fd_or_handle_of_socket(socket), BIO_NOCLOSE); BIO* sbio = BIO_new_socket((int) TRI_get_fd_or_handle_of_socket(socket), BIO_NOCLOSE);
if (sbio == 0) { if (sbio == nullptr) {
LOG_WARNING("cannot build new SSL BIO: %s", triagens::basics::lastSSLError().c_str()); LOG_WARNING("cannot build new SSL BIO: %s", triagens::basics::lastSSLError().c_str());
TRI_CLOSE_SOCKET(socket); TRI_CLOSE_SOCKET(socket);
return; return;
} }
// build a new connection // build a new connection
SSL * ssl = SSL_new(ctx); SSL* ssl = SSL_new(ctx);
info.sslContext = ssl; info.sslContext = ssl;
if (ssl == 0) { if (ssl == nullptr) {
BIO_free_all(sbio); BIO_free_all(sbio);
LOG_WARNING("cannot build new SSL connection: %s", triagens::basics::lastSSLError().c_str()); LOG_WARNING("cannot build new SSL connection: %s", triagens::basics::lastSSLError().c_str());
TRI_CLOSE_SOCKET(socket); TRI_CLOSE_SOCKET(socket);
@ -290,7 +290,7 @@ namespace triagens {
/// @brief verification callback /// @brief verification callback
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int (*verificationCallback)(int, X509_STORE_CTX *); int (*verificationCallback)(int, X509_STORE_CTX*);
}; };
} }
} }

View File

@ -109,7 +109,7 @@ bool ListenTask::setup (Scheduler* scheduler, EventLoop loop) {
// .......................................................................... // ..........................................................................
LOG_TRACE("attempting to convert socket handle to socket descriptor"); LOG_TRACE("attempting to convert socket handle to socket descriptor");
if (!TRI_isvalidsocket(_listenSocket)) { if (! TRI_isvalidsocket(_listenSocket)) {
LOG_ERROR("In ListenTask::setup could not convert socket handle to socket descriptor -- invalid socket handle"); LOG_ERROR("In ListenTask::setup could not convert socket handle to socket descriptor -- invalid socket handle");
return false; return false;
} }
@ -178,7 +178,7 @@ bool ListenTask::handleEvent (EventToken token, EventType revents) {
TRI_socket_t connectionSocket; TRI_socket_t connectionSocket;
connectionSocket = TRI_accept(_listenSocket, (sockaddr*) &addr, &len); connectionSocket = TRI_accept(_listenSocket, (sockaddr*) &addr, &len);
if (!TRI_isvalidsocket(connectionSocket)) { if (! TRI_isvalidsocket(connectionSocket)) {
++acceptFailures; ++acceptFailures;
if (acceptFailures < MAX_ACCEPT_ERRORS) { if (acceptFailures < MAX_ACCEPT_ERRORS) {
@ -200,7 +200,7 @@ bool ListenTask::handleEvent (EventToken token, EventType revents) {
int res = TRI_getsockname(connectionSocket, (sockaddr*) &addr_out, &len_out); int res = TRI_getsockname(connectionSocket, (sockaddr*) &addr_out, &len_out);
if (res != 0) { if (res != TRI_ERROR_NO_ERROR) {
TRI_CLOSE_SOCKET(connectionSocket); TRI_CLOSE_SOCKET(connectionSocket);
LOG_WARNING("getsockname failed with %d (%s)", errno, strerror(errno)); LOG_WARNING("getsockname failed with %d (%s)", errno, strerror(errno));

View File

@ -134,6 +134,14 @@ namespace triagens {
_numConnectRetries = 0; _numConnectRetries = 0;
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the number of configured connect retries
////////////////////////////////////////////////////////////////////////////////
inline size_t connectRetries () const {
return _connectRetries;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief connect /// @brief connect
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -113,6 +113,8 @@ namespace triagens {
TRI_ASSERT(_state == IN_CONNECT || _state == IN_WRITE); TRI_ASSERT(_state == IN_CONNECT || _state == IN_WRITE);
size_t const maxConnects = _connection->connectRetries();
size_t connects = 0;
double endTime = now() + _requestTimeout; double endTime = now() + _requestTimeout;
double remainingTime = _requestTimeout; double remainingTime = _requestTimeout;
@ -120,6 +122,15 @@ namespace triagens {
while (isWorking() && remainingTime > 0.0) { while (isWorking() && remainingTime > 0.0) {
switch (_state) { switch (_state) {
case (IN_CONNECT): { case (IN_CONNECT): {
if (++connects > maxConnects) {
// too many connects
SimpleHttpResult* result = getResult();
_result = nullptr;
return result;
}
handleConnect(); handleConnect();
break; break;
} }
@ -191,7 +202,7 @@ namespace triagens {
remainingTime = endTime - now(); remainingTime = endTime - now();
} }
if (isWorking() && _errorMessage == "" ) { if (isWorking() && _errorMessage.empty()) {
setErrorMessage("Request timeout reached"); setErrorMessage("Request timeout reached");
} }
@ -248,29 +259,33 @@ namespace triagens {
_pathToBasicAuth.push_back(make_pair(prefix, value)); _pathToBasicAuth.push_back(make_pair(prefix, value));
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief return the result
////////////////////////////////////////////////////////////////////////////////
SimpleHttpResult* SimpleHttpClient::getResult () { SimpleHttpResult* SimpleHttpClient::getResult () {
switch (_state) { switch (_state) {
case (IN_CONNECT): case IN_WRITE:
_result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT);
break;
case (IN_WRITE):
_result->setResultType(SimpleHttpResult::WRITE_ERROR); _result->setResultType(SimpleHttpResult::WRITE_ERROR);
break; break;
case (IN_READ_HEADER): case IN_READ_HEADER:
case (IN_READ_BODY): case IN_READ_BODY:
case (IN_READ_CHUNKED_HEADER): case IN_READ_CHUNKED_HEADER:
case (IN_READ_CHUNKED_BODY): case IN_READ_CHUNKED_BODY:
_result->setResultType(SimpleHttpResult::READ_ERROR); _result->setResultType(SimpleHttpResult::READ_ERROR);
break; break;
case (FINISHED): case FINISHED:
_result->setResultType(SimpleHttpResult::COMPLETE); _result->setResultType(SimpleHttpResult::COMPLETE);
break; break;
default : case IN_CONNECT:
default: {
_result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT); _result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT);
setErrorMessage("Could not connect");
break;
}
} }
return _result; return _result;