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) {
res = close(s.fileDescriptor);
}
#endif
#endif
return res;
}

View File

@ -230,20 +230,20 @@ namespace triagens {
LOG_DEBUG("trying to establish secure connection");
// 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());
TRI_CLOSE_SOCKET(socket);
return;
}
// build a new connection
SSL * ssl = SSL_new(ctx);
SSL* ssl = SSL_new(ctx);
info.sslContext = ssl;
if (ssl == 0) {
if (ssl == nullptr) {
BIO_free_all(sbio);
LOG_WARNING("cannot build new SSL connection: %s", triagens::basics::lastSSLError().c_str());
TRI_CLOSE_SOCKET(socket);
@ -290,7 +290,7 @@ namespace triagens {
/// @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");
if (!TRI_isvalidsocket(_listenSocket)) {
if (! TRI_isvalidsocket(_listenSocket)) {
LOG_ERROR("In ListenTask::setup could not convert socket handle to socket descriptor -- invalid socket handle");
return false;
}
@ -178,7 +178,7 @@ bool ListenTask::handleEvent (EventToken token, EventType revents) {
TRI_socket_t connectionSocket;
connectionSocket = TRI_accept(_listenSocket, (sockaddr*) &addr, &len);
if (!TRI_isvalidsocket(connectionSocket)) {
if (! TRI_isvalidsocket(connectionSocket)) {
++acceptFailures;
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);
if (res != 0) {
if (res != TRI_ERROR_NO_ERROR) {
TRI_CLOSE_SOCKET(connectionSocket);
LOG_WARNING("getsockname failed with %d (%s)", errno, strerror(errno));

View File

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

View File

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