cJSON_Parse() failure

Hi,

I am sending data from AWS and run it through cJSON_Parse(). If the message is just a little bigger than 1000 bytes, I will get the message "cJSON Parse failure". Debugging the code, function cJSON_ParseWithLengthOpts() will be the one that fails. I guess it likely has to do with lack of memory. The rows


item = cJSON_New_Item(&global_hooks);
if (item == NULL) /* memory fail */
{
    goto fail;
}

will not go to fail, but the result of the next rows will:

if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer))))
{
    /* parse failure. ep is set. */
    goto fail;
}

Is it lack of memory that causes this? If so, is it possible to increase available memory? I have tested to increase
CONFIG_HEAP_MEM_POOL_SIZE
CONFIG_MAIN_STACK_SIZE
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE
but it doesn't help.

Best regards,
Lars

Parents
  • Hello Lars,

    I will try to find out some other possible issues with the experts.

    Best regards,

    Michal

  • Hello, 
    I seem to be having a similar, issue.

    Has there been any progress on this?

    I'll add my example just in case it helps.

    This is correctly handled:

    {
      "cmd": "test",
      "id": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in nunc non elit gravida ultricies. Integer sed convallis nibh. Duis bibendum vehicula massa, eget egestas nibh iaculis ut. Praesent bibendum hendrerit purus vel pharetra. Sed tortor nulla, lobortis volutpat lacinia ac, bibendum ut nibh. Ut eleifend eu mauris a volutpat. Donec erat nisl, ultrices pharetra velit quis, malesuada bibendum augue. Ut semper neque eu sapien tempor molestie. Morbi vel pharetra dui, in rhoncus magna. Nulla facilisi. Proin eu dapibus ipsum. Proin luctus turpis in lacinia semper. Duis massa lorem, blandit sed turpis id, tincidunt cursus magna. Vestibulum mattis odio hendrerit facilisis dictum. Integer eu neque in arcu pulvinar porta.
    
    Pellentesque nec elit in ligula blandit consectetur. Donec scelerisque et mauris sed bibendum. Sed id enim vitae tellus imperdiet tempor eu nec tortor. Cras dignissim odio eu velit vehicula, nec viverra ipsum efficitur. Proin ullamcorper congue imperdiet. In egestas nibh at dignissim porttitor. Maecenas in dui cursus, rutrum ipsum et, convallis ante.
    
    Aenean euismod est et metus dignissim volutpat. Vestibulum a maximus lectus, in tincidunt lectus. Phasellus pretium vel eros non feugiat. In hac habitasse platea dictumst. Fusce vehicula metus ut tempus porttitor. Aenean porta, felis finibus semper vulputate, ipsum arcu viverra magna, id luctus mi lorem nec elit. Quisque molestie finibus dapibus. Proin id velit velit. Suspendisse maximus hendrerit nisi, quis faucibus tortor iaculis quis."
    }


    Adding in an extra sentence at the end ( Morbi a aliquet vivamus.) pushes cjson to failure.

    {
      "cmd": "test",
      "id": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in nunc non elit gravida ultricies. Integer sed convallis nibh. Duis bibendum vehicula massa, eget egestas nibh iaculis ut. Praesent bibendum hendrerit purus vel pharetra. Sed tortor nulla, lobortis volutpat lacinia ac, bibendum ut nibh. Ut eleifend eu mauris a volutpat. Donec erat nisl, ultrices pharetra velit quis, malesuada bibendum augue. Ut semper neque eu sapien tempor molestie. Morbi vel pharetra dui, in rhoncus magna. Nulla facilisi. Proin eu dapibus ipsum. Proin luctus turpis in lacinia semper. Duis massa lorem, blandit sed turpis id, tincidunt cursus magna. Vestibulum mattis odio hendrerit facilisis dictum. Integer eu neque in arcu pulvinar porta.
    
    Pellentesque nec elit in ligula blandit consectetur. Donec scelerisque et mauris sed bibendum. Sed id enim vitae tellus imperdiet tempor eu nec tortor. Cras dignissim odio eu velit vehicula, nec viverra ipsum efficitur. Proin ullamcorper congue imperdiet. In egestas nibh at dignissim porttitor. Maecenas in dui cursus, rutrum ipsum et, convallis ante.
    
    Aenean euismod est et metus dignissim volutpat. Vestibulum a maximus lectus, in tincidunt lectus. Phasellus pretium vel eros non feugiat. In hac habitasse platea dictumst. Fusce vehicula metus ut tempus porttitor. Aenean porta, felis finibus semper vulputate, ipsum arcu viverra magna, id luctus mi lorem nec elit. Quisque molestie finibus dapibus. Proin id velit velit. Suspendisse maximus hendrerit nisi, quis faucibus tortor iaculis quis. Morbi a aliquet vivamus."
    }
    
      malformed before: Lorem ipsum dolor sit amet, co....
      
    (1592 bytes)
    


    Tried with 

    cJSON_Parse and cJSON_ParseWithOpts, both yield the same result

    Did also try increasing the stack size for the thread using the cJSON_Parse functionality, and sys heap pool
    init is also called at the beginning of the program

    source:

    void message_cb(char const * msg, size_t len) {
        for (size_t i = 0; i < len; i++) {
            printk("%c", msg[i]);
        }
        printk("\r\n");
        
        LOG_PRINTK("(%u bytes)\r\n", len);
    
        cJSON const * verb;
        cJSON const * time_st;
        /**
         * @brief  each msg from ccu should come with an id, that will ve replied back 
         * regardless if msg was correct or not, with status
         */
        cJSON const * id; 
        /**
         * @brief Is message correct or not.
         */
        struct msg_status status;
        status.id = 0;
        status.status = MSG_OK;
    
        cJSON * cmd = cJSON_Parse(msg);
        // cJSON * cmd = cJSON_ParseWithOpts(msg, 0, 1);
        if (cmd == NULL) {
            
            printk("Error parsing JSON: %s\r\n", msg);
            char const * error_ptr = cJSON_GetErrorPtr();
            if (error_ptr != NULL) {
                LOG_ERR("current thread: %p", k_current_get());
                printk("  malformed before: %s\r\n", error_ptr);
            }
            status.status = MSG_MALFORMED;
            goto exit;
        }
        ...
    }





    As I was writing this,
    I figured I'd try moving cJSON_Init() to the thread that is using cJSON_Parse, and that seems to have worked.

    Working, for me, no malformation:
    {
      "cmd": "test",
      "id": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi pretium luctus ex, quis imperdiet mauris consequat egestas. Fusce eget massa iaculis, ultrices quam sed, consectetur mi. Proin sed leo nec ante sodales gravida in non urna. Aenean rhoncus convallis odio, in ultricies arcu rhoncus id. Duis sagittis, quam eget mattis rhoncus, neque justo volutpat ligula, eu lobortis arcu mi sed mauris. Cras non orci laoreet augue vestibulum sodales. Pellentesque at tortor vitae dui euismod finibus a et tellus. Sed mi erat, porta ac velit quis, consequat fringilla orci. Proin ullamcorper lobortis erat, et facilisis mauris varius sit amet. Curabitur suscipit augue felis, quis sollicitudin ex ullamcorper sed. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla aliquam sapien in purus aliquet lacinia. Aliquam non ornare lectus. Mauris luctus congue mauris vel vestibulum. Suspendisse ornare facilisis neque, non vulputate ante egestas quis. Morbi in elit ipsum.
    
    Pellentesque malesuada nisl in velit euismod, ac facilisis nibh egestas. Morbi elementum viverra augue, dignissim auctor tellus porta et. Aliquam mauris neque, interdum ac aliquet eu, tincidunt in dui. Pellentesque dignissim mauris diam, vitae varius turpis luctus et. Donec et rhoncus purus. Donec id mattis lorem. Praesent vel dui id magna aliquam consectetur. Maecenas interdum nisi metus, in suscipit felis porttitor vitae. Aenean ullamcorper, ex a accumsan dictum, nisi nulla dignissim turpis, id porttitor dolor dolor ac odio. Suspendisse ut dolor consectetur ex lobortis feugiat. Donec non sem a libero fermentum mattis. Praesent pretium mi nunc, sit amet auctor lorem blandit sit amet. Maecenas gravida sodales pulvinar.
    
    Nunc magna magna, blandit lacinia neque bibendum, vulputate tempor nisi. Nunc suscipit at purus nec pellentesque. Proin dictum mauris vel risus auctor, nec elementum justo porta. Donec vitae justo sed urna sodales scelerisque eu quis elit. Nullam id lacus nec sem nam."
    }
    (2044 bytes)
    



    Perhaps it works also when calling the cjson init from the workqueue thread.

Reply
  • Hello, 
    I seem to be having a similar, issue.

    Has there been any progress on this?

    I'll add my example just in case it helps.

    This is correctly handled:

    {
      "cmd": "test",
      "id": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in nunc non elit gravida ultricies. Integer sed convallis nibh. Duis bibendum vehicula massa, eget egestas nibh iaculis ut. Praesent bibendum hendrerit purus vel pharetra. Sed tortor nulla, lobortis volutpat lacinia ac, bibendum ut nibh. Ut eleifend eu mauris a volutpat. Donec erat nisl, ultrices pharetra velit quis, malesuada bibendum augue. Ut semper neque eu sapien tempor molestie. Morbi vel pharetra dui, in rhoncus magna. Nulla facilisi. Proin eu dapibus ipsum. Proin luctus turpis in lacinia semper. Duis massa lorem, blandit sed turpis id, tincidunt cursus magna. Vestibulum mattis odio hendrerit facilisis dictum. Integer eu neque in arcu pulvinar porta.
    
    Pellentesque nec elit in ligula blandit consectetur. Donec scelerisque et mauris sed bibendum. Sed id enim vitae tellus imperdiet tempor eu nec tortor. Cras dignissim odio eu velit vehicula, nec viverra ipsum efficitur. Proin ullamcorper congue imperdiet. In egestas nibh at dignissim porttitor. Maecenas in dui cursus, rutrum ipsum et, convallis ante.
    
    Aenean euismod est et metus dignissim volutpat. Vestibulum a maximus lectus, in tincidunt lectus. Phasellus pretium vel eros non feugiat. In hac habitasse platea dictumst. Fusce vehicula metus ut tempus porttitor. Aenean porta, felis finibus semper vulputate, ipsum arcu viverra magna, id luctus mi lorem nec elit. Quisque molestie finibus dapibus. Proin id velit velit. Suspendisse maximus hendrerit nisi, quis faucibus tortor iaculis quis."
    }


    Adding in an extra sentence at the end ( Morbi a aliquet vivamus.) pushes cjson to failure.

    {
      "cmd": "test",
      "id": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in nunc non elit gravida ultricies. Integer sed convallis nibh. Duis bibendum vehicula massa, eget egestas nibh iaculis ut. Praesent bibendum hendrerit purus vel pharetra. Sed tortor nulla, lobortis volutpat lacinia ac, bibendum ut nibh. Ut eleifend eu mauris a volutpat. Donec erat nisl, ultrices pharetra velit quis, malesuada bibendum augue. Ut semper neque eu sapien tempor molestie. Morbi vel pharetra dui, in rhoncus magna. Nulla facilisi. Proin eu dapibus ipsum. Proin luctus turpis in lacinia semper. Duis massa lorem, blandit sed turpis id, tincidunt cursus magna. Vestibulum mattis odio hendrerit facilisis dictum. Integer eu neque in arcu pulvinar porta.
    
    Pellentesque nec elit in ligula blandit consectetur. Donec scelerisque et mauris sed bibendum. Sed id enim vitae tellus imperdiet tempor eu nec tortor. Cras dignissim odio eu velit vehicula, nec viverra ipsum efficitur. Proin ullamcorper congue imperdiet. In egestas nibh at dignissim porttitor. Maecenas in dui cursus, rutrum ipsum et, convallis ante.
    
    Aenean euismod est et metus dignissim volutpat. Vestibulum a maximus lectus, in tincidunt lectus. Phasellus pretium vel eros non feugiat. In hac habitasse platea dictumst. Fusce vehicula metus ut tempus porttitor. Aenean porta, felis finibus semper vulputate, ipsum arcu viverra magna, id luctus mi lorem nec elit. Quisque molestie finibus dapibus. Proin id velit velit. Suspendisse maximus hendrerit nisi, quis faucibus tortor iaculis quis. Morbi a aliquet vivamus."
    }
    
      malformed before: Lorem ipsum dolor sit amet, co....
      
    (1592 bytes)
    


    Tried with 

    cJSON_Parse and cJSON_ParseWithOpts, both yield the same result

    Did also try increasing the stack size for the thread using the cJSON_Parse functionality, and sys heap pool
    init is also called at the beginning of the program

    source:

    void message_cb(char const * msg, size_t len) {
        for (size_t i = 0; i < len; i++) {
            printk("%c", msg[i]);
        }
        printk("\r\n");
        
        LOG_PRINTK("(%u bytes)\r\n", len);
    
        cJSON const * verb;
        cJSON const * time_st;
        /**
         * @brief  each msg from ccu should come with an id, that will ve replied back 
         * regardless if msg was correct or not, with status
         */
        cJSON const * id; 
        /**
         * @brief Is message correct or not.
         */
        struct msg_status status;
        status.id = 0;
        status.status = MSG_OK;
    
        cJSON * cmd = cJSON_Parse(msg);
        // cJSON * cmd = cJSON_ParseWithOpts(msg, 0, 1);
        if (cmd == NULL) {
            
            printk("Error parsing JSON: %s\r\n", msg);
            char const * error_ptr = cJSON_GetErrorPtr();
            if (error_ptr != NULL) {
                LOG_ERR("current thread: %p", k_current_get());
                printk("  malformed before: %s\r\n", error_ptr);
            }
            status.status = MSG_MALFORMED;
            goto exit;
        }
        ...
    }





    As I was writing this,
    I figured I'd try moving cJSON_Init() to the thread that is using cJSON_Parse, and that seems to have worked.

    Working, for me, no malformation:
    {
      "cmd": "test",
      "id": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi pretium luctus ex, quis imperdiet mauris consequat egestas. Fusce eget massa iaculis, ultrices quam sed, consectetur mi. Proin sed leo nec ante sodales gravida in non urna. Aenean rhoncus convallis odio, in ultricies arcu rhoncus id. Duis sagittis, quam eget mattis rhoncus, neque justo volutpat ligula, eu lobortis arcu mi sed mauris. Cras non orci laoreet augue vestibulum sodales. Pellentesque at tortor vitae dui euismod finibus a et tellus. Sed mi erat, porta ac velit quis, consequat fringilla orci. Proin ullamcorper lobortis erat, et facilisis mauris varius sit amet. Curabitur suscipit augue felis, quis sollicitudin ex ullamcorper sed. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla aliquam sapien in purus aliquet lacinia. Aliquam non ornare lectus. Mauris luctus congue mauris vel vestibulum. Suspendisse ornare facilisis neque, non vulputate ante egestas quis. Morbi in elit ipsum.
    
    Pellentesque malesuada nisl in velit euismod, ac facilisis nibh egestas. Morbi elementum viverra augue, dignissim auctor tellus porta et. Aliquam mauris neque, interdum ac aliquet eu, tincidunt in dui. Pellentesque dignissim mauris diam, vitae varius turpis luctus et. Donec et rhoncus purus. Donec id mattis lorem. Praesent vel dui id magna aliquam consectetur. Maecenas interdum nisi metus, in suscipit felis porttitor vitae. Aenean ullamcorper, ex a accumsan dictum, nisi nulla dignissim turpis, id porttitor dolor dolor ac odio. Suspendisse ut dolor consectetur ex lobortis feugiat. Donec non sem a libero fermentum mattis. Praesent pretium mi nunc, sit amet auctor lorem blandit sit amet. Maecenas gravida sodales pulvinar.
    
    Nunc magna magna, blandit lacinia neque bibendum, vulputate tempor nisi. Nunc suscipit at purus nec pellentesque. Proin dictum mauris vel risus auctor, nec elementum justo porta. Donec vitae justo sed urna sodales scelerisque eu quis elit. Nullam id lacus nec sem nam."
    }
    (2044 bytes)
    



    Perhaps it works also when calling the cjson init from the workqueue thread.

Children
Related