[LTP] [PATCH v2] rpc: create valid fd to pass libtirpc validation

Liu Jian via ltp
2026-01-12T01:27:31Z

From: Liu Jian via ltp <ltp@lists.linux.it>

The testcase(rpc_svc_destroy, rpc_svcfd_create, rpc_xprt_register,
rpc_xprt_unregister) was failing due to an invalid fd, which
caused libtirpc's internal validation to reject the operation.
This change ensures a valid socket fd is created and can pass the
validation checks in libtirpc.

Signed-off-by: Liu Jian <liujian56@huawei.com>
---
v2: Fix a compilation error on Alpine.
.../rpc_svc_destroy.c | 27 +++++++++++++++++++
.../rpc_svcfd_create.c | 26 ++++++++++++++++++
.../rpc_xprt_register.c | 25 +++++++++++++++++
.../rpc_xprt_unregister.c | 25 +++++++++++++++++
4 files changed, 103 insertions(+)

diff --git a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svc_destroy/rpc_svc_destroy.c b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svc_destroy/rpc_svc_destroy.c
index 22e560843..b9240ccba 100644
--- a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svc_destroy/rpc_svc_destroy.c
+++ b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svc_destroy/rpc_svc_destroy.c
@@ -30,6 +30,12 @@
#include <time.h>
#include <rpc/rpc.h>

+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+
//Standard define
#define PROCNUM 1
#define VERSNUM 1
@@ -43,6 +49,27 @@ int main(void)
int test_status = 1; //Default test result set to FAILED
int fd = 0;
SVCXPRT *svcr = NULL;
+ struct sockaddr_in server_addr;
+
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fd < 0) {
+ printf("socket creation failed");
+ return test_status;
+ }
+
+ memset(&server_addr, 0, sizeof(server_addr));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(9001);
+ if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {
+ printf("inet_pton failed");
+ close(fd);
+ return test_status;
+ }
+ if (connect(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
+ printf("connect failed");
+ close(fd);
+ return test_status;
+ }

//First of all, create a server
svcr = svcfd_create(fd, 0, 0);
diff --git a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svcfd_create/rpc_svcfd_create.c b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svcfd_create/rpc_svcfd_create.c
index f0d89ba48..ea4418961 100644
--- a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svcfd_create/rpc_svcfd_create.c
+++ b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_createdestroy_svcfd_create/rpc_svcfd_create.c
@@ -29,6 +29,11 @@
#include <stdlib.h>
#include <time.h>
#include <rpc/rpc.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>

//Standard define
#define PROCNUM 1
@@ -43,6 +48,27 @@ int main(void)
int test_status = 1; //Default test result set to FAILED
int fd = 0;
SVCXPRT *svcr = NULL;
+ struct sockaddr_in server_addr;
+
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fd < 0) {
+ printf("socket creation failed");
+ return test_status;
+ }
+
+ memset(&server_addr, 0, sizeof(server_addr));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(9001);
+ if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {
+ printf("inet_pton failed");
+ close(fd);
+ return test_status;
+ }
+ if (connect(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
+ printf("connect failed");
+ close(fd);
+ return test_status;
+ }

//create a server
svcr = svcfd_create(fd, 0, 0);
diff --git a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_register/rpc_xprt_register.c b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_register/rpc_xprt_register.c
index b10a1ce5e..a40dad7fe 100644
--- a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_register/rpc_xprt_register.c
+++ b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_register/rpc_xprt_register.c
@@ -31,6 +31,10 @@
#include <rpc/rpc.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>

//Standard define
#define PROCNUM 1
@@ -45,6 +49,27 @@ int main(void)
int test_status = 1; //Default test result set to FAILED
SVCXPRT *svcr = NULL;
int fd = 0;
+ struct sockaddr_in server_addr;
+
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fd < 0) {
+ printf("socket creation failed");
+ return test_status;
+ }
+
+ memset(&server_addr, 0, sizeof(server_addr));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(9001);
+ if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {
+ printf("inet_pton failed");
+ close(fd);
+ return test_status;
+ }
+ if (connect(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
+ printf("connect failed");
+ close(fd);
+ return test_status;
+ }

//create a server
svcr = svcfd_create(fd, 1024, 1024);
diff --git a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_unregister/rpc_xprt_unregister.c b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_unregister/rpc_xprt_unregister.c
index 3b6130eaa..5ac51de41 100644
--- a/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_unregister/rpc_xprt_unregister.c
+++ b/testcases/network/rpc/rpc-tirpc/tests_pack/rpc_suite/rpc/rpc_regunreg_xprt_unregister/rpc_xprt_unregister.c
@@ -31,6 +31,10 @@
#include <rpc/rpc.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>

//Standard define
#define PROCNUM 1
@@ -49,6 +53,27 @@ int main(int argn, char *argc[])
int test_status = 1; //Default test result set to FAILED
SVCXPRT *svcr = NULL;
int fd = 0;
+ struct sockaddr_in server_addr;
+
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fd < 0) {
+ printf("socket creation failed");
+ return test_status;
+ }
+
+ memset(&server_addr, 0, sizeof(server_addr));
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_port = htons(9001);
+ if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {
+ printf("inet_pton failed");
+ close(fd);
+ return test_status;
+ }
+ if (connect(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
+ printf("connect failed");
+ close(fd);
+ return test_status;
+ }

//create a server
svcr = svcfd_create(fd, 1024, 1024);
--
2.34.1