Download raw body.
Patching libgnat with strlcpy and strlcat to remove warnings
Patching libgnat with strlcpy and strlcat to remove warnings
Patching libgnat with strlcpy and strlcat to remove warnings
Hi again,
I have started with the patching and this is what I have got for now.
Some strcpy's could be changed to their strlcpy variant, but some just
depend on the size of the original string. For those cases I just
substituted by memcpy(). Maybe it is just better to do memcpy() at
every instance since that would preserve completely the semantics of
the strcpy().
I am having difficulty generating the library again after having built
it for the first time. I can do gmake gnatlib inside build-amd64 but
this is very hacky, plus I then cant figure out how to rebuild the package
in the fake-amd64 directory. Is there any documentation on this matter?
Index: 15/patches/patch-gcc_ada_adaint_c
===================================================================
RCS file: /cvs/ports/lang/gcc/15/patches/patch-gcc_ada_adaint_c,v
diff -u -p -r1.1.1.1 patch-gcc_ada_adaint_c
--- 15/patches/patch-gcc_ada_adaint_c 18 Aug 2025 19:49:19 -0000 1.1.1.1
+++ 15/patches/patch-gcc_ada_adaint_c 21 Mar 2026 19:15:52 -0000
@@ -1,16 +1,102 @@
Index: gcc/ada/adaint.c
--- gcc/ada/adaint.c.orig
+++ gcc/ada/adaint.c
-@@ -3714,6 +3714,12 @@ void __gnat_killprocesstree (int pid, int sig_num)
- */
+@@ -576,8 +576,8 @@ __gnat_try_lock (char *dir, char *file)
+ GNAT_STRUCT_STAT stat_result;
+ int fd;
+
+- sprintf (full_path, "%s%c%s", dir, DIR_SEPARATOR, file);
+- sprintf (temp_file, "%s%cTMP-%ld-%ld",
++ snprintf (full_path, sizeof(full_path), "%s%c%s", dir, DIR_SEPARATOR, file);
++ snprintf (temp_file, sizeof(temp_file), "%s%cTMP-%ld-%ld",
+ dir, DIR_SEPARATOR, (long)getpid(), (long)getppid ());
+
+ /* Create the temporary file and write the process number. */
+@@ -756,8 +756,8 @@ __gnat_os_filename (char *filename ATTRIBUTE_UNUSED,
+ strcpy (encoding, "encoding=utf8");
+ *e_length = strlen (encoding);
+ #else
+- strcpy (os_name, filename);
+ *o_length = strlen (filename);
++ memcpy (os_name, filename, *o_length + 1);
+ *e_length = 0;
+ #endif
}
+@@ -1278,7 +1278,7 @@ __gnat_tmp_name (char *tmp_filename)
+ strcpy (tmp_filename, "/tmp/gnat-XXXXXX");
+ #endif
+ else
+- sprintf (tmp_filename, "%s/gnat-XXXXXX", tmpdir);
++ snprintf (tmp_filename, __gnat_max_path_len, "%s/gnat-XXXXXX", tmpdir);
+
+ close (mkstemp(tmp_filename));
+ #elif defined (__vxworks) && !defined (VTHREADS)
+@@ -1373,8 +1373,8 @@ __gnat_readdir (DIR *dirp, char *buffer, int *len)
+
+ if (dirent != NULL)
+ {
+- strcpy (buffer, dirent->d_name);
+- *len = strlen (buffer);
++ *len = strlen (dirent->d_name);
++ memcpy (buffer, dirent->d_name, *len + 1);
+ return buffer;
+ }
+ else
+@@ -2936,7 +2936,8 @@ __gnat_locate_file_with_predicate (char *file_name, ch
+ int (*predicate)(char *))
+ {
+ char *ptr;
+- char *file_path = (char *) alloca (strlen (file_name) + 1);
++ int file_name_len = strlen(file_name);
++ char *file_path = (char *) alloca (file_name_len + 1);
+ int absolute;
+
+ /* Return immediately if file_name is empty */
+@@ -2950,7 +2951,7 @@ __gnat_locate_file_with_predicate (char *file_name, ch
+ if (*ptr == '"')
+ ptr++;
+
+- strcpy (file_path, ptr);
++ strlcpy (file_path, ptr, file_name_len + 1);
+
+ ptr = file_path + strlen (file_path) - 1;
+
+@@ -3015,7 +3016,7 @@ __gnat_locate_file_with_predicate (char *file_name, ch
+ if (!IS_DIRECTORY_SEPARATOR(*ptr))
+ *++ptr = DIR_SEPARATOR;
+
+- strcpy (++ptr, file_name);
++ memcpy (++ptr, file_name, strlen(file_name) + 1);
+
+ if (predicate (file_path))
+ return xstrdup (file_path);
+@@ -3112,13 +3113,14 @@ __gnat_locate_exec_on_path (char *exec_name,
+ #else
+ const char *path_val = getenv ("PATH");
++ int path_val_len = strlen(path_val);
+
+ /* If PATH is not defined, proceed with __gnat_locate_exec anyway, so we can
+ find files that contain directory names. */
+
+ if (path_val == NULL) path_val = "";
+- apath_val = (char *) alloca (strlen (path_val) + 1);
+- strcpy (apath_val, path_val);
++ apath_val = (char *) alloca (path_val_len + 1);
++ strlcpy (apath_val, path_val, path_val_len + 1);
+ #endif
+
+ return __gnat_locate_exec (exec_name, apath_val);
+@@ -3712,6 +3714,12 @@ void __gnat_killprocesstree (int pid, int sig_num)
+ The 5th and 6th words are the pid and the 7th and 8th the ppid.
+ See: /usr/include/sys/procfs.h (struct pstatus).
+ */
++}
++
+const char *
+fname_as_string(int pretty_p __attribute__((__unused__)))
+{
+ return NULL;
-+}
-+
- #ifdef __cplusplus
}
- #endif
+
+ #ifdef __cplusplus
Index: 15/patches/patch-gcc_ada_cstreams_c
===================================================================
RCS file: /cvs/ports/lang/gcc/15/patches/patch-gcc_ada_cstreams_c,v
diff -u -p -r1.1.1.1 patch-gcc_ada_cstreams_c
--- 15/patches/patch-gcc_ada_cstreams_c 18 Aug 2025 19:49:19 -0000 1.1.1.1
+++ 15/patches/patch-gcc_ada_cstreams_c 21 Mar 2026 19:15:52 -0000
@@ -10,3 +10,19 @@ Index: gcc/ada/cstreams.c
/* Use realpath function which resolves links and references to . and ..
on those Unix systems that support it. Note that GNU/Linux provides it but
+@@ -228,12 +228,12 @@ __gnat_full_name (char *nam, char *buffer)
+ /* If the name returned is an absolute path, it is safe to append '/'
+ to the path and concatenate the name of the file. */
+ if (buffer[0] == '/')
+- strcat (buffer, "/");
++ strlcat (buffer, "/", __gnat_max_path_len);
+
+- strcat (buffer, nam);
++ strlcat (buffer, nam, __gnat_max_path_len);
+ }
+ else
+- strcpy (buffer, nam);
++ strlcpy (buffer, nam, __gnat_max_path_len);
+ #endif
+
+ return buffer;
Index: 15/patches/patch-gcc_ada_env_c
===================================================================
RCS file: 15/patches/patch-gcc_ada_env_c
diff -N 15/patches/patch-gcc_ada_env_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ 15/patches/patch-gcc_ada_env_c 21 Mar 2026 19:15:52 -0000
@@ -0,0 +1,12 @@
+Index: gcc/ada/env.c
+--- gcc/ada/env.c.orig
++++ gcc/ada/env.c
+@@ -109,7 +109,7 @@ __gnat_setenv (char *name, char *value)
+
+ expression = (char *) xmalloc (size * sizeof (char));
+
+- sprintf (expression, "%s=%s", name, value);
++ snprintf (expression, size, "%s=%s", name, value);
+ putenv (expression);
+ #if defined (__MINGW32__) || defined (__vxworks)
+ /* putenv for Windows and VxWorks 6 kernel modules makes a copy of the
Index: 15/patches/patch-libphobos_configure
===================================================================
RCS file: /cvs/ports/lang/gcc/15/patches/patch-libphobos_configure,v
diff -u -p -r1.2 patch-libphobos_configure
--- 15/patches/patch-libphobos_configure 7 Mar 2026 21:43:19 -0000 1.2
+++ 15/patches/patch-libphobos_configure 21 Mar 2026 19:15:52 -0000
@@ -48,14 +48,14 @@ Index: libphobos/configure
druntime_fiber_asm_external=yes
;;
esac
-@@ -16067,6 +16081,10 @@ if test -z "${DRUNTIME_CPU_POWERPC_TRUE}" && test -z "
- as_fn_error $? "conditional \"DRUNTIME_CPU_POWERPC\" was never defined.
- Usually this means the macro was only invoked conditionally." "$LINENO" 5
+@@ -16065,6 +16079,10 @@ Usually this means the macro was only invoked conditio
fi
-+if test -z "${DRUNTIME_CPU_SPARC64_TRUE}" && test -z "${DRUNTIME_CPU_SPARC64_FALSE}"; then
-+ as_fn_error $? "conditional \"DRUNTIME_CPU_SPARC64\" was never defined.
+ if test -z "${DRUNTIME_CPU_POWERPC_TRUE}" && test -z "${DRUNTIME_CPU_POWERPC_FALSE}"; then
+ as_fn_error $? "conditional \"DRUNTIME_CPU_POWERPC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
- if test -z "${DRUNTIME_CPU_X86_TRUE}" && test -z "${DRUNTIME_CPU_X86_FALSE}"; then
- as_fn_error $? "conditional \"DRUNTIME_CPU_X86\" was never defined.
++if test -z "${DRUNTIME_CPU_SPARC64_TRUE}" && test -z "${DRUNTIME_CPU_SPARC64_FALSE}"; then
++ as_fn_error $? "conditional \"DRUNTIME_CPU_SPARC64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
+ fi
+ if test -z "${DRUNTIME_CPU_X86_TRUE}" && test -z "${DRUNTIME_CPU_X86_FALSE}"; then
On Friday, March 20th, 2026 at 10:39 AM, Stuart Henderson <stu@spacehopper.org> wrote:
> On 2026/03/19 23:33, ZenitDS wrote:
> > Hello,
> >
> > for gcc ada toolchain, libgnat uses several strcpy and strcat that spawn
> > the annoying warnings of strcpy and strcat on each compilation. I think
> > it may be a good idea to add some patches to fix this situation with
> > strlcpy. I am willing to do it in case it is ok and could be merged.
> >
> > Cheers
> >
>
> As long as the patches aren't too intrusive I think this makes sense.
>
Patching libgnat with strlcpy and strlcat to remove warnings
Patching libgnat with strlcpy and strlcat to remove warnings
Patching libgnat with strlcpy and strlcat to remove warnings