]> 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 ae12cb7d02954e7b9fcc6a5700e4f63b5061ff6d..605bda5a1b86de8877444617fc3ac6aab2257439 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 047bae6fe6ccb6196a2c9991acf34cfa6fcd2812..5df7c0596668ba09b5bb04bf21580a29f2cb3f54 100644 (file)
@@ -2328,7 +2328,7 @@ CheckCompoundAffixes(CMPDAffix **ptr, char *word, int len, bool CheckInPlace)
        }
        else
        {
-               char       *affbegin;
+               const char *affbegin;
 
                while ((*ptr)->affix)
                {
index 06bd8ca67c7901d92925f8de0896385aa1b5cf43..0f064a69fe1e4ae1c3f02b2eca5ab535c93de26f 100644 (file)
@@ -1043,8 +1043,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 7183711416ee9a25491f3b6a9e80a31360095d65..143fe9f85b40143d69b45087021def8a773fee4b 100644 (file)
@@ -1049,7 +1049,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 3af9ebadce6758b998a291f5083fc33941fd487d..fa1828d2dcf1970ed14a78a1cd924c935ce61b98 100644 (file)
@@ -224,7 +224,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 5dc60109b12d3f3af31ad5df01acf008f1bd7f21..4f73fafe71929f50f9e2952dcdcea1a4c7242ac4 100644 (file)
@@ -121,7 +121,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 f9c305fae14ecd44fffe1ca9bb4691f75bd93d9a..80d14108c2816c23892772a1fa88af5ce7f7ac66 100644 (file)
@@ -6177,7 +6177,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 aadd09a4e9a9a56cf89f1bb9824695161936a098..301d26b34aa519b72360d3c98943656f1b9726dc 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 3a248c6306b7f3f5ca72823faf261beeb70b7827..81d763470b53f1d1e2f7b7aa383e1c7ba9053aec 100644 (file)
@@ -536,7 +536,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;