Skip to contentSkip to conversation

net: qualcomm: rmnet: fix two pointer math bugs

PATCH Applied Dan Carpenter 3 participants 6 messages Jun 19, 2021 – Jun 21, 2021

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 net: qualcomm: rmnet: fix two pointer math bugs

We recently changed these two pointers from void pointers to struct pointers and it breaks the pointer math so now the "txphdr" points beyond the end of the buffer.

Fixes 56a967c4f7e5 ("net: qualcomm: rmnet: Remove some unneeded casts")
---
 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +2 -2
index 3ee5c1a8b46e..3676976c875b 100644
@@ -168,7 +168,7 @@ static void rmnet_map_complement_ipv4_txporthdr_csum_field(struct iphdr *ip4h)
 	void *txphdr;
 	u16 *csum;
 
-	txphdr = ip4h + ip4h->ihl * 4;
+	txphdr = (void *)ip4h + ip4h->ihl * 4;
 
 	if (ip4h->protocol == IPPROTO_TCP || ip4h->protocol == IPPROTO_UDP) {
 		csum = (u16 *)rmnet_map_get_csum_field(ip4h->protocol, txphdr);
@@ -203,7 +203,7 @@ rmnet_map_complement_ipv6_txporthdr_csum_field(struct ipv6hdr *ip6h)
 	void *txphdr;
 	u16 *csum;
 
-	txphdr = ip6h + sizeof(struct ipv6hdr);
+	txphdr = ip6h + 1;
 
 	if (ip6h->nexthdr == IPPROTO_TCP || ip6h->nexthdr == IPPROTO_UDP) {
 		csum = (u16 *)rmnet_map_get_csum_field(ip6h->nexthdr, txphdr);
Signature · 1 line
2.30.2
#1 lore raw
Quoted 34 lines · Dan Carpenter

We recently changed these two pointers from void pointers to struct pointers and it breaks the pointer math so now the "txphdr" points beyond the end of the buffer.

Fixes 56a967c4f7e5 ("net: qualcomm: rmnet: Remove some unneeded casts")
---
 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +1 -1
index 3ee5c1a8b46e..3676976c875b 100644
@@ -168,7 +168,7 @@ static void
 rmnet_map_complement_ipv4_txporthdr_csum_field(struct iphdr *ip4h)
 	void *txphdr;
 	u16 *csum;
 
-	txphdr = ip4h + ip4h->ihl * 4;
+	txphdr = (void *)ip4h + ip4h->ihl * 4;
 
 	if (ip4h->protocol == IPPROTO_TCP || ip4h->protocol == IPPROTO_UDP) {
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +1 -1
 		csum = (u16 *)rmnet_map_get_csum_field(ip4h->protocol, txphdr);
@@ -203,7 +203,7 @@
 rmnet_map_complement_ipv6_txporthdr_csum_field(struct ipv6hdr *ip6h)
 	void *txphdr;
 	u16 *csum;
 
-	txphdr = ip6h + sizeof(struct ipv6hdr);
+	txphdr = ip6h + 1;
 
 	if (ip6h->nexthdr == IPPROTO_TCP || ip6h->nexthdr == IPPROTO_UDP) {
Quoted 1 line

csum = (u16 *)rmnet_map_get_csum_field(ip6h->nexthdr, txphdr);

Hi Dan

Thanks for fixing this. Could you cast the ip4h to char* instead of void*. Looks like gcc might raise issues if -Wpointer-arith is used.

https://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Pointer-Arith.html#Pointer-Arith

#3 lore raw
Quoted 11 lines · Dan Carpenter
Quoted 8 lines · On Sat, Jun 19, 2021 at 01:12:09PM -0600, [email protected] wrote:

On 2021-06-19 07:52, Dan Carpenter wrote:

Hi Dan

Thanks for fixing this. Could you cast the ip4h to char* instead of void*. Looks like gcc might raise issues if -Wpointer-arith is used.

https://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Pointer-Arith.html#Pointer-Arith

The fix for that is to not enable -Wpointer-arith. The warning is dumb.

Sorry, that was uncalled for and not correct. The GCC warning would be useful if we were trying to write portable userspace code. But in the kernel the kernel uses GCC extensions a lot.

The Clang compiler can also compile the kernel these days. But it had to add support for a bunch of GCC extensions to make that work. Really most of linux userspace is written with GCC in mind so Clang had to do this anyway.

So we will never enable -Wpointer-arith in the kernel because there is no need.

regards,
dan carpenter

Reviewed-by
#4 lore raw
Quoted 22 lines · Dan Carpenter
Quoted 11 lines · Dan Carpenter
Quoted 8 lines · On Sat, Jun 19, 2021 at 01:12:09PM -0600, [email protected] wrote:

On 2021-06-19 07:52, Dan Carpenter wrote:

Hi Dan

Thanks for fixing this. Could you cast the ip4h to char* instead of void*. Looks like gcc might raise issues if -Wpointer-arith is used.

https://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Pointer-Arith.html#Pointer-Arith

The fix for that is to not enable -Wpointer-arith. The warning is dumb.

Sorry, that was uncalled for and not correct. The GCC warning would be useful if we were trying to write portable userspace code. But in the kernel the kernel uses GCC extensions a lot.

The Clang compiler can also compile the kernel these days. But it had to add support for a bunch of GCC extensions to make that work. Really most of linux userspace is written with GCC in mind so Clang had to do this anyway.

Quoted 5 lines

So we will never enable -Wpointer-arith in the kernel because there is no need.

regards,
dan carpenter

Thanks for the clarification.

#5 lore raw
In reply to Dan Carpenter
This patch was applied to netdev/net-next.git (refs/heads/master):

Hello:

This patch was applied to netdev/net-next.git (refs/heads/master):

Quoted 8 lines · On Sat, 19 Jun 2021 16:52:22 +0300 you wrote:

We recently changed these two pointers from void pointers to struct pointers and it breaks the pointer math so now the "txphdr" points beyond the end of the buffer.

Fixes 56a967c4f7e5 ("net: qualcomm: rmnet: Remove some unneeded casts")

[...]

Here is the summary with links:
- [net-next] net: qualcomm: rmnet: fix two pointer math bugs

    https://git.kernel.org/netdev/net-next/c/753ba09aa3ea

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html