diff mbox series

replace sprintf with strcpy to avoid GCC warning [BZ#28439]

Message ID 8bc40ccb-9d82-77c9-1277-cbff062b4ce6@gmail.com
State Superseded
Headers show
Series replace sprintf with strcpy to avoid GCC warning [BZ#28439] | expand

Checks

Context Check Description
dj/TryBot-32bit fail Patch series failed to apply

Commit Message

Martin Sebor Oct. 9, 2021, 7:27 p.m. UTC
The patch below replaces a call to sprintf with an equivalent
pair of strcpy calls to avoid a GCC false positive due to
a recent optimizer improvement (still under review).

I considered using #pragma GCC diagnostic but using strcpy
here seems to me preferable than sprintf: thanks to
the precondition check it's equally as safe but lighter-weight
and no less readable.

Tested on x86_64-linux running Fedora 29.

Martin

index 75b0e5f2f7..31ab1db60b 100644

Comments

Florian Weimer Oct. 9, 2021, 8:16 p.m. UTC | #1
* Martin Sebor via Libc-alpha:

> The patch below replaces a call to sprintf with an equivalent
> pair of strcpy calls to avoid a GCC false positive due to
> a recent optimizer improvement (still under review).

What's the warning?  Can we use __snprintf instead?

The context looks like this:

	char nbuf[MAXDNAME];
	size_t n, d;

		n = strlen(name);
		d = strlen(domain);
		if (n + d + 1 >= MAXDNAME) {
			RES_SET_H_ERRNO(statp, NO_RECOVERY);
			return (-1);
		}
		sprintf(nbuf, "%s.%s", name, domain);

So it should be possible to use something like this (untested):

  char nbuf[MAXDNAME + 1];

  /* nbuf[MAXDNAME] is used to detect overlong inputs.  */
  nbuf[MAXDNAME] = '\0';
  __snprintf (nbuf, sizeof (nbuf), "%s.%s", name, domain);
  if (nbuf[MAXDNAME] != '\0')
    {
      RES_SET_H_ERRNO(statp, NO_RECOVERY);
      return -1;
    }

But I don't know what the warning is about, and if it would still
trigger.
diff mbox series

Patch

--- a/resolv/res_query.c
+++ b/resolv/res_query.c
@@ -610,7 +610,9 @@  __res_context_querydomain (struct resolv_context *ctx,
                         RES_SET_H_ERRNO(statp, NO_RECOVERY);
                         return (-1);
                 }
-               sprintf(nbuf, "%s.%s", name, domain);
+               strcpy (nbuf, name);
+               nbuf[n] = '.';
+               strcpy (nbuf + n + 1, domain);
         }
         return __res_context_query (ctx, longname, class, type, answer,
                                     anslen, answerp, answerp2, nanswerp2,