]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix some cases of indirectly casting away const.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 25 Feb 2026 16:19:50 +0000 (11:19 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 25 Feb 2026 16:19:50 +0000 (11:19 -0500)
Newest versions of gcc+glibc are able to detect cases where code
implicitly casts away const by assigning the result of strchr() or
a similar function applied to a "const char *" value to a target
variable that's just "char *".  This of course creates a hazard of
not getting a compiler warning about scribbling on a string one was
not supposed to, so fixing up such cases is good.

This patch fixes a dozen or so places where we were doing that.
Most are trivial additions of "const" to the target variable,
since no actually-hazardous change was occurring.

Thanks to Bertrand Drouvot for finding a couple more spots than
I had.

This commit back-patches relevant portions of 8f1791c61 and
9f7565c6c into supported branches.  However, there are two
places in ecpg (in v18 only) where a proper fix is more
complicated than seems appropriate for a back-patch.  I opted
to silence those two warnings by adding casts.

Author: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Discussion: https://postgr.es/m/1324889.1764886170@sss.pgh.pa.us
Discussion: https://postgr.es/m/3988414.1771950285@sss.pgh.pa.us
Backpatch-through: 14-18

13 files changed:
src/backend/catalog/pg_type.c
src/backend/tsearch/spell.c
src/backend/utils/adt/formatting.c
src/backend/utils/adt/pg_locale.c
src/backend/utils/adt/xid8funcs.c
src/bin/pg_waldump/pg_waldump.c
src/bin/pgbench/pgbench.c
src/interfaces/ecpg/pgtypeslib/datetime.c
src/port/getopt.c
src/port/getopt_long.c
src/port/win32setlocale.c
src/test/regress/pg_regress.c
src/timezone/zic.c

index b37a8f034beb2949a295c9b88ad3b3846e66b1a2..1e6b4670147ac27f32782e35ea3c0f5a946905bf 100644 (file)
@@ -904,7 +904,7 @@ char *
 makeMultirangeTypeName(const char *rangeTypeName, Oid typeNamespace)
 {
        char       *buf;
-       char       *rangestr;
+       const char *rangestr;
 
        /*
         * If the range type name contains "range" then change that to
index f65c083c06f5b407951c74c2577fa8c1caba17a9..09e7357b4d8e8cb993688b03d6aff3ec34bbbe94 100644 (file)
@@ -2327,7 +2327,7 @@ CheckCompoundAffixes(CMPDAffix **ptr, char *word, int len, bool CheckInPlace)
        }
        else
        {
-               char       *affbegin;
+               const char *affbegin;
 
                while ((*ptr)->affix)
                {
index 5b617ff4619fefc499a4c622e18322f41f2a8c44..a157c3c87641196d07dd7e3ed41163548d1b5d9f 100644 (file)
@@ -1008,8 +1008,9 @@ typedef struct NUMProc
        char       *number,                     /* string with number   */
                           *number_p,           /* pointer to current number position */
                           *inout,                      /* in / out buffer      */
-                          *inout_p,            /* pointer to current inout position */
-                          *last_relevant,      /* last relevant number after decimal point */
+                          *inout_p;            /* pointer to current inout position */
+
+       const char *last_relevant,      /* last relevant number after decimal point */
 
                           *L_negative_sign,    /* Locale */
                           *L_positive_sign,
index 8ae101cefc2f15bcff93e183204d0adbada8a551..9d788233848fdf7b11961f83030202794d81b69c 100644 (file)
@@ -1046,7 +1046,7 @@ get_iso_localename(const char *winlocname)
        wchar_t         wc_locale_name[LOCALE_NAME_MAX_LENGTH];
        wchar_t         buffer[LOCALE_NAME_MAX_LENGTH];
        static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
-       char       *period;
+       const char *period;
        int                     len;
        int                     ret_val;
 
index bca4e674df19ba55efa2bd7957b4163bfcf5d8f8..09efc70e4f6eb2b72782176e5292a0ae7e4fdf7e 100644 (file)
@@ -225,7 +225,7 @@ is_visible_fxid(FullTransactionId value, const pg_snapshot *snap)
 #ifdef USE_BSEARCH_IF_NXIP_GREATER
        else if (snap->nxip > USE_BSEARCH_IF_NXIP_GREATER)
        {
-               void       *res;
+               const void *res;
 
                res = bsearch(&value, snap->xip, snap->nxip, sizeof(FullTransactionId),
                                          cmp_fxid);
index 2daed328e7d6d9ce2b867de476aa79c2b981ac87..cf8ef21bacda529951eac8c52d5ec6a9322db92c 100644 (file)
@@ -107,7 +107,7 @@ verify_directory(const char *directory)
 static void
 split_path(const char *path, char **dir, char **fname)
 {
-       char       *sep;
+       const char *sep;
 
        /* split filepath into directory & filename */
        sep = strrchr(path, '/');
index fd70196a160a51746d9aa673d91ef04a05ae6038..94d2e8e9bac445fa109847e0c408df3a9d624e75 100644 (file)
@@ -5483,7 +5483,7 @@ findBuiltin(const char *name)
 static int
 parseScriptWeight(const char *option, char **script)
 {
-       char       *sep;
+       const char *sep;
        int                     weight;
 
        if ((sep = strrchr(option, WSEP)))
index 1b253747fc403d7134cf9d2117c482c3c6590429..f43343b459499b53baa3fd6ea297e529fb37d4f7 100644 (file)
@@ -335,8 +335,8 @@ PGTYPESdate_defmt_asc(date * d, const char *fmt, const char *str)
         */
        int                     token[3][2];
        int                     token_values[3] = {-1, -1, -1};
-       char       *fmt_token_order;
-       char       *fmt_ystart,
+       const char *fmt_token_order;
+       const char *fmt_ystart,
                           *fmt_mstart,
                           *fmt_dstart;
        unsigned int i;
index 207c2836d354b9d66413b57a7ae7c632b66b02a9..3e101a7217e77face0572e356469af30e101041f 100644 (file)
@@ -71,7 +71,7 @@ int
 getopt(int nargc, char *const *nargv, const char *ostr)
 {
        static char *place = EMSG;      /* option letter processing */
-       char       *oli;                        /* option letter list index */
+       const char *oli;                        /* option letter list index */
 
        if (!*place)
        {                                                       /* update scanning pointer */
index c9892769883a3237b128ead2318b47e06d09129c..70bb3147c0a06cd760d4e343896aa6ff908aefa6 100644 (file)
@@ -59,7 +59,7 @@ getopt_long(int argc, char *const argv[],
                        const struct option *longopts, int *longindex)
 {
        static char *place = EMSG;      /* option letter processing */
-       char       *oli;                        /* option letter list index */
+       const char *oli;                        /* option letter list index */
 
        if (!*place)
        {                                                       /* update scanning pointer */
index 4edae05bb7cfbbb6c717d295bc828fdd4ae08ccd..f45f8dd95d383509830a69561cc55814e18b2fc1 100644 (file)
@@ -119,9 +119,9 @@ map_locale(const struct locale_map *map, const char *locale)
                const char *needle_start = map[i].locale_name_start;
                const char *needle_end = map[i].locale_name_end;
                const char *replacement = map[i].replacement;
-               char       *match;
-               char       *match_start = NULL;
-               char       *match_end = NULL;
+               const char *match;
+               const char *match_start = NULL;
+               const char *match_end = NULL;
 
                match = strstr(locale, needle_start);
                if (match)
@@ -148,7 +148,7 @@ map_locale(const struct locale_map *map, const char *locale)
                        /* Found a match. Replace the matched string. */
                        int                     matchpos = match_start - locale;
                        int                     replacementlen = strlen(replacement);
-                       char       *rest = match_end;
+                       const char *rest = match_end;
                        int                     restlen = strlen(rest);
 
                        /* check that the result fits in the static buffer */
index b23d9f3bf9788c9c1248ea81b87e0f6542cb296c..f6797e7e9fbc6f5d356eb2bca593fcee3faa913b 100644 (file)
@@ -709,7 +709,7 @@ static
 const char *
 get_expectfile(const char *testname, const char *file)
 {
-       char       *file_type;
+       const char *file_type;
        _resultmap *rm;
 
        /*
index 0ea6ead2db3ae2c9f4a99d60191af201266ec027..6ccd739dcd8da98314149120565767924746645a 100644 (file)
@@ -2629,7 +2629,7 @@ doabbr(char *abbr, struct zone const *zp, char const *letters,
           bool isdst, zic_t save, bool doquotes)
 {
        char       *cp;
-       char       *slashp;
+       char const *slashp;
        size_t          len;
        char const *format = zp->z_format;