提交 a96e4e2f 编写于 作者: R Roland Dreier

IB/uverbs: New macro to set pointers to NULL if length is 0 in INIT_UDATA()

Trying to have a ternary operator to choose between NULL (or 0) and the
real pointer value in invocations leads to an impossible choice between
a sparse error about a literal 0 used as a NULL pointer, and a gcc
warning about "pointer/integer type mismatch in conditional expression."

Rather than clutter the source with more casts, move the ternary
operator into a new INIT_UDATA_BUF_OR_NULL() macro, which makes it
easier to use and simplifies its callers.
Reported-by: NYann Droneaud <ydroneaud@opteya.com>
Signed-off-by: NRoland Dreier <roland@purestorage.com>
上级 309243ec
...@@ -55,6 +55,14 @@ ...@@ -55,6 +55,14 @@
(udata)->outlen = (olen); \ (udata)->outlen = (olen); \
} while (0) } while (0)
#define INIT_UDATA_BUF_OR_NULL(udata, ibuf, obuf, ilen, olen) \
do { \
(udata)->inbuf = (ilen) ? (const void __user *) (ibuf) : NULL; \
(udata)->outbuf = (olen) ? (void __user *) (obuf) : NULL; \
(udata)->inlen = (ilen); \
(udata)->outlen = (olen); \
} while (0)
/* /*
* Our lifetime rules for these structs are the following: * Our lifetime rules for these structs are the following:
* *
......
...@@ -676,17 +676,14 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, ...@@ -676,17 +676,14 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
return -EINVAL; return -EINVAL;
} }
INIT_UDATA(&ucore, INIT_UDATA_BUF_OR_NULL(&ucore, buf, (unsigned long) ex_hdr.response,
(hdr.in_words) ? buf : 0, hdr.in_words * 8, hdr.out_words * 8);
(unsigned long)ex_hdr.response,
hdr.in_words * 8, INIT_UDATA_BUF_OR_NULL(&uhw,
hdr.out_words * 8); buf + ucore.inlen,
(unsigned long) ex_hdr.response + ucore.outlen,
INIT_UDATA(&uhw, ex_hdr.provider_in_words * 8,
(ex_hdr.provider_in_words) ? buf + ucore.inlen : 0, ex_hdr.provider_out_words * 8);
(ex_hdr.provider_out_words) ? (unsigned long)ex_hdr.response + ucore.outlen : 0,
ex_hdr.provider_in_words * 8,
ex_hdr.provider_out_words * 8);
err = uverbs_ex_cmd_table[command](file, err = uverbs_ex_cmd_table[command](file,
&ucore, &ucore,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册