From b675c55f6dd3ccb9bccb77c1f3d97cb7cb7b2cb5 Mon Sep 17 00:00:00 2001 From: slguan Date: Thu, 12 Sep 2019 22:42:28 +0800 Subject: [PATCH] fix issue #506 --- src/client/src/tscSql.c | 33 ++++++++++++++++++++++++++++++--- src/inc/tutil.h | 2 ++ src/util/src/tutil.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index 594164da6b..3ff8cbf0bd 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -134,11 +134,38 @@ TAOS *taos_connect(char *ip, char *user, char *pass, char *db, int port) { void *taos = taos_connect_imp(ip, user, pass, db, port, NULL, NULL, NULL); if (taos != NULL) { + int clientVersionNumber[4] = {0}; + if (!taosGetVersionNumber(version, clientVersionNumber)) { + tscError("taos:%p, invalid client version:%s", taos, version); + globalCode = TSDB_CODE_INVALID_CLIENT_VERSION; + return NULL; + } + char *server_version = taos_get_server_info(taos); - if (server_version && strcmp(server_version, version) != 0) { - tscError("taos:%p, server version:%s not equal with client version:%s, close connection", + int serverVersionNumber[4] = {0}; + if (!taosGetVersionNumber(server_version, serverVersionNumber)) { + tscError("taos:%p, invalid server version:%s", taos, server_version); + globalCode = TSDB_CODE_INVALID_CLIENT_VERSION; + return NULL; + } + + if (clientVersionNumber[0] != serverVersionNumber[0]) { + tscError("taos:%p, the 1st number of server version:%s not matched with client version:%s, close connection", + taos, server_version, version); + globalCode = TSDB_CODE_INVALID_CLIENT_VERSION; + return NULL; + } + + if (clientVersionNumber[1] != serverVersionNumber[1]) { + tscError("taos:%p, the 2nd number of server version:%s not matched with client version:%s, close connection", + taos, server_version, version); + globalCode = TSDB_CODE_INVALID_CLIENT_VERSION; + return NULL; + } + + if (clientVersionNumber[2] != serverVersionNumber[2]) { + tscError("taos:%p, the 3rd number of server version:%s not matched with client version:%s, close connection", taos, server_version, version); - taos_close(taos); globalCode = TSDB_CODE_INVALID_CLIENT_VERSION; return NULL; } diff --git a/src/inc/tutil.h b/src/inc/tutil.h index a9de168fae..3fe1ab33ea 100644 --- a/src/inc/tutil.h +++ b/src/inc/tutil.h @@ -221,6 +221,8 @@ bool taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs); bool taosValidateEncodec(char *encodec); +bool taosGetVersionNumber(char *versionStr, int *versionNubmer); + static FORCE_INLINE void taosEncryptPass(uint8_t *inBuf, unsigned int inLen, char *target) { MD5_CTX context; MD5Init(&context); diff --git a/src/util/src/tutil.c b/src/util/src/tutil.c index d2865ec31d..e239471b51 100644 --- a/src/util/src/tutil.c +++ b/src/util/src/tutil.c @@ -469,4 +469,33 @@ bool taosValidateEncodec(char *encodec) { #else return true; #endif +} + +bool taosGetVersionNumber(char *versionStr, int *versionNubmer) { + if (versionStr == NULL || versionNubmer == NULL) { + return false; + } + + int versionNumberPos[4] = {0}; + int len = strlen(versionStr); + int dot = 0; + for (int pos = 0; pos < len && dot < 4; ++pos) { + if (versionStr[pos] == '.') { + versionStr[pos] = 0; + versionNumberPos[++dot] = pos + 1; + } + } + + if (dot != 3) { + return false; + } + + for (int pos = 0; pos < 4; ++pos) { + versionNubmer[pos] = atoi(versionStr + versionNumberPos[pos]); + } + versionStr[versionNumberPos[1] - 1] = '.'; + versionStr[versionNumberPos[2] - 1] = '.'; + versionStr[versionNumberPos[3] - 1] = '.'; + + return true; } \ No newline at end of file -- GitLab