Commit 9f72db13 authored by Dan Fandrich's avatar Dan Fandrich
Browse files

Fixed an out of memory handling issue with HTTP pipelines.

parent acc4868b
Loading
Loading
Loading
Loading
+27 −26
Original line number Diff line number Diff line
@@ -121,9 +121,9 @@ struct Curl_one_easy {
#define CURL_MULTI_HANDLE 0x000bab1e

#define GOOD_MULTI_HANDLE(x) \
  ((x)&&(((struct Curl_multi *)x)->type == CURL_MULTI_HANDLE))
  ((x)&&(((struct Curl_multi *)(x))->type == CURL_MULTI_HANDLE))
#define GOOD_EASY_HANDLE(x) \
 (((struct SessionHandle *)x)->magic == CURLEASY_MAGIC_NUMBER)
 (((struct SessionHandle *)(x))->magic == CURLEASY_MAGIC_NUMBER)

/* This is the struct known as CURLM on the outside */
struct Curl_multi {
@@ -180,7 +180,7 @@ static void add_closure(struct Curl_multi *multi,
static int update_timer(struct Curl_multi *multi);

#ifdef CURLDEBUG
static const char *statename[]={
static const char * const statename[]={
  "INIT",
  "CONNECT",
  "WAITRESOLVE",
@@ -896,9 +896,9 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,

      if(CURLE_OK == easy->result) {
        /* Add this handle to the send pipeline */
        Curl_addHandleToPipeline(easy->easy_handle,
        easy->result = Curl_addHandleToPipeline(easy->easy_handle,
                                                easy->easy_conn->send_pipe);

	if(CURLE_OK == easy->result) {
	  if(async)
	    /* We're now waiting for an asynchronous name lookup */
	    multistate(easy, CURLM_STATE_WAITRESOLVE);
@@ -920,6 +920,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
	    }
	  }
	}
      }
      break;

    case CURLM_STATE_WAITRESOLVE:
@@ -1153,7 +1154,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
      Curl_removeHandleFromPipeline(easy->easy_handle,
                                    easy->easy_conn->send_pipe);
      /* Add ourselves to the recv pipeline */
      Curl_addHandleToPipeline(easy->easy_handle,
      easy->result = Curl_addHandleToPipeline(easy->easy_handle,
                                              easy->easy_conn->recv_pipe);
      multistate(easy, CURLM_STATE_WAITPERFORM);
      result = CURLM_CALL_MULTI_PERFORM;
+8 −3
Original line number Diff line number Diff line
@@ -1925,7 +1925,7 @@ static bool IsPipeliningEnabled(struct SessionHandle *handle)
  return FALSE;
}

void Curl_addHandleToPipeline(struct SessionHandle *data,
CURLcode Curl_addHandleToPipeline(struct SessionHandle *data,
                                  struct curl_llist *pipe)
{
#ifdef CURLDEBUG
@@ -1935,7 +1935,9 @@ void Curl_addHandleToPipeline(struct SessionHandle *data,
      infof(data, "PIPE when no PIPE supposed!\n");
  }
#endif
  Curl_llist_insert_next(pipe, pipe->tail, data);
  if (!Curl_llist_insert_next(pipe, pipe->tail, data))
    return CURLE_OUT_OF_MEMORY;
  return CURLE_OK;
}


@@ -1995,6 +1997,9 @@ static void signalPipeClose(struct curl_llist *pipe)
{
  struct curl_llist_element *curr;

  if (!pipe)
    return;

  curr = pipe->head;
  while (curr) {
    struct curl_llist_element *next = curr->next;
+2 −2
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ int Curl_doing_getsock(struct connectdata *conn,
                       curl_socket_t *socks,
                       int numsocks);

void Curl_addHandleToPipeline(struct SessionHandle *handle,
CURLcode Curl_addHandleToPipeline(struct SessionHandle *handle,
                                  struct curl_llist *pipe);
int Curl_removeHandleFromPipeline(struct SessionHandle *handle,
                                  struct curl_llist *pipe);