Commit 62085470 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

PIPELINING_SERVER_BL: cleanup the internal list use

The list was freed incorrectly since the llist refactor of
cbae73e1. Added test 1550 to verify that it works and avoid future
regressions.

Reported-by: Pascal Terjan

Fixes #1584
Closes #1585
parent 65ca0305
Loading
Loading
Loading
Loading
+15 −22
Original line number Diff line number Diff line
@@ -230,28 +230,27 @@ CURLMcode Curl_pipeline_set_site_blacklist(char **sites,
  return CURLM_OK;
}

struct blacklist_node {
  struct curl_llist_element list;
  char server_name[1];
};

bool Curl_pipeline_server_blacklisted(struct Curl_easy *handle,
                                      char *server_name)
{
  if(handle->multi && server_name) {
    struct curl_llist *blacklist =
    struct curl_llist *list =
      Curl_multi_pipelining_server_bl(handle->multi);

    if(blacklist) {
      struct curl_llist_element *curr;

      curr = blacklist->head;
      while(curr) {
        char *bl_server_name;

        bl_server_name = curr->ptr;
        if(strncasecompare(bl_server_name, server_name,
                           strlen(bl_server_name))) {
    struct curl_llist_element *e = list->head;
    while(e) {
      struct blacklist_node *bl = (struct blacklist_node *)e;
      if(strncasecompare(bl->server_name, server_name,
                         strlen(bl->server_name))) {
        infof(handle, "Server %s is blacklisted\n", server_name);
        return TRUE;
      }
        curr = curr->next;
      }
      e = e->next;
    }

    DEBUGF(infof(handle, "Server %s is not blacklisted\n", server_name));
@@ -259,11 +258,6 @@ bool Curl_pipeline_server_blacklisted(struct Curl_easy *handle,
  return FALSE;
}

struct blacklist_node {
  struct curl_llist_element list;
  char server_name[1];
};

CURLMcode Curl_pipeline_set_server_blacklist(char **servers,
                                             struct curl_llist *list)
{
@@ -286,8 +280,7 @@ CURLMcode Curl_pipeline_set_server_blacklist(char **servers,
      }
      strcpy(n->server_name, *servers);

      Curl_llist_insert_next(list, list->tail, n->server_name,
                             &n->list);
      Curl_llist_insert_next(list, list->tail, n, &n->list);
      servers++;
    }
  }
+1 −0
Original line number Diff line number Diff line
@@ -165,6 +165,7 @@ test1520 test1521 \
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
test1533 test1534 test1535 test1536 test1537 test1538 \
test1540 \
test1550 \
test1600 test1601 test1602 test1603 test1604 test1605 test1606 \
\
test1700 test1701 test1702 \

tests/data/test1550

0 → 100644
+29 −0
Original line number Diff line number Diff line
<testcase>
<info>
<keywords>
multi
</keywords>
</info>

# Server-side
<reply>
</reply>

# Client-side
<client>
<server>
none
</server>
# tool is what to use instead of 'curl'
<tool>
lib1550
</tool>

 <name>
verify setting pipeling blacklisting options
 </name>
 <command>
http://%HOSTIP:%HTTPPORT/1550
</command>
</client>
</testcase>
+8 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
 lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
 lib1534 lib1535 lib1536 lib1537 lib1538 \
 lib1540 \
 lib1550 \
 lib1900 \
 lib2033

@@ -431,6 +432,13 @@ lib1540_SOURCES = lib1540.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1540_LDADD = $(TESTUTIL_LIBS)
lib1540_CPPFLAGS = $(AM_CPPFLAGS)

lib1541_SOURCES = lib1541.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1541_LDADD = $(TESTUTIL_LIBS)
lib1541_CPPFLAGS = $(AM_CPPFLAGS)

lib1550_SOURCES = lib1550.c $(SUPPORTFILES)
lib1550_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1517

lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
+39 −0
Original line number Diff line number Diff line
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "test.h"

#include "memdebug.h"

#include <curl/multi.h>

int test(char *URL)
{
  CURLM *handle = curl_multi_init();
  const char *bl_servers[] = {"Microsoft-IIS/6.0", "nginx/0.8.54", NULL};
  const char *bl_sites[] = {"curl.haxx.se:443", "example.com:80", NULL};
  (void)URL; /* unused */

  curl_multi_setopt(handle, CURLMOPT_PIPELINING_SERVER_BL, bl_servers);
  curl_multi_setopt(handle, CURLMOPT_PIPELINING_SITE_BL, bl_sites);
  curl_multi_cleanup(handle);
  return 0;
}