On 22 June 2011 12:56, Alexey I. Froloff <ra...@altlinux.org> wrote:
> When host gcc uses _FORTIFY_SOURCE=2 by default, tools/firmware-utils
> fails to compile:
>
> In file included from /usr/include/string.h:658:0,
>                 from src/imagetag.c:12:
> In function 'strncpy',
>    inlined from 'tagfile' at src/imagetag.c:369:11:
> /usr/include/bits/string3.h:123:3: error: call to __builtin___strncpy_chk
will always overflow destination buffer
>
> Signed-off-by: Alexey I. Froloff <ra...@altlinux.org>
> ---
>  tools/firmware-utils/src/imagetag.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/tools/firmware-utils/src/imagetag.c
b/tools/firmware-utils/src/imagetag.c
> index bebaba2..cfe7cf4 100644
> --- a/tools/firmware-utils/src/imagetag.c
> +++ b/tools/firmware-utils/src/imagetag.c
> @@ -362,11 +362,11 @@ int tagfile(const char *kernel, const char *rootfs,
const char *bin, \
>        }
>
>        if (args->reserved2_given) {
> -         strncpy(tag.reserved2, args->reserved2_arg, 16);
> +         memcpy(tag.reserved2, args->reserved2_arg, 16);
NACK. First of all, this didn't generate a warning at all (but that doesn't
mean there can't a problem ;-). Secondly, you discard the null terminator if
args->reserved2_arg is longer than 15 chars, creating potential problems
later on. If it is less than 15, you'll read from the memory that comes
after arg->reserved2_arg.

>        }
>
>        if (args->altinfo_given) {
> -         strncpy(&tag.information1[0], args->altinfo_arg,
ALTTAGINFO_LEN);
> +         memcpy(&tag.information1[0], args->altinfo_arg, ALTTAGINFO_LEN);

NACK for the same reasons above.

Also the warning is mostly harmless; removing it isn't quite as easy. A
potential solution would be to define a union struct with either
information1, flashlayourver fsKernelCRC and information2 or a
ALTTAGINFO_LEN sized altinfo, then using them as needed in struct bcm_tag,
or make the bcm_tag itself a union of the different layouts.

An actual bug is the length argument, it should be actually one less than
_LEN (to leave space for the null terminator when the string is too long).
This is harmless though, this can never happen since ALTTAGINFO_LEN long
altinfos already get rejected earlier.


Jonas
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to