| From 0470610a6c2cbbb35917a94b10930bff8ff2d336 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 22 Oct 2024 16:48:25 +0200 |
| Subject: gtp: allow -1 to be specified as file description from userspace |
| |
| From: Pablo Neira Ayuso <pablo@netfilter.org> |
| |
| [ Upstream commit 7515e37bce5c428a56a9b04ea7e96b3f53f17150 ] |
| |
| Existing user space applications maintained by the Osmocom project are |
| breaking since a recent fix that addresses incorrect error checking. |
| |
| Restore operation for user space programs that specify -1 as file |
| descriptor to skip GTPv0 or GTPv1 only sockets. |
| |
| Fixes: defd8b3c37b0 ("gtp: fix a potential NULL pointer dereference") |
| Reported-by: Pau Espin Pedrol <pespin@sysmocom.de> |
| Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> |
| Tested-by: Oliver Smith <osmith@sysmocom.de> |
| Reviewed-by: Simon Horman <horms@kernel.org> |
| Link: https://patch.msgid.link/20241022144825.66740-1-pablo@netfilter.org |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/gtp.c | 22 +++++++++++++--------- |
| 1 file changed, 13 insertions(+), 9 deletions(-) |
| |
| diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c |
| index 2e94d10348cce..4cb925321785e 100644 |
| --- a/drivers/net/gtp.c |
| +++ b/drivers/net/gtp.c |
| @@ -1702,20 +1702,24 @@ static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]) |
| return -EINVAL; |
| |
| if (data[IFLA_GTP_FD0]) { |
| - u32 fd0 = nla_get_u32(data[IFLA_GTP_FD0]); |
| + int fd0 = nla_get_u32(data[IFLA_GTP_FD0]); |
| |
| - sk0 = gtp_encap_enable_socket(fd0, UDP_ENCAP_GTP0, gtp); |
| - if (IS_ERR(sk0)) |
| - return PTR_ERR(sk0); |
| + if (fd0 >= 0) { |
| + sk0 = gtp_encap_enable_socket(fd0, UDP_ENCAP_GTP0, gtp); |
| + if (IS_ERR(sk0)) |
| + return PTR_ERR(sk0); |
| + } |
| } |
| |
| if (data[IFLA_GTP_FD1]) { |
| - u32 fd1 = nla_get_u32(data[IFLA_GTP_FD1]); |
| + int fd1 = nla_get_u32(data[IFLA_GTP_FD1]); |
| |
| - sk1u = gtp_encap_enable_socket(fd1, UDP_ENCAP_GTP1U, gtp); |
| - if (IS_ERR(sk1u)) { |
| - gtp_encap_disable_sock(sk0); |
| - return PTR_ERR(sk1u); |
| + if (fd1 >= 0) { |
| + sk1u = gtp_encap_enable_socket(fd1, UDP_ENCAP_GTP1U, gtp); |
| + if (IS_ERR(sk1u)) { |
| + gtp_encap_disable_sock(sk0); |
| + return PTR_ERR(sk1u); |
| + } |
| } |
| } |
| |
| -- |
| 2.43.0 |
| |