@@ -799,3 +799,62 @@ req_cb_stream(void*,
799
799
MHD_response_destroy (resp);
800
800
return act ? act : MHD_action_abort_request (request);
801
801
}
802
+
803
+ MHD_FN_PAR_NONNULL_ (2 ) MHD_FN_PAR_NONNULL_(3 )
804
+ const struct MHD_Action*
805
+ req_cb_process(void *,
806
+ struct MHD_Request * MHD_RESTRICT request,
807
+ const struct MHD_String * MHD_RESTRICT path,
808
+ enum MHD_HTTP_Method method,
809
+ uint_fast64_t upload_size) {
810
+ // Create info unions
811
+ union MHD_RequestInfoFixedData f;
812
+ union MHD_RequestInfoDynamicData d;
813
+
814
+ // Fuzz MHD_request_get_info_fixed_sz for different parameters on random request
815
+ MHD_request_get_info_fixed_sz (request, MHD_REQUEST_INFO_FIXED_HTTP_VER, &f, sizeof (f));
816
+ MHD_request_get_info_fixed_sz (request, MHD_REQUEST_INFO_FIXED_HTTP_METHOD, &f, sizeof (f));
817
+ MHD_request_get_info_fixed_sz (request, MHD_REQUEST_INFO_FIXED_DAEMON, &f, sizeof (f));
818
+ MHD_request_get_info_fixed_sz (request, MHD_REQUEST_INFO_FIXED_CONNECTION, &f, sizeof (f));
819
+ MHD_request_get_info_fixed_sz (request, MHD_REQUEST_INFO_FIXED_STREAM, &f, sizeof (f));
820
+ MHD_request_get_info_fixed_sz (request, MHD_REQUEST_INFO_FIXED_APP_CONTEXT, &f, sizeof (f));
821
+
822
+ // Fuzz MHD_request_get_info_dynamic_sz for different parameters on random request
823
+ MHD_request_get_info_dynamic_sz (request, MHD_REQUEST_INFO_DYNAMIC_HTTP_METHOD_STRING, &d, sizeof (d));
824
+ MHD_request_get_info_dynamic_sz (request, MHD_REQUEST_INFO_DYNAMIC_URI, &d, sizeof (d));
825
+ MHD_request_get_info_dynamic_sz (request, MHD_REQUEST_INFO_DYNAMIC_NUMBER_URI_PARAMS, &d, sizeof (d));
826
+ MHD_request_get_info_dynamic_sz (request, MHD_REQUEST_INFO_DYNAMIC_NUMBER_COOKIES, &d, sizeof (d));
827
+ MHD_request_get_info_dynamic_sz (request, MHD_REQUEST_INFO_DYNAMIC_HEADER_SIZE, &d, sizeof (d));
828
+ MHD_request_get_info_dynamic_sz (request, MHD_REQUEST_INFO_DYNAMIC_AUTH_DIGEST_INFO, &d, sizeof (d));
829
+ MHD_request_get_info_dynamic_sz (request, MHD_REQUEST_INFO_DYNAMIC_AUTH_BASIC_CREDS, &d, sizeof (d));
830
+
831
+ {
832
+ static const char realm[] = " fuzz-realm" ;
833
+ static const char user[] = " u" ;
834
+ static const char pass[] = " p" ;
835
+
836
+ enum MHD_DigestAuthAlgo algos[] = {
837
+ MHD_DIGEST_AUTH_ALGO_MD5,
838
+ MHD_DIGEST_AUTH_ALGO_SHA256,
839
+ MHD_DIGEST_AUTH_ALGO_SHA512_256
840
+ };
841
+
842
+ for (unsigned i = 0 ; i < (unsigned )(sizeof (algos)/sizeof (algos[0 ])); ++i) {
843
+ size_t sz = MHD_digest_get_hash_size (algos[i]);
844
+ if (sz == 0 || sz > 64 ) {
845
+ continue ;
846
+ }
847
+ unsigned char ha1[64 ];
848
+ if (MHD_SC_OK == MHD_digest_auth_calc_userdigest (algos[i], user, realm, pass, sz, ha1)) {
849
+ MHD_digest_auth_check_digest (
850
+ request, realm, user, sz, ha1,
851
+ 0 , MHD_DIGEST_AUTH_MULT_QOP_AUTH_ANY,
852
+ MHD_DIGEST_AUTH_MULT_ALGO_ANY_NON_SESSION);
853
+ }
854
+ }
855
+ }
856
+
857
+ // Force OK response
858
+ struct MHD_Response * r = MHD_response_from_empty (MHD_HTTP_STATUS_OK);
859
+ return MHD_action_from_response (request, r);
860
+ }
0 commit comments