Message ID | 17269152.DqJfCm1LOx@wuerfel (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Hi, Le mercredi 07 octobre 2015 à 14:29 +0200, Arnd Bergmann a écrit : > The INIT_UDATA() macro requires a pointer or unsigned long argument > for both input and output buffer, and all callers had a cast from > when the code was merged until a recent restructuring, so now we get > > core/uverbs_cmd.c: In function 'ib_uverbs_create_cq': > core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of > different size [-Wint-to-pointer-cast] > > This makes the code behave as before by adding back the cast to > unsigned long. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq") > Reviewed-by: Yann Droneaud <ydroneaud@opteya.com> > diff --git a/drivers/infiniband/core/uverbs_cmd.c > b/drivers/infiniband/core/uverbs_cmd.c > index be4cb9f04be3..88b3b78340f2 100644 > --- a/drivers/infiniband/core/uverbs_cmd.c > +++ b/drivers/infiniband/core/uverbs_cmd.c > @@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct > ib_uverbs_file *file, > if (copy_from_user(&cmd, buf, sizeof(cmd))) > return -EFAULT; > > - INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), > sizeof(resp)); > + INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, > sizeof(cmd), sizeof(resp)); > > INIT_UDATA(&uhw, buf + sizeof(cmd), > (unsigned long)cmd.response + sizeof(resp), > Regards.
On 10/7/2015 3:29 PM, Arnd Bergmann wrote: > The INIT_UDATA() macro requires a pointer or unsigned long argument for > both input and output buffer, and all callers had a cast from when > the code was merged until a recent restructuring, so now we get > > core/uverbs_cmd.c: In function 'ib_uverbs_create_cq': > core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] > > This makes the code behave as before by adding back the cast to > unsigned long. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq") > > diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c > index be4cb9f04be3..88b3b78340f2 100644 > --- a/drivers/infiniband/core/uverbs_cmd.c > +++ b/drivers/infiniband/core/uverbs_cmd.c > @@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file, > if (copy_from_user(&cmd, buf, sizeof(cmd))) > return -EFAULT; > > - INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), sizeof(resp)); > + INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, sizeof(cmd), sizeof(resp)); Would it make sense to cast inside INIT_UDATA() and not have callers worry about it? -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wednesday 07 October 2015 16:19:27 Sagi Grimberg wrote: > On 10/7/2015 3:29 PM, Arnd Bergmann wrote: > > The INIT_UDATA() macro requires a pointer or unsigned long argument for > > both input and output buffer, and all callers had a cast from when > > the code was merged until a recent restructuring, so now we get > > > > core/uverbs_cmd.c: In function 'ib_uverbs_create_cq': > > core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] > > > > This makes the code behave as before by adding back the cast to > > unsigned long. > > > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq") > > > > diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c > > index be4cb9f04be3..88b3b78340f2 100644 > > --- a/drivers/infiniband/core/uverbs_cmd.c > > +++ b/drivers/infiniband/core/uverbs_cmd.c > > @@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file, > > if (copy_from_user(&cmd, buf, sizeof(cmd))) > > return -EFAULT; > > > > - INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), sizeof(resp)); > > + INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, sizeof(cmd), sizeof(resp)); > > Would it make sense to cast inside INIT_UDATA() and not have callers > worry about it? If we want to do this properly, INIT_UDATA should be converted into a function call that has the right types. My patch doesn't try to do that here, it just restores the code to how it was for the past 10 years. Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, Le mercredi 07 octobre 2015 à 16:19 +0300, Sagi Grimberg a écrit : > On 10/7/2015 3:29 PM, Arnd Bergmann wrote: > > The INIT_UDATA() macro requires a pointer or unsigned long argument > > for > > both input and output buffer, and all callers had a cast from when > > the code was merged until a recent restructuring, so now we get > > > > core/uverbs_cmd.c: In function 'ib_uverbs_create_cq': > > core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of > > different size [-Wint-to-pointer-cast] > > > > This makes the code behave as before by adding back the cast to > > unsigned long. > > > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq") > > > > diff --git a/drivers/infiniband/core/uverbs_cmd.c > > b/drivers/infiniband/core/uverbs_cmd.c > > index be4cb9f04be3..88b3b78340f2 100644 > > --- a/drivers/infiniband/core/uverbs_cmd.c > > +++ b/drivers/infiniband/core/uverbs_cmd.c > > @@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct > > ib_uverbs_file *file, > > if (copy_from_user(&cmd, buf, sizeof(cmd))) > > return -EFAULT; > > > > - INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), > > sizeof(resp)); > > + INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, > > sizeof(cmd), sizeof(resp)); > > Would it make sense to cast inside INIT_UDATA() and not have callers > worry about it? It's ... complicated. See INIT_UDATA_BUF_OR_NULL(). Awayway, I have patch to do the opposite, eg. explicitly cast u64 value to (void __user *)(unsigned long) in the caller function instead, as it allows some safer / new operations on the response buffer. Regards.
On 10/07/2015 09:46 AM, Yann Droneaud wrote: > Hi, > > Le mercredi 07 octobre 2015 à 16:19 +0300, Sagi Grimberg a écrit : >> On 10/7/2015 3:29 PM, Arnd Bergmann wrote: >>> The INIT_UDATA() macro requires a pointer or unsigned long argument >>> for >>> both input and output buffer, and all callers had a cast from when >>> the code was merged until a recent restructuring, so now we get >>> >>> core/uverbs_cmd.c: In function 'ib_uverbs_create_cq': >>> core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of >>> different size [-Wint-to-pointer-cast] >>> >>> This makes the code behave as before by adding back the cast to >>> unsigned long. >>> >>> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >>> Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq") >>> >>> diff --git a/drivers/infiniband/core/uverbs_cmd.c >>> b/drivers/infiniband/core/uverbs_cmd.c >>> index be4cb9f04be3..88b3b78340f2 100644 >>> --- a/drivers/infiniband/core/uverbs_cmd.c >>> +++ b/drivers/infiniband/core/uverbs_cmd.c >>> @@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct >>> ib_uverbs_file *file, >>> if (copy_from_user(&cmd, buf, sizeof(cmd))) >>> return -EFAULT; >>> >>> - INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), >>> sizeof(resp)); >>> + INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, >>> sizeof(cmd), sizeof(resp)); >> >> Would it make sense to cast inside INIT_UDATA() and not have callers >> worry about it? > > It's ... complicated. See INIT_UDATA_BUF_OR_NULL(). > > Awayway, I have patch to do the opposite, eg. explicitly cast u64 value > to (void __user *)(unsigned long) in the caller function instead, as it > allows some safer / new operations on the response buffer. > > Regards. > I haven't seen this oether patch that Yann is talking about, so I've taken this one.
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index be4cb9f04be3..88b3b78340f2 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -1478,7 +1478,7 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file, if (copy_from_user(&cmd, buf, sizeof(cmd))) return -EFAULT; - INIT_UDATA(&ucore, buf, cmd.response, sizeof(cmd), sizeof(resp)); + INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, sizeof(cmd), sizeof(resp)); INIT_UDATA(&uhw, buf + sizeof(cmd), (unsigned long)cmd.response + sizeof(resp),
The INIT_UDATA() macro requires a pointer or unsigned long argument for both input and output buffer, and all callers had a cast from when the code was merged until a recent restructuring, so now we get core/uverbs_cmd.c: In function 'ib_uverbs_create_cq': core/uverbs_cmd.c:1481:66: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] This makes the code behave as before by adding back the cast to unsigned long. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Fixes: 565197dd8fb1 ("IB/core: Extend ib_uverbs_create_cq") -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html