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

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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions