Supress new use-after-free warnings about realloc(), seen with gcc 12, e.g.:

> In function ‘void rebase_locale_buf(const void*, const void*, const char*, 
> const char*, const char*)’,
>     inlined from ‘int __set_lc_time_from_win(const char*, const lc_time_T*, 
> lc_time_T*, char**, wctomb_p, const char*)’ at 
> ../../../../src/winsup/cygwin/nlsfuncs.cc:705:25:
> ../../../../src/winsup/cygwin/nlsfuncs.cc:338:24: error: pointer 
> ‘new_lc_time_buf’ may be used after ‘void* realloc(void*, size_t)’ 
> [-Werror=use-after-free]
>   338 |       *ptrs += newbase - oldbase;
>       |                ~~~~~~~~^~~~~~~~~
> ../../../../src/winsup/cygwin/nlsfuncs.cc: In function ‘int 
> __set_lc_time_from_win(const char*, const lc_time_T*, lc_time_T*, char**, 
> wctomb_p, const char*)’:
> ../../../../src/winsup/cygwin/nlsfuncs.cc:699:44: note: call to ‘void* 
> realloc(void*, size_t)’ here
>   699 |               char *tmp = (char *) realloc (new_lc_time_buf, len);

We do some calculations using the pointer passed to realloc(), but do
not not dereference it, so this seems safe?

Because use-after-free is a new warning in gcc 12, we only disable it on
gcc 12 or later, to avoid warnings about unknown diagnostic options on
earlier gcc versions.
---
 winsup/cygwin/nlsfuncs.cc | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/winsup/cygwin/nlsfuncs.cc b/winsup/cygwin/nlsfuncs.cc
index b32fecc8e..cf0e96d2d 100644
--- a/winsup/cygwin/nlsfuncs.cc
+++ b/winsup/cygwin/nlsfuncs.cc
@@ -324,6 +324,10 @@ locale_cmp (const void *a, const void *b)
    structures consist entirely of pointers so they are practically pointer
    arrays.  What we do here is just treat the lc_foo pointers as char ** and
    rebase all char * pointers within, up to the given size of the structure. */
+#pragma GCC diagnostic push
+#if __GNUC__ >= 12
+#pragma GCC diagnostic ignored "-Wuse-after-free"
+#endif
 static void
 rebase_locale_buf (const void *ptrv, const void *ptrvend, const char *newbase,
                   const char *oldbase, const char *oldend)
@@ -333,6 +337,7 @@ rebase_locale_buf (const void *ptrv, const void *ptrvend, 
const char *newbase,
     if (*ptrs >= oldbase && *ptrs < oldend)
       *ptrs += newbase - oldbase;
 }
+#pragma GCC diagnostic pop
 
 static wchar_t *
 __getlocaleinfo (wchar_t *loc, LCTYPE type, char **ptr, size_t size)
@@ -699,7 +704,12 @@ __set_lc_time_from_win (const char *name,
                  if (tmp != new_lc_time_buf)
                    rebase_locale_buf (_time_locale, _time_locale + 1, tmp,
                                       new_lc_time_buf, lc_time_ptr);
+#pragma GCC diagnostic push
+#if __GNUC__ >= 12
+#pragma GCC diagnostic ignored "-Wuse-after-free"
+#endif
                  lc_time_ptr = tmp + (lc_time_ptr - new_lc_time_buf);
+#pragma GCC diagnostic pop
                  new_lc_time_buf = tmp;
                  lc_time_end = new_lc_time_buf + len;
                }
-- 
2.45.1

Reply via email to