diff --git a/programs/fuzz/fuzz_client.c b/programs/fuzz/fuzz_client.c
index 270ae8a..cc208b3 100644
--- a/programs/fuzz/fuzz_client.c
+++ b/programs/fuzz/fuzz_client.c
@@ -30,7 +30,8 @@
 #endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */
 
 
-int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
+{
 #if defined(MBEDTLS_SSL_CLI_C) && \
     defined(MBEDTLS_ENTROPY_C) && \
     defined(MBEDTLS_CTR_DRBG_C)
@@ -46,10 +47,11 @@
 
     if (initialized == 0) {
 #if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
-        mbedtls_x509_crt_init( &cacert );
-        if (mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem,
-                                   mbedtls_test_cas_pem_len ) != 0)
+        mbedtls_x509_crt_init(&cacert);
+        if (mbedtls_x509_crt_parse(&cacert, (const unsigned char *) mbedtls_test_cas_pem,
+                                   mbedtls_test_cas_pem_len) != 0) {
             return 1;
+        }
 #endif
 
         alpn_list[0] = "HTTP";
@@ -69,104 +71,118 @@
     //Avoid warnings if compile options imply no options
     (void) options;
 
-    mbedtls_ssl_init( &ssl );
-    mbedtls_ssl_config_init( &conf );
-    mbedtls_ctr_drbg_init( &ctr_drbg );
-    mbedtls_entropy_init( &entropy );
+    mbedtls_ssl_init(&ssl);
+    mbedtls_ssl_config_init(&conf);
+    mbedtls_ctr_drbg_init(&ctr_drbg);
+    mbedtls_entropy_init(&entropy);
 
-    if( mbedtls_ctr_drbg_seed( &ctr_drbg, dummy_entropy, &entropy,
-                              (const unsigned char *) pers, strlen( pers ) ) != 0 )
+    if (mbedtls_ctr_drbg_seed(&ctr_drbg, dummy_entropy, &entropy,
+                              (const unsigned char *) pers, strlen(pers)) != 0) {
         goto exit;
+    }
 
-    if( mbedtls_ssl_config_defaults( &conf,
+    if (mbedtls_ssl_config_defaults(&conf,
                                     MBEDTLS_SSL_IS_CLIENT,
                                     MBEDTLS_SSL_TRANSPORT_STREAM,
-                                    MBEDTLS_SSL_PRESET_DEFAULT ) != 0 )
+                                    MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
         goto exit;
+    }
 
 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
     if (options & 2) {
-        mbedtls_ssl_conf_psk( &conf, psk, sizeof( psk ),
-                             (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );
+        mbedtls_ssl_conf_psk(&conf, psk, sizeof(psk),
+                             (const unsigned char *) psk_id, sizeof(psk_id) - 1);
     }
 #endif
 
 #if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
     if (options & 4) {
-        mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );
-        mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );
+        mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
+        mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);
     } else
 #endif
     {
-        mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_NONE );
+        mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_NONE);
     }
 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
-    mbedtls_ssl_conf_truncated_hmac( &conf, (options & 8) ? MBEDTLS_SSL_TRUNC_HMAC_ENABLED : MBEDTLS_SSL_TRUNC_HMAC_DISABLED);
+    mbedtls_ssl_conf_truncated_hmac(&conf,
+                                    (options &
+                                     8) ? MBEDTLS_SSL_TRUNC_HMAC_ENABLED : MBEDTLS_SSL_TRUNC_HMAC_DISABLED);
 #endif
 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
-    mbedtls_ssl_conf_extended_master_secret( &conf, (options & 0x10) ? MBEDTLS_SSL_EXTENDED_MS_DISABLED : MBEDTLS_SSL_EXTENDED_MS_ENABLED);
+    mbedtls_ssl_conf_extended_master_secret(&conf,
+                                            (options &
+                                             0x10) ? MBEDTLS_SSL_EXTENDED_MS_DISABLED : MBEDTLS_SSL_EXTENDED_MS_ENABLED);
 #endif
 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
-    mbedtls_ssl_conf_encrypt_then_mac( &conf, (options & 0x20) ? MBEDTLS_SSL_ETM_DISABLED : MBEDTLS_SSL_ETM_ENABLED);
+    mbedtls_ssl_conf_encrypt_then_mac(&conf,
+                                      (options &
+                                       0x20) ? MBEDTLS_SSL_ETM_DISABLED : MBEDTLS_SSL_ETM_ENABLED);
 #endif
 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
-    mbedtls_ssl_conf_cbc_record_splitting( &conf, (options & 0x40) ? MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED : MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED );
+    mbedtls_ssl_conf_cbc_record_splitting(&conf,
+                                          (options &
+                                           0x40) ? MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED : MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED);
 #endif
 #if defined(MBEDTLS_SSL_RENEGOTIATION)
-    mbedtls_ssl_conf_renegotiation( &conf, (options & 0x80) ? MBEDTLS_SSL_RENEGOTIATION_ENABLED : MBEDTLS_SSL_RENEGOTIATION_DISABLED );
+    mbedtls_ssl_conf_renegotiation(&conf,
+                                   (options &
+                                    0x80) ? MBEDTLS_SSL_RENEGOTIATION_ENABLED : MBEDTLS_SSL_RENEGOTIATION_DISABLED);
 #endif
 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
-    mbedtls_ssl_conf_session_tickets( &conf, (options & 0x100) ? MBEDTLS_SSL_SESSION_TICKETS_DISABLED : MBEDTLS_SSL_SESSION_TICKETS_ENABLED );
+    mbedtls_ssl_conf_session_tickets(&conf,
+                                     (options &
+                                      0x100) ? MBEDTLS_SSL_SESSION_TICKETS_DISABLED : MBEDTLS_SSL_SESSION_TICKETS_ENABLED);
 #endif
 #if defined(MBEDTLS_SSL_ALPN)
     if (options & 0x200) {
-        mbedtls_ssl_conf_alpn_protocols( &conf, alpn_list );
+        mbedtls_ssl_conf_alpn_protocols(&conf, alpn_list);
     }
 #endif
     //There may be other options to add :
     // mbedtls_ssl_conf_cert_profile, mbedtls_ssl_conf_sig_hashes
 
     srand(1);
-    mbedtls_ssl_conf_rng( &conf, dummy_random, &ctr_drbg );
+    mbedtls_ssl_conf_rng(&conf, dummy_random, &ctr_drbg);
 
-    if( mbedtls_ssl_setup( &ssl, &conf ) != 0 )
+    if (mbedtls_ssl_setup(&ssl, &conf) != 0) {
         goto exit;
+    }
 
 #if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
     if ((options & 1) == 0) {
-        if( mbedtls_ssl_set_hostname( &ssl, "localhost" ) != 0 )
+        if (mbedtls_ssl_set_hostname(&ssl, "localhost") != 0) {
             goto exit;
+        }
     }
 #endif
 
     biomemfuzz.Data = Data;
     biomemfuzz.Size = Size-2;
     biomemfuzz.Offset = 0;
-    mbedtls_ssl_set_bio( &ssl, &biomemfuzz, dummy_send, fuzz_recv, NULL );
+    mbedtls_ssl_set_bio(&ssl, &biomemfuzz, dummy_send, fuzz_recv, NULL);
 
-    ret = mbedtls_ssl_handshake( &ssl );
-    if( ret == 0 )
-    {
+    ret = mbedtls_ssl_handshake(&ssl);
+    if (ret == 0) {
         //keep reading data from server until the end
-        do
-        {
-            len = sizeof( buf ) - 1;
-            ret = mbedtls_ssl_read( &ssl, buf, len );
+        do {
+            len = sizeof(buf) - 1;
+            ret = mbedtls_ssl_read(&ssl, buf, len);
 
-            if( ret == MBEDTLS_ERR_SSL_WANT_READ )
+            if (ret == MBEDTLS_ERR_SSL_WANT_READ) {
                 continue;
-            else if( ret <= 0 )
+            } else if (ret <= 0) {
                 //EOF or error
                 break;
-        }
-        while( 1 );
+            }
+        } while (1);
     }
 
 exit:
-    mbedtls_entropy_free( &entropy );
-    mbedtls_ctr_drbg_free( &ctr_drbg );
-    mbedtls_ssl_config_free( &conf );
-    mbedtls_ssl_free( &ssl );
+    mbedtls_entropy_free(&entropy);
+    mbedtls_ctr_drbg_free(&ctr_drbg);
+    mbedtls_ssl_config_free(&conf);
+    mbedtls_ssl_free(&ssl);
 
 #else
     (void) Data;
