Thread (8 messages) 8 messages, 4 authors, 2013-10-08

Re: [PATCH] {iproute2, xfrm}: Use memcpy to suppress gcc phony buffer overflow warning

From: Fan Du <hidden>
Date: 2013-10-08 01:22:34

Back from vacation, sorry for the late reply.

On 2013年09月30日 17:29, David Laight wrote:
quoted
quoted
This is a false positive warning as the destination pointer "buf"
pointers to
an ZERO length array, which actually will occupy alg.buf mostly.
Fix this by using memcpy.

struct xfrm_algo {
          char            alg_name[64];
          unsigned int    alg_key_len;    /* in bits */
          char            alg_key[0];
};

struct {
          union {
                  struct xfrm_algo alg;
                  struct xfrm_algo_aead aead;
                  struct xfrm_algo_auth auth;
          } u;
          char buf[XFRM_ALGO_KEY_BUF_SIZE];
} alg = {};

buf = alg.u.alg.alg_key;
That is worse than horrid...
The tools have every right to complain about any accesses to alg_key[].
Only when using strcpy, because a build in checking inserted in this function.
quoted
quoted
---
   ip/xfrm_state.c |    2 +-
   1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ip/xfrm_state.c b/ip/xfrm_state.c
index 0d98e78..5cc87d3 100644
--- a/ip/xfrm_state.c
+++ b/ip/xfrm_state.c
@@ -159,7 +159,7 @@ static int xfrm_algo_parse(struct xfrm_algo *alg,
enum xfrm_attr_type_t type,
               if (len>  max)
                   invarg("\"ALGO-KEY\" makes buffer overflow\n", key);
I presume there is a return hiding in invarg().
Good guess :)
quoted
quoted
-            strncpy(buf, key, len);
+            memcpy(buf, key, len);
Passing the length of the SOURCE to strncpy() is almost always wrong.
You are still not terminating the copied string.
Don't worry.

The length using here has been increased by 1 at the beginning of the function,
so the copied string to the destination is terminated well.
	David
-- 
浮沉随浪只记今朝笑

--fan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help