summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2017-10-26 23:34:07 +0200
committerSimon Rettberg2017-10-26 23:34:07 +0200
commit3187fdef5ba7a13b576324e541d28a43006f31d1 (patch)
tree6179a4db8ee07ff1bfc5f3a85f9a4dfda2e66250
parent[SERVER] Rename missing occurence of ret, possibly leading to infinite loop :( (diff)
downloaddnbd3-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.c21
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 );