There is a new warning in gcc-12.0.0-0.4.fc36.x86_64. In this code:
int
guestfs_int_create_socketname (guestfs_h *g, const char *filename,
char (*sockpath)[UNIX_PATH_MAX])
{
if (guestfs_int_lazy_make_sockdir (g) == -1)
return -1;
if (strlen (g->sockdir) + 1 + strlen (filename) > UNIX_PATH_MAX-1) {
error (g, _("socket path too long: %s/%s"), g->sockdir, filename);
return -1;
}
snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", g->sockdir, filename);
return 0;
}
[
https://github.com/libguestfs/libguestfs/blob/d1e7e1a323619d8f1e913a7833d...]
the new warning is:
launch.c: In function ‘guestfs_int_create_socketname’:
launch.c:336:43: error: ‘%s’ directive output may be truncated writing up to 106 bytes
into a region of size between 1 and 107 [-Werror=format-truncation=]
336 | snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", g->sockdir,
filename);
| ^~
In file included from /usr/include/stdio.h:894,
from launch.c:30:
In function ‘snprintf’,
inlined from ‘guestfs_int_create_socketname’ at launch.c:336:3:
/usr/include/bits/stdio2.h:71:10: note: ‘__snprintf_chk’ output between 2 and 2 14 bytes
into a destination of size 108
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
*sockpath is a fixed buffer of size UNIX_PATH_MAX == 108. We check
that strlen (g->sockdir) + strlen (filename) + 1 (for the '/'
character) > UNIX_PATH_MAX - 1 (for the terminating '\0').
The check seems correct as far as I can tell. I don't think I'm
making a fencepost error here. Why does GCC 12 think there should be
a warning when GCC 11 didn't?
I've attached a standalone test case.
$ gcc -O2 -Wall sp.c -o sp
sp.c: In function ‘create_sockpath’:
sp.c:12:43: warning: ‘%s’ directive output may be truncated writing up to 106 bytes into
a region of size between 1 and 107 [-Wformat-truncation=]
12 | snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", sockdir, filename);
| ^~
sp.c:12:3: note: ‘snprintf’ output between 2 and 214 bytes into a destination of size
108
12 | snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", sockdir, filename);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(No warning with gcc-11.2.1-1.fc35.x86_64)
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v