diff options
| author | Simon Rettberg | 2025-10-24 08:52:25 +0200 |
|---|---|---|
| committer | Simon Rettberg | 2025-12-09 15:33:20 +0100 |
| commit | 9e2e94ecb8140b159e1ba4d148d2e6dc57b5fc92 (patch) | |
| tree | b314b27ee275ceb0397729e7e92f7c63fc46ded0 /src/server | |
| parent | [SERVER] Refactor classic dnbd3 code a bit, locking etc. (diff) | |
| download | dnbd3-9e2e94ecb8140b159e1ba4d148d2e6dc57b5fc92.tar.gz dnbd3-9e2e94ecb8140b159e1ba4d148d2e6dc57b5fc92.tar.xz dnbd3-9e2e94ecb8140b159e1ba4d148d2e6dc57b5fc92.zip | |
Fix AFL build
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | src/server/altservers.c | 2 | ||||
| -rw-r--r-- | src/server/iscsi.c | 3 | ||||
| -rw-r--r-- | src/server/net.c | 18 | ||||
| -rw-r--r-- | src/server/rpc.c | 2 | ||||
| -rw-r--r-- | src/server/server.c | 6 |
6 files changed, 14 insertions, 36 deletions
diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index d53a778..34eb695 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -18,27 +18,8 @@ find_package(Libatomic REQUIRED) add_definitions(-D_GNU_SOURCE) if(DNBD3_SERVER_AFL) - # check if DNBD3_RELEASE_HARDEN is disabled - if(DNBD3_RELEASE_HARDEN) - message(FATAL_ERROR "DNBD3_SERVER_AFL can only be enabled if DNBD3_RELEASE_HARDEN is disabled") - endif(DNBD3_RELEASE_HARDEN) - - # build dnbd3-server with AFL support message(STATUS "Building dnbd3-server with AFL support") add_definitions(-DDNBD3_SERVER_AFL) - - # change compiler for dnbd3-server sources if AFL enabled - include(CheckAFLCCompiler) - check_afl_c_compiler(AFL_C_COMPILER AFL_C_COMPILER_NAME ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ID}) - if(AFL_C_COMPILER) - message(STATUS "Check for working AFL C compiler: ${AFL_C_COMPILER} - done") - # change C compiler to a corresponding AFL C compiler - set(CMAKE_C_COMPILER "${AFL_C_COMPILER}") - else(AFL_C_COMPILER) - # no corresponding AFL C compiler found - message(STATUS "Check for working AFL C compiler: ${AFL_C_COMPILER_NAME} - failed") - message(FATAL_ERROR "No corresponding AFL C compiler ${AFL_C_COMPILER_NAME} was found for the C compiler ${CMAKE_C_COMPILER}!") - endif(AFL_C_COMPILER) endif(DNBD3_SERVER_AFL) set(DNBD3_SERVER_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/altservers.c diff --git a/src/server/altservers.c b/src/server/altservers.c index 4413ca6..269fe28 100644 --- a/src/server/altservers.c +++ b/src/server/altservers.c @@ -14,6 +14,8 @@ #include <inttypes.h> #include <jansson.h> +#include <dnbd3/afl.h> + #define LOG(lvl, msg, ...) logadd(lvl, msg " (%s:%d)", __VA_ARGS__, PIMG(image)) #define LOG_GOTO(jumplabel, lvl, ...) do { LOG(lvl, __VA_ARGS__); goto jumplabel; } while (0); #define ERROR_GOTO(jumplabel, ...) LOG_GOTO(jumplabel, LOG_ERROR, __VA_ARGS__) diff --git a/src/server/iscsi.c b/src/server/iscsi.c index 30cf312..60b738b 100644 --- a/src/server/iscsi.c +++ b/src/server/iscsi.c @@ -52,6 +52,8 @@ #define ISCSI_DEFAULT_DEVICE_ID 1 #define ISCSI_DEFAULT_QUEUE_DEPTH 16 +#include <dnbd3/afl.h> + /** * @file iscsi.c * @author Sebastian Vater @@ -512,7 +514,6 @@ static int iscsi_task_xfer_scsi_data_in(iscsi_connection *conn, iscsi_task *task res_cnt = (pos - xfer_len); flags |= ISCSI_SCSI_DATA_IN_RESPONSE_FLAGS_RES_OVERFLOW; } - logadd( LOG_DEBUG1, "iscsi_task_xfer_scsi_data_in: pos=%lu, xfer_len=%lu, seg_len=%lu", pos, xfer_len, seg_len ); if ( xfer_len == 0UL ) return 0; diff --git a/src/server/net.c b/src/server/net.c index 7804100..f2f63b8 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -41,6 +41,8 @@ #include <stdatomic.h> #include <signal.h> +#include <dnbd3/afl.h> + static dnbd3_client_t *_clients[SERVER_MAX_CLIENTS]; static int _num_clients = 0; static pthread_mutex_t _clients_lock; @@ -56,9 +58,7 @@ static void uplinkCallback(void *data, uint64_t handle, uint64_t start, uint32_t static inline bool recv_request_header(int sock, dnbd3_request_t *request) { ssize_t ret, fails = 0; -#ifdef DNBD3_SERVER_AFL - sock = 0; -#endif + // Read request header from socket while ( ( ret = recv( sock, request, sizeof(*request), MSG_WAITALL ) ) != sizeof(*request) ) { if ( errno == EINTR && ++fails < 10 ) continue; @@ -83,9 +83,6 @@ static inline bool recv_request_header(int sock, dnbd3_request_t *request) static inline bool recv_request_payload(int sock, uint32_t size, serialized_buffer_t *payload) { -#ifdef DNBD3_SERVER_AFL - sock = 0; -#endif if ( size == 0 ) { logadd( LOG_ERROR, "Called recv_request_payload() to receive 0 bytes" ); return false; @@ -94,8 +91,9 @@ static inline bool recv_request_payload(int sock, uint32_t size, serialized_buff logadd( LOG_ERROR, "Called recv_request_payload() for more bytes than the passed buffer could hold!" ); return false; } - if ( sock_recv( sock, payload->buffer, size ) != (ssize_t)size ) { - logadd( LOG_DEBUG1, "Could not receive request payload of length %d\n", (int)size ); + const ssize_t ret = sock_recv( sock, payload->buffer, size ); + if ( ret != (ssize_t)size ) { + logadd( LOG_DEBUG1, "Could not receive request payload of length %d (got %d, errno %d)\n", (int)size, (int)ret, errno ); return false; } // Prepare payload buffer for reading @@ -179,11 +177,7 @@ void* net_handleNewConnection(void *clientPtr) } } do { -#ifdef DNBD3_SERVER_AFL - const int ret = (int)recv( 0, &request, sizeof(request), MSG_WAITALL ); -#else const int ret = (int)recv( client->sock, &request, sizeof(request), MSG_WAITALL ); -#endif // It's expected to be a real dnbd3 client // Check request for validity. This implicitly dictates that all HTTP requests are more than 24 bytes... if ( ret != (int)sizeof(request) ) { diff --git a/src/server/rpc.c b/src/server/rpc.c index 119bbd5..528ae43 100644 --- a/src/server/rpc.c +++ b/src/server/rpc.c @@ -19,6 +19,8 @@ #include <fcntl.h> #include <unistd.h> +#include <dnbd3/afl.h> + #if JANSSON_VERSION_HEX < 0x020600 #define json_stringn_nocheck(a,b) json_string_nocheck(a) #endif diff --git a/src/server/server.c b/src/server/server.c index b91e4ce..15a043d 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -314,10 +314,8 @@ int main(int argc, char *argv[]) exit( 3 ); } { - struct sockaddr_storage client; - memset( &client, 0, sizeof client ); - client.ss_family = AF_INET; - dnbd3_client_t *dnbd3_client = dnbd3_prepareClient( &client, 1 ); + struct sockaddr_storage client = { .ss_family = AF_INET }; + dnbd3_client_t *dnbd3_client = dnbd3_prepareClient( &client, 0 ); if ( dnbd3_client == NULL ) { fprintf( stderr, "New client failed\n" ); exit( 1 ); |
