Sorry to complain once again.The attached testcase should decode valid
UTF8.Best wishes
-------- Weitergeleitete Nachricht --------Von: Christian Grothoff <
[email protected]>Antwort an: libmicrohttpd development and user
mailinglist <[email protected]>An: [email protected]:
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
> <[email protected]
> <mailto:christian%20grothoff%20%[email protected]%3e>>*Antwort
> an*: libmicrohttpd development and user mailinglist<
> [email protected]
> <mailto:
> libmicrohttpd%20development%20and%20user%20mailinglist%20%[email protected]
> %3e>>*An*: libmicrohttpd <[email protected]
> <mailto:libmicrohttpd%20%[email protected]%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;
}