]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix another case of indirectly casting away const.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 4 Jun 2026 15:37:43 +0000 (11:37 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 4 Jun 2026 15:37:43 +0000 (11:37 -0400)
Like 8f1791c61, this fixes a case of implicitly casting away
const by not treating the result of strrchr() on a const pointer
as const.  This was missed at the time because the machines
reporting those warnings weren't building with --with-llvm.

While here, clean up another infelicity: in the probably-
impossible case that the input string contains only one dot,
this function would call pnstrdup() with a length of -1
and thereby emit a module name equal to the function name.
It seems to me we should emit modname = NULL instead.

Also remove a useless Assert and two redundant assignments.

Back-patch, as 8f1791c61 was, so that users of back branches
don't see this warning when building with late-model gcc.

Reported-by: hubert depesz lubaczewski <depesz@depesz.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/aiGNJ89PBqvq2Yyz@depesz.com
Backpatch-through: 14

src/backend/jit/llvm/llvmjit.c

index e64f9b31c43f7d453fdc20a661b49bca3b34c88f..2d448f3cc87cef3f9a4e8faefe1a05c3d8b3576e 100644 (file)
@@ -1048,9 +1048,6 @@ llvm_create_types(void)
 void
 llvm_split_symbol_name(const char *name, char **modname, char **funcname)
 {
-       *modname = NULL;
-       *funcname = NULL;
-
        /*
         * Module function names are pgextern.$module.$funcname
         */
@@ -1060,14 +1057,21 @@ llvm_split_symbol_name(const char *name, char **modname, char **funcname)
                 * Symbol names cannot contain a ., therefore we can split based on
                 * first and last occurrence of one.
                 */
-               *funcname = rindex(name, '.');
-               (*funcname)++;                  /* jump over . */
-
-               *modname = pnstrdup(name + strlen("pgextern."),
-                                                       *funcname - name - strlen("pgextern.") - 1);
-               Assert(funcname);
+               const char *lastdot;
 
-               *funcname = pstrdup(*funcname);
+               name += strlen("pgextern.");
+               lastdot = strrchr(name, '.');
+               if (lastdot)
+               {
+                       *modname = pnstrdup(name, lastdot - name);
+                       *funcname = pstrdup(lastdot + 1);
+               }
+               else
+               {
+                       /* hmm, no second dot? */
+                       *modname = NULL;
+                       *funcname = pstrdup(name);
+               }
        }
        else
        {