summaryrefslogtreecommitdiffstats
path: root/libmariadb
diff options
context:
space:
mode:
Diffstat (limited to 'libmariadb')
-rw-r--r--libmariadb/.travis.yml103
-rw-r--r--libmariadb/CMakeLists.txt2
-rw-r--r--libmariadb/cmake/FindZStd.cmake2
-rw-r--r--libmariadb/libmariadb/mariadb_lib.c47
-rw-r--r--libmariadb/plugins/pvio/pvio_npipe.c27
-rw-r--r--libmariadb/unittest/libmariadb/charset.c3
-rw-r--r--libmariadb/unittest/libmariadb/connection.c6
7 files changed, 74 insertions, 116 deletions
diff --git a/libmariadb/.travis.yml b/libmariadb/.travis.yml
index d084bc17..aab4dfec 100644
--- a/libmariadb/.travis.yml
+++ b/libmariadb/.travis.yml
@@ -1,10 +1,5 @@
-os: linux
-dist: focal
language: c
-services: docker
-addons:
- hosts:
- - mariadb.example.com
+version: ~> 1.0
cache:
apt: true
@@ -12,98 +7,22 @@ cache:
directories:
- $HOME/docker
-before_install:
- - git clone https://github.com/mariadb-corporation/connector-test-machine.git
- # Load cached docker images
- - if [[ -d $HOME/docker ]]; then ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load"; fi
+env:
+ global: local=0 DB=testc CLEAR_TEXT=0
-install:
- - |-
- if [ -z "$server_branch" ] ; then
- case $TRAVIS_OS_NAME in
- windows)
- connector-test-machine/launch.bat -t "$srv" -v "$v" -d testc
- ;;
- linux)
- source connector-test-machine/launch.sh -t "$srv" -v "$v" -d testc -l "$local" -n "$native"
- ;;
- esac
- fi
-
-
-env: local=0
-
-stages:
- - Minimal
- - name: Enterprise
- if: type = push AND fork = false
- - Community
+import: mariadb-corporation/connector-test-machine:common-build.yml@master
jobs:
- fast_finish: true
- allow_failures:
- - env: srv=maxscale
- - env: srv=skysql
- - env: srv=skysql-ha
- - env: srv=xpand
- - env: srv=mysql v=5.7
- - env: srv=mysql v=8.0
include:
- - stage: Minimal
- env: srv=mariadb v=10.6 packet=8
- name: "CS 10.6"
- - env: srv=mariadb-es
- name: "ES latest"
- if: type = push AND fork = false
- - env: server_branch=10.11
- name: "10.11 Server unit testing"
-
- - stage: Enterprise
- env: srv=mariadb-es v=10.4
- dist: bionic
- name: "ES 10.4"
- - env: srv=mariadb-es v=10.5
- dist: bionic
- name: "ES 10.5"
- - env: srv=mariadb-es v=10.6
- name: "ES 10.6"
- - env: srv=mariadb-es-test v=23.08
- name: "ES 23.08"
- - env: srv=maxscale
- name: "Maxscale"
- - env: srv=xpand
- name: "Xpand"
-
- stage: Community
- env: srv=mariadb v=10.11
- os: windows
- language: shell
- name: "Windows"
- - env: server_branch=10.6
- name: "10.6 Server unit testing"
+ env: srv=mariadb v=10.11 local=1 TEST_OPTION=--ps-protocol
+ name: "CS 10.11 with ps-protocol"
+ - stage: Other
+ env: server_branch=10.6
+ name: "CS 10.6 Server unit testing"
+ - env: server_branch=10.11
+ name: "CS 10.11 Server unit testing"
- env: server_branch=11.3 TEST_OPTION=--ps-protocol
name: "11.3 Server unit testing with ps-protocol"
- - env: srv=mariadb v=10.4 local=1
- dist: bionic
- name: "CS 10.4"
- - env: srv=mariadb v=10.5 local=1
- dist: bionic
- name: "CS 10.5"
- - env: srv=mariadb v=10.9 local=1
- name: "CS 10.9"
- - env: srv=mariadb v=10.10 local=1
- name: "CS 10.10"
- - env: srv=mariadb v=10.11 local=1
- name: "CS 10.11"
- - env: srv=mariadb v=10.11 local=1 TEST_OPTION=--ps-protocol
- name: "CS 10.11 with ps-protocol"
- - env: srv=mariadb v=11.0 local=1
- name: "CS 11.0"
- - env: srv=mariadb v=11.1 local=1
- name: "CS 11.1"
- - env: srv=mysql v=5.7 native=1
- name: "MySQL 5.7"
- - env: srv=mysql v=8.0 native=1
- name: "MySQL 8.0"
script: ./travis.sh
diff --git a/libmariadb/CMakeLists.txt b/libmariadb/CMakeLists.txt
index 206e4e03..4aab676d 100644
--- a/libmariadb/CMakeLists.txt
+++ b/libmariadb/CMakeLists.txt
@@ -36,7 +36,7 @@ SET(CC_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
SET(CPACK_PACKAGE_VERSION_MAJOR 3)
SET(CPACK_PACKAGE_VERSION_MINOR 3)
-SET(CPACK_PACKAGE_VERSION_PATCH 8)
+SET(CPACK_PACKAGE_VERSION_PATCH 9)
SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
MATH(EXPR MARIADB_PACKAGE_VERSION_ID "${CPACK_PACKAGE_VERSION_MAJOR} * 10000 +
${CPACK_PACKAGE_VERSION_MINOR} * 100 +
diff --git a/libmariadb/cmake/FindZStd.cmake b/libmariadb/cmake/FindZStd.cmake
index d03e96fc..f4bb5398 100644
--- a/libmariadb/cmake/FindZStd.cmake
+++ b/libmariadb/cmake/FindZStd.cmake
@@ -10,7 +10,7 @@ find_path(ZSTD_INCLUDE_DIRS
HINTS ${ZSTD_ROOT_DIR}/include)
find_library(ZSTD_LIBRARIES
- NAMES zstd
+ NAMES zstd zstd_static
HINTS ${ZSTD_ROOT_DIR}/lib)
include(FindPackageHandleStandardArgs)
diff --git a/libmariadb/libmariadb/mariadb_lib.c b/libmariadb/libmariadb/mariadb_lib.c
index e8db51a0..36219385 100644
--- a/libmariadb/libmariadb/mariadb_lib.c
+++ b/libmariadb/libmariadb/mariadb_lib.c
@@ -241,18 +241,29 @@ restart:
}
goto restart;
}
- net->last_errno= last_errno;
- if (pos[0]== '#')
+ if (IS_MYSQL_ERROR(last_errno) || IS_MARIADB_ERROR(last_errno))
{
- ma_strmake(net->sqlstate, pos+1, SQLSTATE_LENGTH);
- pos+= SQLSTATE_LENGTH + 1;
+ /* The server appears to have sent an error code within the
+ * range(s) of error codes that should only be generated
+ * client-side.
+ */
+ my_set_error(mysql, CR_MALFORMED_PACKET, SQLSTATE_UNKNOWN, 0);
}
else
{
- strncpy(net->sqlstate, SQLSTATE_UNKNOWN, SQLSTATE_LENGTH);
+ net->last_errno= last_errno;
+ if (pos[0]== '#')
+ {
+ ma_strmake(net->sqlstate, pos+1, SQLSTATE_LENGTH);
+ pos+= SQLSTATE_LENGTH + 1;
+ }
+ else
+ {
+ strncpy(net->sqlstate, SQLSTATE_UNKNOWN, SQLSTATE_LENGTH);
+ }
+ ma_strmake(net->last_error,(char*) pos,
+ min(len,sizeof(net->last_error)-1));
}
- ma_strmake(net->last_error,(char*) pos,
- min(len,sizeof(net->last_error)-1));
}
else
{
@@ -1787,11 +1798,20 @@ restart:
*/
if ((pkt_length=ma_net_safe_read(mysql)) == packet_error)
{
- if (mysql->net.last_errno == CR_SERVER_LOST)
+
+ unsigned int code= mysql->net.last_errno;
+ if (code == CR_SERVER_LOST)
my_set_error(mysql, CR_SERVER_LOST, SQLSTATE_UNKNOWN,
ER(CR_SERVER_LOST_EXTENDED),
"handshake: reading initial communication packet",
errno);
+ else if (IS_MYSQL_ERROR(code) || IS_MARIADB_ERROR(code))
+ ; /* not forged - generated on the client side */
+ else if (mysql->options.use_ssl)
+ my_set_error(mysql, CR_CONNECTION_ERROR, SQLSTATE_UNKNOWN,
+ "Received error packet before completion of TLS handshake. "
+ "The authenticity of the following error cannot be verified:\n%d - %s",
+ code, mysql->net.last_error);
goto error;
}
@@ -1803,17 +1823,6 @@ restart:
mysql->protocol_version= end[0];
end++;
- /* Check if server sends an error */
- if (mysql->protocol_version == 0XFF)
- {
- net_get_error(end, pkt_length - 1, net->last_error, sizeof(net->last_error),
- &net->last_errno, net->sqlstate);
- /* fix for bug #26426 */
- if (net->last_errno == 1040)
- memcpy(net->sqlstate, "08004", SQLSTATE_LENGTH);
- goto error;
- }
-
if (mysql->protocol_version < PROTOCOL_VERSION)
{
net->last_errno= CR_VERSION_ERROR;
diff --git a/libmariadb/plugins/pvio/pvio_npipe.c b/libmariadb/plugins/pvio/pvio_npipe.c
index 17c59cef..d2d5222a 100644
--- a/libmariadb/plugins/pvio/pvio_npipe.c
+++ b/libmariadb/plugins/pvio/pvio_npipe.c
@@ -150,19 +150,38 @@ static BOOL complete_io(HANDLE file, OVERLAPPED *ov, BOOL ret, DWORD timeout, DW
return GetOverlappedResult(file, ov, size, FALSE);
}
+/*
+ Disable posting IO completion event to the port.
+ Handle can be bound to IOCP outside of the connector for other purposes
+ (e.g polling functionality)
+*/
+
+static inline void disable_iocp_notification(HANDLE *h)
+{
+ *h= (HANDLE) ((ULONG_PTR) *h | 1);
+}
+
+static inline void enable_iocp_notification(HANDLE *h)
+{
+ *h= (HANDLE) ((ULONG_PTR) *h & ~1);
+}
+
ssize_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
{
BOOL ret;
ssize_t r= -1;
struct st_pvio_npipe *cpipe= NULL;
DWORD size;
+ HANDLE *h;
if (!pvio || !pvio->data)
return -1;
cpipe= (struct st_pvio_npipe *)pvio->data;
-
+ h= &cpipe->overlapped.hEvent;
+ disable_iocp_notification(h);
ret= ReadFile(cpipe->pipe, buffer, (DWORD)length, NULL, &cpipe->overlapped);
+ enable_iocp_notification(h);
ret= complete_io(cpipe->pipe, &cpipe->overlapped, ret, pvio->timeout[PVIO_READ_TIMEOUT], &size);
r= ret? (ssize_t) size:-1;
@@ -175,13 +194,15 @@ ssize_t pvio_npipe_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
struct st_pvio_npipe *cpipe= NULL;
BOOL ret;
DWORD size;
-
+ HANDLE *h;
if (!pvio || !pvio->data)
return -1;
cpipe= (struct st_pvio_npipe *)pvio->data;
-
+ h= &cpipe->overlapped.hEvent;
+ disable_iocp_notification(h);
ret= WriteFile(cpipe->pipe, buffer, (DWORD)length, NULL , &cpipe->overlapped);
+ enable_iocp_notification(h);
ret= complete_io(cpipe->pipe, &cpipe->overlapped, ret, pvio->timeout[PVIO_WRITE_TIMEOUT], &size);
r= ret ? (ssize_t)size : -1;
return r;
diff --git a/libmariadb/unittest/libmariadb/charset.c b/libmariadb/unittest/libmariadb/charset.c
index b438f8d9..4d17731f 100644
--- a/libmariadb/unittest/libmariadb/charset.c
+++ b/libmariadb/unittest/libmariadb/charset.c
@@ -47,6 +47,9 @@ int bug_8378(MYSQL *mysql) {
MYSQL_RES *res;
MYSQL_ROW row;
+ /* MXS-4898: MaxScale sends utf8mb4 in handshake OK packet */
+ SKIP_MAXSCALE;
+
len= mysql_real_escape_string(mysql, out, TEST_BUG8378_IN, 4);
FAIL_IF(memcmp(out, TEST_BUG8378_OUT, len), "wrong result");
diff --git a/libmariadb/unittest/libmariadb/connection.c b/libmariadb/unittest/libmariadb/connection.c
index 517bc538..fa232cad 100644
--- a/libmariadb/unittest/libmariadb/connection.c
+++ b/libmariadb/unittest/libmariadb/connection.c
@@ -1222,6 +1222,9 @@ static int test_mdev13100(MYSQL *my __attribute__((unused)))
int rc;
FILE *fp;
+ /* MXS-4898: MaxScale sends utf8mb4 in handshake OK packet */
+ SKIP_MAXSCALE;
+
if (!(fp= fopen("./mdev13100.cnf", "w")))
return FAIL;
@@ -1240,6 +1243,7 @@ static int test_mdev13100(MYSQL *my __attribute__((unused)))
diag("Error: %s", mysql_error(mysql));
return FAIL;
}
+ diag("Default charset: %s", mysql_character_set_name(mysql));
FAIL_IF(strcmp("latin2", mysql_character_set_name(mysql)), "Expected charset latin2");
mysql_close(mysql);
@@ -2190,6 +2194,7 @@ void my_status_callback(void *ptr, enum enum_mariadb_status_info type, ...)
{
MARIADB_CONST_STRING *str= va_arg(ap, MARIADB_CONST_STRING *);
strncpy(data->database, str->str, str->length);
+ data->database[str->length]= 0;
}
break;
case SESSION_TRACK_SYSTEM_VARIABLES:
@@ -2200,6 +2205,7 @@ void my_status_callback(void *ptr, enum enum_mariadb_status_info type, ...)
if (!strncmp(key->str, "character_set_client", key->length))
{
strncpy(data->charset, val->str, val->length);
+ data->charset[val->length]= 0;
}
}
break;