diff options
author | Nikolay Perfilov <pnv1@yandex-team.ru> | 2025-02-25 15:32:38 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-25 15:32:38 +0300 |
commit | 9029d02ab1673a1f12cbc821ed0a607f56e04acb (patch) | |
tree | 536ff009183c883632ec8915682b7f04e746dec7 | |
parent | b58a028c6dba00b325267cbf8ac43acb987dc076 (diff) | |
download | ydb-9029d02ab1673a1f12cbc821ed0a607f56e04acb.tar.gz |
Fix cli vulnerabilities found by coverity (#14945)
-rw-r--r-- | ydb/library/benchmarks/gen/tpcds-dbgen/genrand.c | 6 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpcds-dbgen/scd.c | 5 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpcds-dbgen/tdefs.c | 16 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpcds-dbgen/text.c | 7 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpcds-dbgen/w_datetbl.c | 8 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpcds-dbgen/w_item.c | 9 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpch-dbgen/bm_utils.c | 4 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpch-dbgen/print.c | 2 | ||||
-rw-r--r-- | ydb/library/benchmarks/gen/tpch-dbgen/text.c | 3 | ||||
-rw-r--r-- | ydb/library/workload/tpcds/driver.cpp | 4 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/commands/ydb_workload_import.cpp | 4 | ||||
-rw-r--r-- | ydb/public/lib/ydb_cli/dump/restore_impl.h | 2 |
12 files changed, 53 insertions, 17 deletions
diff --git a/ydb/library/benchmarks/gen/tpcds-dbgen/genrand.c b/ydb/library/benchmarks/gen/tpcds-dbgen/genrand.c index 32d9ff2f66..798e8f358c 100644 --- a/ydb/library/benchmarks/gen/tpcds-dbgen/genrand.c +++ b/ydb/library/benchmarks/gen/tpcds-dbgen/genrand.c @@ -189,7 +189,7 @@ genrand_integer (int *dest, int dist, int min, int max, int mean, int stream) break; default: INTERNAL ("Undefined distribution"); - break; + exit(EXIT_FAILURE); } if (dest == NULL) @@ -236,7 +236,7 @@ genrand_key (ds_key_t * dest, int dist, ds_key_t min, ds_key_t max, break; default: INTERNAL ("Undefined distribution"); - break; + exit(EXIT_FAILURE); } if (dest == NULL) @@ -296,7 +296,7 @@ genrand_decimal (decimal_t * dest, int dist, decimal_t * min, decimal_t * max, break; default: INTERNAL ("Undefined distribution"); - break; + exit(EXIT_FAILURE); } dest->number = res.number; diff --git a/ydb/library/benchmarks/gen/tpcds-dbgen/scd.c b/ydb/library/benchmarks/gen/tpcds-dbgen/scd.c index 943cc47389..38bf3e22d8 100644 --- a/ydb/library/benchmarks/gen/tpcds-dbgen/scd.c +++ b/ydb/library/benchmarks/gen/tpcds-dbgen/scd.c @@ -96,6 +96,11 @@ setSCDKeys(int nColumnID, ds_key_t kIndex, char *szBKey, ds_key_t *pkBeginDateKe } nTableID = getTableFromColumn(nColumnID); + // Prevent array overflow. Fixing coverity issue OVERRUN + if (nTableID < 0 || nTableID >= MAX_TABLE) { + INTERNAL("Array arBKeys overflow"); + exit(EXIT_FAILURE); + } nModulo = (int)(kIndex % 6); switch(nModulo) { diff --git a/ydb/library/benchmarks/gen/tpcds-dbgen/tdefs.c b/ydb/library/benchmarks/gen/tpcds-dbgen/tdefs.c index ce5c8c119d..e8197cbd0c 100644 --- a/ydb/library/benchmarks/gen/tpcds-dbgen/tdefs.c +++ b/ydb/library/benchmarks/gen/tpcds-dbgen/tdefs.c @@ -71,7 +71,7 @@ GetRowcountByName(char *szName) int nTable = -1; nTable = GetTableNumber(szName); - if (nTable >= 0) + if (nTable > 0) return(get_rowcount(nTable - 1)); nTable = distsize(szName); @@ -146,11 +146,22 @@ getTdefsByNumber(int nTable) return(&w_tdefs[nTable]); } */ + +void checkTdefsSize(int nTable) { + // Prevent array overflow. Fixing coverity issue OVERRUN + if (nTable < 0 || nTable >= (int)(sizeof(s_tdefs) / sizeof(s_tdefs[0]))) { + INTERNAL("Array s_tdefs overflow"); + exit(EXIT_FAILURE); + } +} + tdef * getSimpleTdefsByNumber(int nTable) { - if (nTable >= S_BRAND) + if (nTable >= S_BRAND) { + checkTdefsSize(nTable - S_BRAND); return(&s_tdefs[nTable - S_BRAND]); + } return(&w_tdefs[nTable]); } @@ -159,6 +170,7 @@ getTdefsByNumber(int nTable) { if (is_set("UPDATE") && is_set("VALIDATE")) { + checkTdefsSize(nTable); if (s_tdefs[nTable].flags & FL_PASSTHRU) { switch(nTable + S_BRAND) diff --git a/ydb/library/benchmarks/gen/tpcds-dbgen/text.c b/ydb/library/benchmarks/gen/tpcds-dbgen/text.c index e841c22131..ff76818773 100644 --- a/ydb/library/benchmarks/gen/tpcds-dbgen/text.c +++ b/ydb/library/benchmarks/gen/tpcds-dbgen/text.c @@ -160,14 +160,13 @@ gen_text(char *dest, int min, int max, int stream) used_space = 0; genrand_integer(&target_len, DIST_UNIFORM, min, max, 0, stream); - if (dest) - *dest = '\0'; - else + if (!dest) { dest = (char *)malloc((max + 1) * sizeof(char)); MALLOC_CHECK(dest); } - + // Prevent using uninitialized *dest. Fixing coverity issue UNINIT + *dest = '\0'; while (target_len > 0) { diff --git a/ydb/library/benchmarks/gen/tpcds-dbgen/w_datetbl.c b/ydb/library/benchmarks/gen/tpcds-dbgen/w_datetbl.c index 83e44ab806..b6103daeb7 100644 --- a/ydb/library/benchmarks/gen/tpcds-dbgen/w_datetbl.c +++ b/ydb/library/benchmarks/gen/tpcds-dbgen/w_datetbl.c @@ -113,6 +113,10 @@ mk_w_date (void * row, ds_key_t index) r->d_fy_year = r->d_year; r->d_fy_quarter_seq = r->d_quarter_seq; r->d_fy_week_seq = r->d_week_seq; + if (r->d_dow >= MAXINT) { + INTERNAL("Int overflow for d_dow"); + exit(EXIT_FAILURE); + } r->d_day_name = weekday_names[r->d_dow + 1]; dist_member (&r->d_holiday, "calendar", day_index, 8); if ((r->d_dow == 5) || (r->d_dow == 6)) @@ -290,6 +294,10 @@ vld_w_date(int nTable, ds_key_t kRow, int *Permutation) r->d_fy_year = r->d_year; r->d_fy_quarter_seq = r->d_quarter_seq; r->d_fy_week_seq = r->d_week_seq; + if (r->d_dow >= MAXINT) { + INTERNAL("Int overflow for d_dow"); + exit(EXIT_FAILURE); + } r->d_day_name = weekday_names[r->d_dow + 1]; dist_member (&r->d_holiday, "calendar", day_index, 8); if ((r->d_dow == 5) || (r->d_dow == 6)) diff --git a/ydb/library/benchmarks/gen/tpcds-dbgen/w_item.c b/ydb/library/benchmarks/gen/tpcds-dbgen/w_item.c index 68ef1aeeab..7cef8b13cd 100644 --- a/ydb/library/benchmarks/gen/tpcds-dbgen/w_item.c +++ b/ydb/library/benchmarks/gen/tpcds-dbgen/w_item.c @@ -58,6 +58,14 @@ struct W_ITEM_TBL g_w_item, g_OldValues; +void validate_string(char *szString, unsigned long maxSize) { + // Prevent passing unterminated string. Fixing coverity issue STRING_NULL + if (strlen(szString) > maxSize) { + INTERNAL("Trying po pass unterminated string"); + exit(EXIT_FAILURE); + } +} + /* * mk_item */ @@ -190,6 +198,7 @@ mk_w_item (void* row, ds_key_t index) gen_charset(r->i_formulation, DIGITS, RS_I_FORMULATION, RS_I_FORMULATION, I_FORMULATION); embed_string(r->i_formulation, "colors", 1, 2, I_FORMULATION); + validate_string(r->i_formulation, RS_I_FORMULATION); changeSCD(SCD_CHAR, &r->i_formulation, &rOldValues->i_formulation, &nFieldChangeFlags, bFirstRecord); pick_distribution (&r->i_color, "colors", 1, 2, I_COLOR); diff --git a/ydb/library/benchmarks/gen/tpch-dbgen/bm_utils.c b/ydb/library/benchmarks/gen/tpch-dbgen/bm_utils.c index cbfc400c04..afd51a1a10 100644 --- a/ydb/library/benchmarks/gen/tpch-dbgen/bm_utils.c +++ b/ydb/library/benchmarks/gen/tpch-dbgen/bm_utils.c @@ -302,7 +302,7 @@ long weight, if (d_path == NULL) { - sprintf(line, "%s%c%s", + snprintf(line, 256, "%s%c%s", env_config(CONFIG_TAG, CONFIG_DFLT), PATH_SEP, path); fp = fopen(line, "r"); OPEN_CHECK(fp, line); @@ -389,7 +389,7 @@ tbl_open(int tbl, char *mode) if (*tdefs[tbl].name == PATH_SEP) strcpy(fullpath, tdefs[tbl].name); else - sprintf(fullpath, "%s%c%s", + snprintf(fullpath, 256, "%s%c%s", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, tdefs[tbl].name); retcode = stat(fullpath, &fstats); diff --git a/ydb/library/benchmarks/gen/tpch-dbgen/print.c b/ydb/library/benchmarks/gen/tpch-dbgen/print.c index c09869e76a..5e54f06d86 100644 --- a/ydb/library/benchmarks/gen/tpch-dbgen/print.c +++ b/ydb/library/benchmarks/gen/tpch-dbgen/print.c @@ -75,7 +75,7 @@ print_prep(int table, int update) } else { - sprintf(upath, "%s%c%s.u%d", + snprintf(upath, 128, "%s%c%s.u%d", env_config(PATH_TAG, PATH_DFLT), PATH_SEP, tdefs[table].name, update); } diff --git a/ydb/library/benchmarks/gen/tpch-dbgen/text.c b/ydb/library/benchmarks/gen/tpch-dbgen/text.c index 03bddb7a47..094bbf640a 100644 --- a/ydb/library/benchmarks/gen/tpch-dbgen/text.c +++ b/ydb/library/benchmarks/gen/tpch-dbgen/text.c @@ -323,6 +323,9 @@ dbg_text(char *tgt, int min, int max, int sd) } else /* chop the new sentence off to match the length target */ { + if (needed >= (DSS_HUGE)sizeof(sentence)) { + INTERNAL_ERROR("Array sentence overflow"); + } sentence[needed] = '\0'; strcpy(cp, sentence); wordlen += needed; diff --git a/ydb/library/workload/tpcds/driver.cpp b/ydb/library/workload/tpcds/driver.cpp index dba8932455..118a415857 100644 --- a/ydb/library/workload/tpcds/driver.cpp +++ b/ydb/library/workload/tpcds/driver.cpp @@ -224,13 +224,13 @@ extern "C" int dist_op(void *dest, int op, char *d_name, int vset, int wset, int if (dest == NULL) { dest = (date_t *)malloc(sizeof(date_t)); } - strtodt(*(date_t **)dest, char_val); + strtodt((date_t *)dest, char_val); break; case TKN_DECIMAL: if (dest == NULL) { dest = (decimal_t *)malloc(sizeof(decimal_t)); } - strtodec(*(decimal_t **)dest,char_val); + strtodec((decimal_t *)dest,char_val); break; } diff --git a/ydb/public/lib/ydb_cli/commands/ydb_workload_import.cpp b/ydb/public/lib/ydb_cli/commands/ydb_workload_import.cpp index c8faed386d..8a91c492d7 100644 --- a/ydb/public/lib/ydb_cli/commands/ydb_workload_import.cpp +++ b/ydb/public/lib/ydb_cli/commands/ydb_workload_import.cpp @@ -226,8 +226,8 @@ private: if (auto* result = MapFindPtr(CsvOutputs, fname)) { return std::make_pair(result->Get(), false); } - auto result = MakeAtomicShared<TFileOutput>(Owner.UploadParams.FileOutputPath / fname); - CsvOutputs[fname] = result; + auto& result = CsvOutputs[fname]; + result = MakeAtomicShared<TFileOutput>(Owner.UploadParams.FileOutputPath / fname); return std::make_pair(result.Get(), true); } TMap<TString, TAtomicSharedPtr<TFileOutput>> CsvOutputs; diff --git a/ydb/public/lib/ydb_cli/dump/restore_impl.h b/ydb/public/lib/ydb_cli/dump/restore_impl.h index 73c35a39c7..af28e1eecc 100644 --- a/ydb/public/lib/ydb_cli/dump/restore_impl.h +++ b/ydb/public/lib/ydb_cli/dump/restore_impl.h @@ -72,7 +72,7 @@ class IDataAccumulator; class TBatch { TStringBuilder Data; TVector<TLocation> Locations; - IDataAccumulator* OriginAccumulator; + IDataAccumulator* OriginAccumulator = nullptr; public: void Add(const TLine& line); |