You're using strncpy(), which does NOT add the 0-terminator at the end
that printf() expects.

On 4/13/20 11:27 AM, Imóveis Nacionais wrote:
> But I am just handling arrived data when *upload_data_size > 0. Here is
> the code:
> 
> else if(strcmp(method, "POST") == 0)
> {
>         ST_PER_THREAD_DATA* pstThreadData = *ptr;
>         if( pstThreadData == NULL)
>         {                  
>             ST_PER_THREAD_DATA * cThreadData = (ST_PER_THREAD_DATA*)
> malloc(sizeof(ST_PER_THREAD_DATA));
>             cThreadData->nThreadID = nThID;
>             cThreadData->strData[0]='\0';
> 
>             *ptr = cThreadData;
>             return MHD_YES;  
>         }
> 
>         if(*upload_data_size > 0)
>         {
>             printf("Before strcpy (%s) (%s)
> (%d)\n",pstThreadData->strData,upload_data,*upload_data_size);
>             strncpy(pstThreadData->strData,upload_data,*upload_data_size);
>             printf("After strcpy (%s) (%s)
> (%d)\n",pstThreadData->strData,upload_data,*upload_data_size);
> 
>             *upload_data_size = 0;
>             return MHD_YES;
> 
>             //After strcpy ({"key98"}) ({"key98"}) (9)
>         }
>         else
>         {
>             //END OF POST DATA GATHERING            
>             printf("In the end of post we have (%s) (%d)
> \n",pstThreadData->strData, strlen(pstThreadData->strData));
>             HandleClientPost(pstThreadData->strData))
>             //In the end of post we have ({"key98"}) (10)
> ...
> 
> Please, is there anything wrong with the (testing) code?
> 
> Thank you
> 
> 
> 
> On Mon, Apr 13, 2020 at 10:00 AM Christian Grothoff <groth...@gnunet.org
> <mailto:groth...@gnunet.org>> wrote:
> 
>     On 4/13/20 2:11 AM, Imóveis Nacionais wrote:
>     > Then when in the "*upload_data_size = 0" situation, using a printf
>     > sometimes I can see that the thread context data has the 0x7f char
>     appended
>     > and of course the strlen now is one char extra. This happens
>     between the
>     > last post call with *upload_data_size > 0 and *upload_data_size = 0.
>     >
>     > Does this char has any meaning in the libmicrohttpd context?
>     > Why is this char being added?
> 
>     You're seeing undefined behavior. When '*upload_data_size' is zero, you
>     are not allowed to look into '*upload_data'. It is NEVER warranted to be
>     a 0-terminated char* in the first place, and right now you're just
>     reading data out of bounds.  Do not rely on getting 0x7f or anything
>     meaningful, in fact, expect reading more than '*upload_data_size' bytes
>     from '*upload_data' to be deadly.
> 
>     Happy hacking!
> 
>     Christian
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to