Skip to contentSkip to conversation

RDMA/rxe: fix the parent sysfs read when the interface has 15 chars

PATCH Superseded Yi Zhang 2 participants 3 messages Aug 20, 2020

Subsystems (2)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Yi Zhang

author
#0 lore raw

PATCH 1/1 RDMA/rxe: fix the parent sysfs read when the interface has 15 chars

parent sysfs reads will yield '\0' bytes when the interface name has 15 chars, and there will no "\n" output.

reproducer:
Create one interface with 15 chars
[root@test ~]# ip a s enp0s29u1u7u3c2
2: enp0s29u1u7u3c2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000

    link/ether 02:21:28:57:47:17 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::ac41:338f:5bcd:c222/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

[root@test ~]# modprobe rdma_rxe
[root@test ~]# echo enp0s29u1u7u3c2 > /sys/module/rdma_rxe/parameters/add [root@test ~]# cat /sys/class/infiniband/rxe0/parent enp0s29u1u7u3c2[root@test ~]#
[root@test ~]# f="/sys/class/infiniband/rxe0/parent" [root@test ~]# echo "$(<"$f")"
-bash: warning: command substitution: ignored null byte in input enp0s29u1u7u3c2

---
 drivers/infiniband/sw/rxe/rxe_verbs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/sw/rxe/rxe_verbs.c +1 -1
index bb61e534e468..91090cb1b08c 100644
@@ -1056,7 +1056,7 @@ static ssize_t parent_show(struct device *device,
 	struct rxe_dev *rxe =
 		rdma_device_to_drv_device(device, struct rxe_dev, ib_dev);
 
-	return snprintf(buf, 16, "%s\n", rxe_parent_name(rxe, 1));
+	return snprintf(buf, 17, "%s\n", rxe_parent_name(rxe, 1));
 }
 
 static DEVICE_ATTR_RO(parent);
Signature · 1 line
2.21.0
#1 lore raw
Quoted 27 lines · Yi Zhang

parent sysfs reads will yield '\0' bytes when the interface name has 15 chars, and there will no "\n" output.

reproducer:
Create one interface with 15 chars
[root@test ~]# ip a s enp0s29u1u7u3c2
2: enp0s29u1u7u3c2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000

    link/ether 02:21:28:57:47:17 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::ac41:338f:5bcd:c222/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

[root@test ~]# modprobe rdma_rxe
[root@test ~]# echo enp0s29u1u7u3c2 > /sys/module/rdma_rxe/parameters/add [root@test ~]# cat /sys/class/infiniband/rxe0/parent enp0s29u1u7u3c2[root@test ~]#
[root@test ~]# f="/sys/class/infiniband/rxe0/parent" [root@test ~]# echo "$(<"$f")"
-bash: warning: command substitution: ignored null byte in input enp0s29u1u7u3c2

 drivers/infiniband/sw/rxe/rxe_verbs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/sw/rxe/rxe_verbs.c +1 -0
index bb61e534e468..91090cb1b08c 100644
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.c

drivers/infiniband/sw/rxe/rxe_verbs.c static ssize_t parent_show(struct device *device, · line 1060

Quoted 6 lines
drivers/infiniband/sw/rxe/rxe_verbs.c +1 -1
@@ -1056,7 +1056,7 @@ static ssize_t parent_show(struct device *device,
 	struct rxe_dev *rxe =
 		rdma_device_to_drv_device(device, struct rxe_dev, ib_dev);
 
-	return snprintf(buf, 16, "%s\n", rxe_parent_name(rxe, 1));
+	return snprintf(buf, 17, "%s\n", rxe_parent_name(rxe, 1));
 }

This should be written as

  return scnprintf(buf, PAGE_SIZE, "%s\n", rxe_parent_name(rxe, 1));

All places in this file should be changed

Jason

author
#2 lore raw
Quoted 31 lines · Jason Gunthorpe
Quoted 30 lines · Yi Zhang

parent sysfs reads will yield '\0' bytes when the interface name has 15 chars, and there will no "\n" output.

reproducer:
Create one interface with 15 chars
[root@test ~]# ip a s enp0s29u1u7u3c2
2: enp0s29u1u7u3c2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000

     link/ether 02:21:28:57:47:17 brd ff:ff:ff:ff:ff:ff
     inet6 fe80::ac41:338f:5bcd:c222/64 scope link noprefixroute
        valid_lft forever preferred_lft forever

[root@test ~]# modprobe rdma_rxe
[root@test ~]# echo enp0s29u1u7u3c2 > /sys/module/rdma_rxe/parameters/add [root@test ~]# cat /sys/class/infiniband/rxe0/parent enp0s29u1u7u3c2[root@test ~]#
[root@test ~]# f="/sys/class/infiniband/rxe0/parent" [root@test ~]# echo "$(<"$f")"
-bash: warning: command substitution: ignored null byte in input enp0s29u1u7u3c2

  drivers/infiniband/sw/rxe/rxe_verbs.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/sw/rxe/rxe_verbs.c +1 -0
index bb61e534e468..91090cb1b08c 100644
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.c
@@ -1056,7 +1056,7 @@ static ssize_t parent_show(struct device *device,
  	struct rxe_dev *rxe =
  		rdma_device_to_drv_device(device, struct rxe_dev, ib_dev);
 
Quoted 8 lines

drivers/infiniband/sw/rxe/rxe_verbs.c static ssize_t parent_show(struct device *device, · line 1060

Quoted 3 lines
drivers/infiniband/sw/rxe/rxe_verbs.c +1 -1
-	return snprintf(buf, 16, "%s\n", rxe_parent_name(rxe, 1));
+	return snprintf(buf, 17, "%s\n", rxe_parent_name(rxe, 1));
  }

This should be written as

   return scnprintf(buf, PAGE_SIZE, "%s\n", rxe_parent_name(rxe, 1));

All places in this file should be changed

Here is the only space use snprintf, will send v2 as you suggested, thanks.

Quoted 2 lines

Jason