Parse session-id header case-insensitively (#765)

RFC 2616 defines headers as case-insensitive, so if rpc is behind a
reverse proxy that lowers the case of headers, transmission will not
parse them correctly.

A new wrapper function, `tr_strcasestr` is added to
libtransmission/utils.c to allow for comparisons of headers case
insensitively, and checks in cmake and autogen are included.
This commit is contained in:
LaserEyess 2019-03-17 10:37:52 -04:00 committed by Mike Gelfand
parent e736604fc3
commit 750589101a
7 changed files with 30 additions and 3 deletions

View File

@ -466,6 +466,7 @@ set(NEEDED_FUNCTIONS
pread
pwrite
statvfs
strcasestr
strlcpy
strsep
syslog

View File

@ -2949,6 +2949,7 @@
"-DHAVE_ASPRINTF",
"-DHAVE_LIBGEN",
"-DHAVE_STRCASECMP",
"-DHAVE_STRCASESTR",
"-DHAVE_ZLIB",
"-DHAVE_ICONV",
);
@ -3124,6 +3125,7 @@
"-DHAVE_ASPRINTF",
"-DHAVE_LIBGEN",
"-DHAVE_STRCASECMP",
"-DHAVE_STRCASESTR",
"-DHAVE_ZLIB",
"-DHAVE_ICONV",
);
@ -3352,6 +3354,7 @@
"-DHAVE_ASPRINTF",
"-DHAVE_LIBGEN",
"-DHAVE_STRCASECMP",
"-DHAVE_STRCASESTR",
"-DHAVE_ZLIB",
"-DHAVE_ICONV",
);

View File

@ -110,7 +110,7 @@ AC_HEADER_STDC
AC_HEADER_TIME
AC_CHECK_HEADERS([xlocale.h])
AC_CHECK_FUNCS([iconv pread pwrite lrintf strlcpy daemon dirname basename canonicalize_file_name strcasecmp localtime_r fallocate64 posix_fallocate memmem strsep strtold syslog valloc getpagesize posix_memalign statvfs htonll ntohll mkdtemp uselocale _configthreadlocale])
AC_CHECK_FUNCS([iconv pread pwrite lrintf strlcpy daemon dirname basename canonicalize_file_name strcasecmp localtime_r fallocate64 posix_fallocate memmem strsep strtold syslog valloc getpagesize posix_memalign statvfs htonll ntohll mkdtemp uselocale _configthreadlocale strcasestr])
AC_PROG_INSTALL
AC_PROG_MAKE_SET
ACX_PTHREAD

View File

@ -268,6 +268,10 @@ if(ICONV_FOUND)
target_link_libraries(${TR_NAME} ${ICONV_LIBRARIES})
endif()
if(WIN32)
target_link_libraries(${TR_NAME} shlwapi)
endif()
if(ENABLE_TESTS)
add_library(${TR_NAME}-test STATIC
libtransmission-test.c

View File

@ -184,7 +184,7 @@ static void handle_upload(struct evhttp_request* req, struct tr_rpc_server* serv
{
struct tr_mimepart* p = tr_ptrArrayNth(&parts, i);
if (tr_memmem(p->headers, p->headers_len, TR_RPC_SESSION_ID_HEADER, strlen(TR_RPC_SESSION_ID_HEADER)) != NULL)
if (tr_strcasestr(p->headers, TR_RPC_SESSION_ID_HEADER) != NULL)
{
char const* ours = get_current_session_id(server);
size_t const ourlen = strlen(ours);

View File

@ -29,6 +29,7 @@
#include <ws2tcpip.h> /* WSAStartup() */
#include <windows.h> /* Sleep(), GetSystemTimeAsFileTime(), GetEnvironmentVariable() */
#include <shellapi.h> /* CommandLineToArgv() */
#include <shlwapi.h> /* StrStrIA() */
#else
#include <sys/time.h>
#include <unistd.h> /* getpagesize() */
@ -456,6 +457,23 @@ char const* tr_memmem(char const* haystack, size_t haystacklen, char const* need
#endif
}
char const* tr_strcasestr(char const* haystack, char const* needle)
{
#ifdef HAVE_STRCASESTR
return strcasestr(haystack, needle);
#elif defined(_WIN32)
return StrStrIA(haystack, needle);
#else
#error please open a PR to implement tr_strcasestr() for your platform
#endif
}
char* tr_strdup_printf(char const* fmt, ...)
{
va_list ap;

View File

@ -14,6 +14,7 @@
#include <string.h> /* strcmp */
#include <event2/buffer.h>
#include <event2/util.h>
#define CURL_DISABLE_TYPECHECK /* otherwise -Wunreachable-code goes insane */
#include <curl/curl.h>
@ -792,7 +793,7 @@ static size_t parseResponseHeader(void* ptr, size_t size, size_t nmemb, void* st
char const* key = TR_RPC_SESSION_ID_HEADER ": ";
size_t const key_len = strlen(key);
if (line_len >= key_len && memcmp(line, key, key_len) == 0)
if (line_len >= key_len && evutil_ascii_strncasecmp(line, key, key_len) == 0)
{
char const* begin = line + key_len;
char const* end = begin;