Hello.

While updating a patch, I noticed that the replication slot stats
patch (9868167500) put some somewhat doubious codes.

In pgstat_recv_replslot, an assertion like the following exists:

>       idx = pgstat_replslot_index(msg->m_slotname, !msg->m_drop);
..
>       Assert(idx >= 0 && idx < max_replication_slots);

But the idx should be 0..(max_replication_slots - 1).


In the same function the following code assumes that the given "char
*name" has the length of NAMEDATALEN.  It actually is, but that
assumption seems a bit bogus. I think it should use strlcpy instead.


>pgstat_replslot_index(const char *name, bool create_it)
...
>       memcpy(&replSlotStats[nReplSlotStats].slotname, name, NAMEDATALEN);

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index f1dca2f25b..9008601fc4 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -6880,7 +6880,7 @@ pgstat_recv_replslot(PgStat_MsgReplSlot *msg, int len)
 	if (idx < 0)
 		return;
 
-	Assert(idx >= 0 && idx <= max_replication_slots);
+	Assert(idx >= 0 && idx < max_replication_slots);
 	if (msg->m_drop)
 	{
 		/* Remove the replication slot statistics with the given name */
@@ -7113,7 +7113,7 @@ pgstat_replslot_index(const char *name, bool create_it)
 
 	/* Register new slot */
 	memset(&replSlotStats[nReplSlotStats], 0, sizeof(PgStat_ReplSlotStats));
-	memcpy(&replSlotStats[nReplSlotStats].slotname, name, NAMEDATALEN);
+	strlcpy(&replSlotStats[nReplSlotStats].slotname, name, NAMEDATALEN);
 
 	return nReplSlotStats++;
 }

Reply via email to