Sorry to complain once again.The attached testcase should decode valid UTF8.Best wishes
-------- Weitergeleitete Nachricht --------Von: Christian Grothoff < groth...@gnunet.org>Antwort an: libmicrohttpd development and user mailinglist <libmicrohttpd@gnu.org>An: libmicrohttpd@gnu.orgBetreff: Re: [libmicrohttpd] libmicrohttpd 0.9.71 releasedDatum: Fri, 10 Jul 2020 15:08:47 +0200 Fixed in 8c773704..9b39de8d. Thanks for reporting! -Christian On 7/6/20 7:15 PM, Markus Doppelbauer wrote: > There is a second issue parsing url-encoded post requests.I have > attached a testcase (same ugly code as last time)."text" should be > "text, text" not "text%2C text". > Best wishes > > -------- Weitergeleitete Nachricht --------*Von*: Christian Grothoff > <groth...@gnunet.org > <mailto:christian%20grothoff%20%3cgroth...@gnunet.org%3e>>*Antwort > an*: libmicrohttpd development and user mailinglist< > libmicrohttpd@gnu.org > <mailto: > libmicrohttpd%20development%20and%20user%20mailinglist%20%3clibmicroht...@gnu.org > %3e>>*An*: libmicrohttpd <libmicrohttpd@gnu.org > <mailto:libmicrohttpd%20%3clibmicroht...@gnu.org%3e>>*Betreff*: > [libmicrohttpd] libmicrohttpd 0.9.71 released*Datum*: Sun, 28 Jun > 2020 22:04:49 +0200 > Dear all, > > I'm happy to announce the release of GNU libmicrohttpd 0.9.71. > > This release fixes a potential buffer overflow and is thus considered > a > security release. Please upgrade as soon as possible. Thanks to > Nicolas > Mora for finding and reporting the issue. > > Additionally, the release fixes the following issues: > > * Proper uncorking with GnuTLS to ensure 'last bytes' are > transmitted over TLS connections even if we are congested > * Fixes wrong values returned by PostProcessor given certain > parser boundaries > * Improved documentation, fixed spelling mistakes > * Fixed several socket handling issues on OS X > > Furthermore, the release introduces an 'enum MHD_Result' instead of > #defines for MHD_YES/MHD_NO. This is intended to make it easier to > check > for certain API misuse bugs by providing better types (not everything > is > an 'int'). While this does NOT change the binary API, this change > _will_ cause compiler warnings for all legacy code -- until 'int' is > replaced with 'enum MHD_Result'. > > If you want your code to build without warnings on both older and > newer > MHD releases, you may want to introduce a MHD_RESULT as done here: > > https://git.gnunet.org/gnunet.git/tree/src/include/gnunet_mhd_compat.h > > > > That said, this being a security release it may be a good time to not > build nicely against older versions. > > > Happy hacking! > > Christian >
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <microhttpd.h> enum PP_State { /* general states */ PP_Error, PP_Done, PP_Init, PP_NextBoundary, /* url encoding-states */ PP_ProcessValue, PP_Callback, PP_ExpectNewLine, /* post encoding-states */ PP_ProcessEntryHeaders, PP_PerformCheckMultipart, PP_ProcessValueToBoundary, PP_PerformCleanup, /* nested post-encoding states */ PP_Nested_Init, PP_Nested_PerformMarking, PP_Nested_ProcessEntryHeaders, PP_Nested_ProcessValueToBoundary, PP_Nested_PerformCleanup }; enum RN_State { RN_Inactive = 0, RN_OptN = 1, RN_Full = 2, RN_Dash = 3, RN_Dash2 = 4 }; enum NE_State { NE_none = 0, NE_content_name = 1, NE_content_type = 2, NE_content_filename = 4, NE_content_transfer_encoding = 8 }; struct MHD_PostProcessor { struct MHD_Connection *connection; MHD_PostDataIterator ikvi; void *cls; const char *encoding; const char *boundary; char *nested_boundary; char *content_name; char *content_type; char *content_filename; char *content_transfer_encoding; char xbuf[2]; size_t buffer_size; size_t buffer_pos; size_t xbuf_pos; uint64_t value_offset; size_t blen; size_t nlen; bool must_ikvi; bool must_unescape_key; enum PP_State state; enum RN_State skip_rn; enum PP_State dash_state; enum NE_State have; }; static MHD_Result post_data_iterator( void *cls, enum MHD_ValueKind kind, const char *key, const char *filename, const char *content_type, const char *transfer_encoding, const char *data, uint64_t off, size_t size ) { printf("%s\n", data ); return MHD_YES; } int main( int argc, char *argv[] ) { struct MHD_PostProcessor *postprocessor = (struct MHD_PostProcessor *)calloc(1, sizeof(struct MHD_PostProcessor) + 0x1000+1); postprocessor->connection = nullptr; postprocessor->ikvi = post_data_iterator; postprocessor->cls = nullptr; postprocessor->encoding = MHD_HTTP_POST_ENCODING_FORM_URLENCODED; postprocessor->buffer_size = 0x1000; postprocessor->state = PP_Init; postprocessor->blen = 0; postprocessor->boundary = nullptr; postprocessor->skip_rn = RN_Inactive; const char *chunk = "t=x%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%28%E2%80%9Cxxxxxxxxxxxxx%E2%80%9D%29xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxx%26xxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxx%3A%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0A%E2%80%A2xxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3A%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0A%E2%80%A2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%28xxxx%29%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%28xxx%29%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3A%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%27xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0A%E2%80%A2xxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%28xxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%29%2Cxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0A%E2%80%A2xxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxx%E2%80%94xxxxxxxxxxxxxxxxxxx%E2%80%94xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0A%E2%80%A2xxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxx%2Cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%28xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%29x%0D%0A%0D%0Axxxxxxxxxxxxxxxxxx%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3A%0D%0A%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%0D%0A%0D%0A%E2%80%A2xxxx"; MHD_post_process( postprocessor, chunk, strlen(chunk) ); MHD_post_process( postprocessor, "", 0 ); MHD_destroy_post_processor( postprocessor ); return EXIT_SUCCESS; }