diff options
author | Simon Rettberg | 2017-10-26 23:34:07 +0200 |
---|---|---|
committer | Simon Rettberg | 2017-10-26 23:34:07 +0200 |
commit | 3187fdef5ba7a13b576324e541d28a43006f31d1 (patch) | |
tree | 6179a4db8ee07ff1bfc5f3a85f9a4dfda2e66250 | |
parent | [SERVER] Rename missing occurence of ret, possibly leading to infinite loop :( (diff) | |
download | dnbd3-3187fdef5ba7a13b576324e541d28a43006f31d1.tar.gz dnbd3-3187fdef5ba7a13b576324e541d28a43006f31d1.tar.xz dnbd3-3187fdef5ba7a13b576324e541d28a43006f31d1.zip |
[SERVER] net: Simplify check for HTTP
Pretty loose guesswork, but preventing the false positives
would not lead to any meaningful result anyways, so why bother.
-rw-r--r-- | src/server/net.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/server/net.c b/src/server/net.c index 79d6cfa..c7d34de 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -170,23 +170,24 @@ void* net_handleNewConnection(void *clientPtr) sock_setTimeout( client->sock, _clientTimeout ); do { const int ret = (int)recv( client->sock, &request, sizeof(request), MSG_WAITALL ); - // Let's see if this looks like an HTTP request - if ( ret > 5 && request.magic != dnbd3_packet_magic - && ( strncmp( (char*)&request, "GET ", 4 ) == 0 || strncmp( (char*)&request, "POST ", 5 ) == 0 ) ) { - rpc_sendStatsJson( client->sock, &client->host, &request, ret ); - goto fail_preadd; - } - // It's expected to be a real dnbd3 client - // Check request for validity - if ( ret != sizeof(request) ) { + // Check request for validity. This implicitly dictates that all HTTP requests are more than 16 bytes... + if ( ret != (int)sizeof(request) ) { logadd( LOG_DEBUG1, "Error receiving request: Could not read message header (%d/%d, e=%d)", (int)ret, (int)sizeof(request), errno ); goto fail_preadd; } + if ( request.magic != dnbd3_packet_magic ) { - logadd( LOG_DEBUG1, "Magic in client handshake incorrect" ); + // Let's see if this looks like an HTTP request + if ( ((char*)&request)[0] == 'G' || ((char*)&request)[0] == 'P' ) { + // Close enough... + rpc_sendStatsJson( client->sock, &client->host, &request, ret ); + } else { + logadd( LOG_DEBUG1, "Magic in client handshake incorrect" ); + } goto fail_preadd; } + // Magic OK, untangle byte order if required fixup_request( request ); if ( request.cmd != CMD_SELECT_IMAGE ) { logadd( LOG_WARNING, "Client sent != CMD_SELECT_IMAGE in handshake (got cmd=%d, size=%d), dropping client.", (int)request.cmd, (int)request.size ); |