Report better object limits in error messages for injection points
authorMichael Paquier <michael@paquier.xyz>
Wed, 12 Nov 2025 01:19:17 +0000 (10:19 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 12 Nov 2025 01:19:17 +0000 (10:19 +0900)
Previously, error messages for oversized injection point names, libraries,
and functions showed buffer sizes (64, 128, 128) instead of the usable
character limits (63, 127, 127) as it did not count for the
zero-terminated byte, which was confusing.  These messages are adjusted
to show better the reality.

The limit enforced for the private area was also too strict by one byte,
as specifying a zone worth exactly INJ_PRIVATE_MAXLEN should be able to
work because three is no zero-terminated byte in this case.

This is a stylistic change (well, mostly, a private_area size of exactly
1024 bytes can be defined with this change, something that nobody seem
to care about based on the lack of complaints).  However, this is a
testing facility let's keep the logic consistent across all the branches
where this code exists, as there is an argument in favor of out-of-core
extensions that use injection points.

Author: Xuneng Zhou <xunengzhou@gmail.com>
Co-authored-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/CABPTF7VxYp4Hny1h+7ejURY-P4O5-K8WZg79Q3GUx13cQ6B2kg@mail.gmail.com
Backpatch-through: 17

src/backend/utils/misc/injection_point.c

index f58ebc8ee522d2262600965a9478d83a55c4cc30..f795fc2563f1dc2cd276e566c87b3ab3c065018e 100644 (file)
@@ -283,16 +283,16 @@ InjectionPointAttach(const char *name,
    int         free_idx;
 
    if (strlen(name) >= INJ_NAME_MAXLEN)
-       elog(ERROR, "injection point name %s too long (maximum of %u)",
-            name, INJ_NAME_MAXLEN);
+       elog(ERROR, "injection point name %s too long (maximum of %u characters)",
+            name, INJ_NAME_MAXLEN - 1);
    if (strlen(library) >= INJ_LIB_MAXLEN)
-       elog(ERROR, "injection point library %s too long (maximum of %u)",
-            library, INJ_LIB_MAXLEN);
+       elog(ERROR, "injection point library %s too long (maximum of %u characters)",
+            library, INJ_LIB_MAXLEN - 1);
    if (strlen(function) >= INJ_FUNC_MAXLEN)
-       elog(ERROR, "injection point function %s too long (maximum of %u)",
-            function, INJ_FUNC_MAXLEN);
-   if (private_data_size >= INJ_PRIVATE_MAXLEN)
-       elog(ERROR, "injection point data too long (maximum of %u)",
+       elog(ERROR, "injection point function %s too long (maximum of %u characters)",
+            function, INJ_FUNC_MAXLEN - 1);
+   if (private_data_size > INJ_PRIVATE_MAXLEN)
+       elog(ERROR, "injection point data too long (maximum of %u bytes)",
             INJ_PRIVATE_MAXLEN);
 
    /*