From 979d73fbb26ff3eac2a9a55d954dfd6c4a9d3c9c Mon Sep 17 00:00:00 2001 From: stephenkgu Date: Sun, 6 Dec 2020 09:25:49 +0800 Subject: [PATCH 1/4] mnode/table: separate table id prefix from mnodeRetrieveShowTables prep for cross db create table checking in mnodeDoCreateChildTable --- src/common/inc/tname.h | 2 ++ src/common/src/tname.c | 9 ++++++++- src/mnode/src/mnodeTable.c | 4 +--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/common/inc/tname.h b/src/common/inc/tname.h index 6c48ca72f3..213aef1bd8 100644 --- a/src/common/inc/tname.h +++ b/src/common/inc/tname.h @@ -25,6 +25,8 @@ void extractTableName(const char *tableId, char *name); char* extractDBName(const char *tableId, char *name); +int32_t tableIdPrefix(const char* pDb, char* prefix, int32_t len); + void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable); SSchema tGetTableNameColumnSchema(); diff --git a/src/common/src/tname.c b/src/common/src/tname.c index bea8c52ef2..b86a0ad1d0 100644 --- a/src/common/src/tname.c +++ b/src/common/src/tname.c @@ -39,6 +39,13 @@ char* extractDBName(const char* tableId, char* name) { return strncpy(name, &tableId[offset1 + 1], len); } +int32_t tableIdPrefix(const char* name, char* prefix, int32_t len) { + tstrncpy(prefix, name, len); + strcat(prefix, TS_PATH_DELIMITER); + + return strlen(prefix); +} + SSchema tGetTableNameColumnSchema() { SSchema s = {0}; s.bytes = TSDB_TABLE_NAME_LEN - 1 + VARSTR_HEADER_SIZE; @@ -198,4 +205,4 @@ SSchema tscGetTbnameColumnSchema() { strcpy(s.name, TSQL_TBNAME_L); return s; -} \ No newline at end of file +} diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index 2149cb12c0..aa77f5531d 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -2629,9 +2629,7 @@ static int32_t mnodeRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER; char prefix[64] = {0}; - tstrncpy(prefix, pDb->name, 64); - strcat(prefix, TS_PATH_DELIMITER); - int32_t prefixLen = strlen(prefix); + int32_t prefixLen = tableIdPrefix(pDb->name, prefix, 64); char* pattern = NULL; if (pShow->payloadLen > 0) { From 1c33675b016aaf15b3d2f7d2c3441d936788fb52 Mon Sep 17 00:00:00 2001 From: stephenkgu Date: Sun, 6 Dec 2020 10:18:39 +0800 Subject: [PATCH 2/4] [TD-2342]: disallow cross db create child table --- src/mnode/src/mnodeTable.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index aa77f5531d..1505f16812 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -1734,6 +1734,16 @@ static int32_t mnodeDoCreateChildTable(SMnodeMsg *pMsg, int32_t tid) { if (pTable->info.type == TSDB_CHILD_TABLE) { STagData *pTagData = (STagData *)pCreate->schema; // it is a tag key + + char prefix[64] = {0}; + int32_t prefixLen = tableIdPrefix(pMsg->pDb->name, prefix, 64); + if (0 != strncasecmp(prefix, pTagData->name, prefixLen)) { + mError("msg:%p, app:%p table:%s, corresponding super table:%s not in this db", pMsg, pMsg->rpcMsg.ahandle, + pCreate->tableId, pTagData->name); + mnodeDestroyChildTable(pTable); + return TSDB_CODE_MND_INVALID_TABLE_NAME; + } + if (pMsg->pSTable == NULL) pMsg->pSTable = mnodeGetSuperTable(pTagData->name); if (pMsg->pSTable == NULL) { mError("msg:%p, app:%p table:%s, corresponding super table:%s does not exist", pMsg, pMsg->rpcMsg.ahandle, From 4ee6c822cf81fab09a680dbc4b4bbad12bde4638 Mon Sep 17 00:00:00 2001 From: stephenkgu Date: Sun, 6 Dec 2020 12:04:36 +0800 Subject: [PATCH 3/4] use size_t instead of int32_t to avoid possible loss of data --- src/common/inc/tname.h | 2 +- src/common/src/tname.c | 2 +- src/mnode/src/mnodeTable.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/inc/tname.h b/src/common/inc/tname.h index 213aef1bd8..5c2948db76 100644 --- a/src/common/inc/tname.h +++ b/src/common/inc/tname.h @@ -25,7 +25,7 @@ void extractTableName(const char *tableId, char *name); char* extractDBName(const char *tableId, char *name); -int32_t tableIdPrefix(const char* pDb, char* prefix, int32_t len); +size_t tableIdPrefix(const char* pDb, char* prefix, int32_t len); void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable); diff --git a/src/common/src/tname.c b/src/common/src/tname.c index b86a0ad1d0..5c351edf48 100644 --- a/src/common/src/tname.c +++ b/src/common/src/tname.c @@ -39,7 +39,7 @@ char* extractDBName(const char* tableId, char* name) { return strncpy(name, &tableId[offset1 + 1], len); } -int32_t tableIdPrefix(const char* name, char* prefix, int32_t len) { +size_t tableIdPrefix(const char* name, char* prefix, int32_t len) { tstrncpy(prefix, name, len); strcat(prefix, TS_PATH_DELIMITER); diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index 1505f16812..ad50b4929c 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -1736,7 +1736,7 @@ static int32_t mnodeDoCreateChildTable(SMnodeMsg *pMsg, int32_t tid) { STagData *pTagData = (STagData *)pCreate->schema; // it is a tag key char prefix[64] = {0}; - int32_t prefixLen = tableIdPrefix(pMsg->pDb->name, prefix, 64); + size_t prefixLen = tableIdPrefix(pMsg->pDb->name, prefix, 64); if (0 != strncasecmp(prefix, pTagData->name, prefixLen)) { mError("msg:%p, app:%p table:%s, corresponding super table:%s not in this db", pMsg, pMsg->rpcMsg.ahandle, pCreate->tableId, pTagData->name); From 470442ccdc20fc922e61a8ed090eb43ac7b45d0d Mon Sep 17 00:00:00 2001 From: stephenkgu Date: Sun, 6 Dec 2020 12:27:10 +0800 Subject: [PATCH 4/4] use TSDB_CODE_TDB_INVALID_CREATE_TB_MSG instead of TSDB_CODE_MND_INVALID_TABLE_NAME --- src/common/inc/tname.h | 2 +- src/mnode/src/mnodeTable.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/inc/tname.h b/src/common/inc/tname.h index 5c2948db76..9e0093ebfe 100644 --- a/src/common/inc/tname.h +++ b/src/common/inc/tname.h @@ -25,7 +25,7 @@ void extractTableName(const char *tableId, char *name); char* extractDBName(const char *tableId, char *name); -size_t tableIdPrefix(const char* pDb, char* prefix, int32_t len); +size_t tableIdPrefix(const char* name, char* prefix, int32_t len); void extractTableNameFromToken(SStrToken *pToken, SStrToken* pTable); diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index ad50b4929c..ff81c37de7 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -1741,7 +1741,7 @@ static int32_t mnodeDoCreateChildTable(SMnodeMsg *pMsg, int32_t tid) { mError("msg:%p, app:%p table:%s, corresponding super table:%s not in this db", pMsg, pMsg->rpcMsg.ahandle, pCreate->tableId, pTagData->name); mnodeDestroyChildTable(pTable); - return TSDB_CODE_MND_INVALID_TABLE_NAME; + return TSDB_CODE_TDB_INVALID_CREATE_TB_MSG; } if (pMsg->pSTable == NULL) pMsg->pSTable = mnodeGetSuperTable(pTagData->name);