From 8a8a493b673b7a4fd92653e191d7995d67543f3b Mon Sep 17 00:00:00 2001 From: Maksim Melnikov Date: Mon, 7 Apr 2025 13:42:16 +0300 Subject: [PATCH] Possible undefined behavior for bit shift in citus_stat_tenants.c --- src/backend/distributed/utils/citus_stat_tenants.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/utils/citus_stat_tenants.c b/src/backend/distributed/utils/citus_stat_tenants.c index 1ca4fc6f1..5dd9f5593 100644 --- a/src/backend/distributed/utils/citus_stat_tenants.c +++ b/src/backend/distributed/utils/citus_stat_tenants.c @@ -48,6 +48,9 @@ ExecutorEnd_hook_type prev_ExecutorEnd = NULL; #define ATTRIBUTE_STRING_FORMAT_WITHOUT_TID "/*{\"cId\":%d}*/" #define STAT_TENANTS_COLUMNS 9 #define ONE_QUERY_SCORE 1000000000 +#define BYTE_TO_BIT 3 /* 2^3 bits/byte */ +#define TENANTS_STATS_FIELD_BIT_LENGTH(tenantStats, field) (sizeof((tenantStats)->field) \ + << BYTE_TO_BIT) static char AttributeToTenant[MAX_TENANT_ATTRIBUTE_LENGTH] = ""; static CmdType AttributeToCommandType = CMD_UNKNOWN; @@ -605,8 +608,12 @@ ReduceScoreIfNecessary(TenantStats *tenantStats, TimestampTz queryTime) */ if (periodCountAfterLastScoreReduction > 0) { - tenantStats->score >>= periodCountAfterLastScoreReduction; tenantStats->lastScoreReduction = queryTime; + /*addtional check to avoid undefined behavior */ + tenantStats->score = (periodCountAfterLastScoreReduction < + TENANTS_STATS_FIELD_BIT_LENGTH(tenantStats, score)) + ? tenantStats->score >> periodCountAfterLastScoreReduction + : 0; } }