[LEDE-DEV] [PATCH v2] iproute2: fix hidden uint to uin64_t promotion in json_print

Hans Dedecker dedeckeh at gmail.com
Mon Mar 19 03:55:24 PDT 2018


On Sun, Mar 18, 2018 at 4:50 PM, Kevin Darbyshire-Bryant
<ldir at darbyshire-bryant.me.uk> wrote:
> print_int used 'int' type internally, whereas print_uint used 'uint64_t'
>
> These helper functions eventually call vfprintf(fp, fmt, args) which is
> a variable argument list function and is dependent upon 'fmt' containing
> correct information about the length of the passed arguments.
>
> Unfortunately print_int v print_uint offered no clue to the programmer
> that internally passed ints to print_uint were being promoted to 64bits,
> thus the format passed in 'fmt' string vs the actual passed integer
> could be different lengths.  This is even more interesting on big endian
> architectures where 'vfprintf' would be looking in the middle of an
> int64 type.  Symptoms of this included tc qdisc showing bizarre values
> for a variety of fields across a variety of qdiscs (e.g. refcnt, flows,
> quantum)
>
> print_u/int now stick with native int size.
>
> A similar patch has been sent upstream.
>
> Fixes FS#1425
>
> Signed-off-by: Kevin Darbyshire-Bryant <ldir at darbyshire-bryant.me.uk>
Patch applied thanks

Hans
> ---
>
> v2: fixed a couple of spelling errors in commit message &
> bumped the pkg release
>
>  package/network/utils/iproute2/Makefile            |  2 +-
>  ...x-hidden-uint-to-uin64_t-promottion-in-js.patch | 65 ++++++++++++++++++++++
>  2 files changed, 66 insertions(+), 1 deletion(-)
>  create mode 100644 package/network/utils/iproute2/patches/910-iproute2-fix-hidden-uint-to-uin64_t-promottion-in-js.patch
>
> diff --git a/package/network/utils/iproute2/Makefile b/package/network/utils/iproute2/Makefile
> index eaee4838ed..d8ff5e590d 100644
> --- a/package/network/utils/iproute2/Makefile
> +++ b/package/network/utils/iproute2/Makefile
> @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
>
>  PKG_NAME:=iproute2
>  PKG_VERSION:=4.15.0
> -PKG_RELEASE:=1
> +PKG_RELEASE:=2
>
>  PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
>  PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
> diff --git a/package/network/utils/iproute2/patches/910-iproute2-fix-hidden-uint-to-uin64_t-promottion-in-js.patch b/package/network/utils/iproute2/patches/910-iproute2-fix-hidden-uint-to-uin64_t-promottion-in-js.patch
> new file mode 100644
> index 0000000000..a549770045
> --- /dev/null
> +++ b/package/network/utils/iproute2/patches/910-iproute2-fix-hidden-uint-to-uin64_t-promottion-in-js.patch
> @@ -0,0 +1,65 @@
> +From e1c6b35f9f978f6919e8bf651de67b30dc145543 Mon Sep 17 00:00:00 2001
> +From: Kevin Darbyshire-Bryant <ldir at darbyshire-bryant.me.uk>
> +Date: Sun, 18 Mar 2018 08:51:08 +0000
> +Subject: [PATCH] iproute2: fix hidden uint to uin64_t promotion in json_print
> +
> +print_int used 'int' type internally, whereas print_uint used 'uint64_t'
> +
> +These helper functions eventually call vfprintf(fp, fmt, args) which is
> +a variable argument list function and is dependent upon 'fmt' containing
> +correct information about the length of the passed arguments.
> +
> +Unfortunately print_int v print_uint offered no clue to the programmer
> +that internally passed ints to print_uint were being promoted to 64bits,
> +thus the format passed in 'fmt' string vs the actual passed integer
> +could be different lengths.  This is even more interesting on big endian
> +architectures where 'vfprintf' would be looking in the middle of an
> +int64 type.  Symptoms of this included tc qdisc showing bizarre values
> +for a variety of fields across a variety of qdiscs (e.g. refcnt, flows,
> +quantum)
> +
> +print_u/int now stick with native int size.
> +
> +A similar patch has been sent upstream.
> +
> +Fixes FS#1425
> +
> +Signed-off-by: Kevin Darbyshire-Bryant <ldir at darbyshire-bryant.me.uk>
> +---
> + include/json_print.h | 2 +-
> + lib/json_print.c     | 2 +-
> + 2 files changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/include/json_print.h b/include/json_print.h
> +index dc4d2bb3..350d35cb 100644
> +--- a/include/json_print.h
> ++++ b/include/json_print.h
> +@@ -56,10 +56,10 @@ void close_json_array(enum output_type type, const char *delim);
> +               print_color_##type_name(t, COLOR_NONE, key, fmt, value);        \
> +       }
> + _PRINT_FUNC(int, int);
> ++_PRINT_FUNC(uint, unsigned int);
> + _PRINT_FUNC(bool, bool);
> + _PRINT_FUNC(null, const char*);
> + _PRINT_FUNC(string, const char*);
> +-_PRINT_FUNC(uint, uint64_t);
> + _PRINT_FUNC(hu, unsigned short);
> + _PRINT_FUNC(hex, unsigned int);
> + _PRINT_FUNC(0xhex, unsigned int);
> +diff --git a/lib/json_print.c b/lib/json_print.c
> +index aa527af6..ae3a317d 100644
> +--- a/lib/json_print.c
> ++++ b/lib/json_print.c
> +@@ -117,8 +117,8 @@ void close_json_array(enum output_type type, const char *str)
> +               }                                                       \
> +       }
> + _PRINT_FUNC(int, int);
> ++_PRINT_FUNC(uint, unsigned int);
> + _PRINT_FUNC(hu, unsigned short);
> +-_PRINT_FUNC(uint, uint64_t);
> + _PRINT_FUNC(lluint, unsigned long long int);
> + #undef _PRINT_FUNC
> +
> +--
> +2.14.3 (Apple Git-98)
> +
> --
> 2.14.3 (Apple Git-98)
>
>
> _______________________________________________
> Lede-dev mailing list
> Lede-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/lede-dev



More information about the Lede-dev mailing list