Skip to content
This repository was archived by the owner on Sep 13, 2020. It is now read-only.
This repository was archived by the owner on Sep 13, 2020. It is now read-only.

embedded library seems to run infinite loop inside parseProcessNextPushNotification function. #61

@dfszb

Description

@dfszb

Testing / evaluating parse using an Ubuntu Linux computer.
Parse UNIX library seems to be in a continuous loop eating 100% of CPU.
The problematic code seems to be in parse.c, function: int parseProcessNextPushNotification(ParseClient client), the following lines:

        while (length == -1 && parse_push_message_size < sizeof(parse_push_message_buffer)) {
            CURLcode result = curl_easy_recv(clientInternal->pushCurlHandle,
                                             parse_push_message_buffer + parse_push_message_size,
                                             sizeof(parse_push_message_buffer) - parse_push_message_size,
                                             &read);
            if (result == CURLE_OK) {
                parseLog(PARSE_LOG_INFO, "got ok!\n");
                parse_push_message_size += read;
                message = (char *)getPushJson(parse_push_message_buffer,
                                              parse_push_message_size,
                                              &start,
                                              &length);
            } else if (result == CURLE_AGAIN) {
                break;
            } else {
                parseLog(PARSE_LOG_ERROR, "curl_easy_recv read %i an error %s\n", length, curl_easy_strerror(result));
                if (clientInternal->pushCallback != NULL) {
                    clientInternal->pushCallback(client, ECONNRESET, NULL);
                }
                return 0;
            }
        }

The while loop continues to run as the CURLcode result = curl_easy_recv returns CURLE_OK.
However the 'read' parameter passed to curl_easy_recv has a value of 0 after call that indicates a closed connection according to http://curl.haxx.se/libcurl/c/curl_easy_recv.html.
The result is 100% cpu utilization and inability to process subsequent push messages.
I think the correct form would be to use if ((result == CURLE_OK) && (read > 0))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions