diff options
author | Marcello Stanisci <stanisci.m@gmail.com> | 2018-03-15 19:10:42 +0100 |
---|---|---|
committer | Marcello Stanisci <stanisci.m@gmail.com> | 2018-03-15 19:10:42 +0100 |
commit | 0f30e5ab837a144164b6af7d3006b5cc5ea6b9ed (patch) | |
tree | 36176b526775478823ecd45d5f65402bbae6d674 | |
parent | 9cb8e4ad812dd197e1dcbb34ea58f1a99a3f7d1d (diff) | |
download | twister-0f30e5ab837a144164b6af7d3006b5cc5ea6b9ed.tar.gz twister-0f30e5ab837a144164b6af7d3006b5cc5ea6b9ed.tar.bz2 twister-0f30e5ab837a144164b6af7d3006b5cc5ea6b9ed.zip |
implement upload data malformation.
-rw-r--r-- | src/include/taler_twister_service.h | 14 | ||||
-rw-r--r-- | src/twister/taler-twister-service.c | 60 | ||||
-rw-r--r-- | src/twister/taler-twister.c | 18 | ||||
-rw-r--r-- | src/twister/twister.h | 2 | ||||
-rw-r--r-- | src/twister/twister_api.c | 37 |
5 files changed, 126 insertions, 5 deletions
diff --git a/src/include/taler_twister_service.h b/src/include/taler_twister_service.h index 701633d..486baf2 100644 --- a/src/include/taler_twister_service.h +++ b/src/include/taler_twister_service.h @@ -126,6 +126,20 @@ TALER_TWISTER_malform void *cb_cls); /** + * Randomly truncate the request. + * + * @param h twister instance to control + * @param cb function to call once twister is ready + * @param cb_cls closure for @a cb + * @return operation handle (to possibly abort) + */ +struct TALER_TWISTER_Operation * +TALER_TWISTER_malform_upload + (struct TALER_TWISTER_Handle *h, + GNUNET_SCHEDULER_TaskCallback cb, + void *cb_cls); + +/** * Delete the object pointed to by @a path. * * @param h twister instance to control diff --git a/src/twister/taler-twister-service.c b/src/twister/taler-twister-service.c index 75e89f6..a0477b8 100644 --- a/src/twister/taler-twister-service.c +++ b/src/twister/taler-twister-service.c @@ -253,6 +253,12 @@ static char delete_path[TWISTER_PATH_LENGTH] = {'\0'}; static char modify_path[TWISTER_PATH_LENGTH] = {'\0'}; /** + * If true, will randomly truncate the request body + * to upload to the proxied service. + */ +static unsigned int malform_upload = GNUNET_NO; + +/** * If true, will randomly truncate the response before * returning to the client. */ @@ -533,8 +539,8 @@ curl_download_cb (void *ptr, /** - * cURL callback for uploaded (PUT/POST) data. Copies from our `io_buf` - * to make it available to curl. + * cURL callback for uploaded (PUT/POST) data. + * Copies from our `io_buf` to make it available to curl. * * @param buf where to write the data * @param size number of bytes per member @@ -583,7 +589,7 @@ curl_upload_cb (void *buf, } -/* ************************** main loop of cURL interaction ****************** */ +/* ************** main loop of cURL interaction ************* */ /** @@ -1080,24 +1086,44 @@ create_response (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing %u bytes UPLOAD\n", (unsigned int) *upload_data_size); + + /* Grow the buffer if remaining space isn't enough. */ if (hr->io_size - hr->io_len < *upload_data_size) { + /* How can this assertion be false? */ GNUNET_assert (hr->io_size * 2 + 1024 > hr->io_size); + /* This asserts that upload_data_size > 0, ? */ GNUNET_assert (*upload_data_size + hr->io_len > hr->io_len); + GNUNET_array_grow (hr->io_buf, hr->io_size, GNUNET_MAX (hr->io_size * 2 + 1024, *upload_data_size + hr->io_len)); } + + /* Finally copy upload data. */ GNUNET_memcpy (&hr->io_buf[hr->io_len], upload_data, *upload_data_size); + + /* Note, each request starts with fresh and + * equal-to-zero io_len (?). */ hr->io_len += *upload_data_size; *upload_data_size = 0; return MHD_YES; } + /* Malform request body. */ + if (GNUNET_YES == malform_upload) + { + TALER_LOG_DEBUG + ("Will (badly) truncate the request.\n"); + hr->io_len = GNUNET_CRYPTO_random_u32 + (GNUNET_CRYPTO_QUALITY_WEAK, hr->io_len - 1); + malform_upload = GNUNET_NO; + } + /* Upload finished, generate curl request */ if (NULL == hr->curl) { @@ -1105,9 +1131,12 @@ create_response (void *cls, "Generating curl request\n"); hr->curl = curl_easy_init (); if (NULL == hr->curl) + { + TALER_LOG_ERROR ("Could not init the curl handle\n"); return MHD_queue_response (con, MHD_HTTP_INTERNAL_SERVER_ERROR, curl_failure_response); + } if (0 != hr->io_len) curl_easy_setopt (hr->curl, CURLOPT_POSTFIELDSIZE, @@ -1315,9 +1344,9 @@ create_response (void *cls, size_t fake_len; TALER_LOG_DEBUG - ("Will (badly) truncate the original output.\n"); + ("Will (badly) truncate the response.\n"); fake_len = GNUNET_CRYPTO_random_u32 - (GNUNET_CRYPTO_QUALITY_WEAK, hr->io_len); + (GNUNET_CRYPTO_QUALITY_WEAK, hr->io_len - 1); body_len = fake_len; malform = GNUNET_NO; } @@ -1775,6 +1804,22 @@ handle_malform (void *cls, send_acknowledgement (c); } +/** + * Control handler for malforming requests. + * + * @param cls message queue for sending replies + * @param src received message + */ +static void +handle_malform_upload (void *cls, + const struct TWISTER_Malform *src) +{ + struct GNUNET_SERVICE_Client *c = cls; + + TALER_LOG_DEBUG ("Flagging request malformation\n"); + malform_upload = GNUNET_YES; + send_acknowledgement (c); +} /** * Control handler for deleting JSON objects @@ -1849,6 +1894,11 @@ GNUNET_SERVICE_MAIN struct TWISTER_ModifyPath, NULL), + GNUNET_MQ_hd_fixed_size (malform_upload, + TWISTER_MESSAGE_TYPE_MALFORM_UPLOAD, + struct TWISTER_Malform, + NULL), + GNUNET_MQ_hd_fixed_size (malform, TWISTER_MESSAGE_TYPE_MALFORM, struct TWISTER_Malform, diff --git a/src/twister/taler-twister.c b/src/twister/taler-twister.c index 2807bab..ce39104 100644 --- a/src/twister/taler-twister.c +++ b/src/twister/taler-twister.c @@ -58,6 +58,11 @@ static char *delete_path; static int malform_response; /** + * If true, will randomly truncate the proxied request. + */ +static int malform_upload; + +/** * Path to the object to modify. */ static char *modify_path; @@ -139,6 +144,13 @@ run (void *cls, return; } + if ( (0 != malform_upload) && + (NULL != TALER_TWISTER_malform_upload + (tth, + &handle_acknowledgement, + NULL))) + num_ops++; + if ( (0 != malform_response) && (NULL != TALER_TWISTER_malform (tth, @@ -241,6 +253,12 @@ main (int argc, &check_alive), GNUNET_GETOPT_option_flag + ('U', + "malformupload", + gettext_noop ("Randomly truncate proxied request"), + &malform_upload), + + GNUNET_GETOPT_option_flag ('M', "malform", gettext_noop ("Randomly truncate proxied response"), diff --git a/src/twister/twister.h b/src/twister/twister.h index 5954b3c..c1ebeef 100644 --- a/src/twister/twister.h +++ b/src/twister/twister.h @@ -49,6 +49,8 @@ #define TWISTER_MESSAGE_TYPE_MALFORM 5 +#define TWISTER_MESSAGE_TYPE_MALFORM_UPLOAD 6 + GNUNET_NETWORK_STRUCT_BEGIN struct TWISTER_Malform { diff --git a/src/twister/twister_api.c b/src/twister/twister_api.c index b81b7b8..477b774 100644 --- a/src/twister/twister_api.c +++ b/src/twister/twister_api.c @@ -202,6 +202,43 @@ TALER_TWISTER_cancel (struct TALER_TWISTER_Operation *op) op->cb = NULL; } + +/** + * Randomly truncate the request. + * + * @param h twister instance to control + * @param cb function to call once twister is ready + * @param cb_cls closure for @a cb + * @return operation handle (to possibly abort) + */ +struct TALER_TWISTER_Operation * +TALER_TWISTER_malform_upload + (struct TALER_TWISTER_Handle *h, + GNUNET_SCHEDULER_TaskCallback cb, + void *cb_cls) +{ + struct TALER_TWISTER_Operation *op; + struct GNUNET_MQ_Envelope *env; + struct TWISTER_Malform *src; + + op = GNUNET_new (struct TALER_TWISTER_Operation); + op->h = h; + op->cb = cb; + op->cb_cls = cb_cls; + GNUNET_CONTAINER_DLL_insert_tail (h->op_head, + h->op_tail, + op); + /* Prepare *env*elope. */ + env = GNUNET_MQ_msg + (src, TWISTER_MESSAGE_TYPE_MALFORM_UPLOAD); + /* Send message. */ + GNUNET_MQ_send (h->mq, env); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Batching a (upload) body malformation\n"); + return op; +} + + /** * Randomly truncate the response. * |