]> 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

14 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/common/compression.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 7fbda5301f12ae4593977549bf8c7fd754ceca74..d3fe0d15dafec3a2918fb028f7d184d740c2aae3 100644 (file)
@@ -927,7 +927,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 8f4fdf2782c9ab7e7aeb5f7cf253a26dad9ccfcc..bbc5c8edaba3b73fae5145e8c6949f9f234cc18f 100644 (file)
@@ -2308,7 +2308,7 @@ CheckCompoundAffixes(CMPDAffix **ptr, char *word, int len, bool CheckInPlace)
        }
        else
        {
-               char       *affbegin;
+               const char *affbegin;
 
                while ((*ptr)->affix)
                {
index 8a09707e447b379d63a48238d8410cd609970309..e18a3d07c8c1084fcb663b86b4bd92c38802168e 100644 (file)
@@ -1001,8 +1001,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 df0c84cf37181b5697fdc9cdd404e5b493ffff63..b9e1ade862b9f69b162df00e588e721e19b79c53 100644 (file)
@@ -1093,7 +1093,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 6fbfb3a1cc25807e0d8393788d6e309b3ecbddcb..09500e636cc189999426176b455fde709235e5ba 100644 (file)
@@ -232,7 +232,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 96845e1a1aeb7acca3a13cf6dca27545be0ff23c..ee232f392afbd690e026c33f5a2ca0c86b6a8436 100644 (file)
@@ -160,7 +160,7 @@ create_fullpage_directory(char *path)
 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 adf6e45953b22b5933cbd961437f4471bf551bdb..6e7972a3db47f01cd456b457cc695fa26ccb2468 100644 (file)
@@ -6149,7 +6149,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 ee937623f0b269a3d8d85f19a0981cadc6a13a6f..ae5a74d5a7efeffa2436bba73874ec14625ea411 100644 (file)
@@ -425,7 +425,7 @@ validate_compress_specification(pg_compress_specification *spec)
 void
 parse_compress_options(const char *option, char **algorithm, char **detail)
 {
-       char       *sep;
+       const char *sep;
        char       *endp;
        long            result;
 
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 e2c85b0048c0e97cff368ca809c7ad08058089ac..ba27a388650b1af2c00e8ca0a8367d049a62b8ea 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 e3a0267d5e08b5e0629ed04b121864746c632244..889e2759fdd2daaefbbfb847271323b5bd78bb51 100644 (file)
@@ -672,7 +672,7 @@ static
 const char *
 get_expectfile(const char *testname, const char *file)
 {
-       char       *file_type;
+       const char *file_type;
        _resultmap *rm;
 
        /*
index d605c721ecf703379d0b990a1b04187dd5989cce..7e134645c7da4aea5957ed8410d0602f93725c55 100644 (file)
@@ -2631,7 +2631,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;