Fix type confusion in guc_var_compare()
authorAndres Freund <andres@anarazel.de>
Mon, 15 Jul 2024 16:26:01 +0000 (09:26 -0700)
committerAndres Freund <andres@anarazel.de>
Mon, 15 Jul 2024 16:26:01 +0000 (09:26 -0700)
Before this change guc_var_compare() cast the input arguments to
const struct config_generic *.  That's not quite right however, as the input
on one side is often just a char * on one side.

Instead just use char *, the first field in config_generic.

This fixes a -Warray-bounds warning with some versions of gcc. While the
warning is only known to be triggered for <= 15, the issue the warning points
out seems real, so apply the fix everywhere.

Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Reported-by: Erik Rijkers <er@xs4all.nl>
Suggested-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/a74a1a0d-0fd2-3649-5224-4f754e8f91aa%40xs4all.nl

src/backend/utils/misc/guc.c

index 547cecde24091cb361d33ffe07a4e96ecf0c2e39..a043d529efa40329ef53696a32e8c7fe65b57590 100644 (file)
@@ -1289,10 +1289,10 @@ find_option(const char *name, bool create_placeholders, bool skip_errors,
 static int
 guc_var_compare(const void *a, const void *b)
 {
-       const struct config_generic *confa = *(struct config_generic *const *) a;
-       const struct config_generic *confb = *(struct config_generic *const *) b;
+       const char *namea = **(const char ** const *) a;
+       const char *nameb = **(const char ** const *) b;
 
-       return guc_name_compare(confa->name, confb->name);
+       return guc_name_compare(namea, nameb);
 }
 
 /*