[LTP] [PATCH v2 1/2] lib: tst_rtctime: close RTC fd on the ioctl() error path
Kuba Pawlak
kuba.pawlak@canonical.com
Fri Jul 17 12:19:59 CEST 2026
tst_rtc_ioctl() opens the RTC device with SAFE_OPEN() but returns -1 on
an ioctl() failure without closing the descriptor, leaking it on every
failed call. The RTC character device is exclusive-open, so a leaked fd
makes the next tst_rtc_ioctl() open fail with EBUSY.
This was mostly latent because the failure path was rarely taken, but it
is now hit routinely on RTCs that reject RTC_SET_TIME (e.g. Qualcomm PMIC
RTCs returning -ENODEV). Close the fd on the error path and preserve
errno so callers can still inspect the ioctl() failure reason.
Signed-off-by: Kuba Pawlak <kuba.pawlak@canonical.com>
---
lib/tst_rtctime.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/lib/tst_rtctime.c b/lib/tst_rtctime.c
index c62ac73..cc0cb4e 100644
--- a/lib/tst_rtctime.c
+++ b/lib/tst_rtctime.c
@@ -7,6 +7,7 @@
#include <stdbool.h>
#include <limits.h>
+#include <errno.h>
#define TST_NO_DEFAULT_MAIN
#include "tst_test.h"
#include "tst_rtctime.h"
@@ -117,11 +118,15 @@ int tst_rtc_ioctl(const char *rtc_dev, unsigned long request,
ret = ioctl(rtc_fd, request, rtc_tm);
- if (ret != 0)
- return -1;
+ if (ret != 0) {
+ int saved_errno = errno;
- if (rtc_fd > 0)
SAFE_CLOSE(rtc_fd);
+ errno = saved_errno;
+ return -1;
+ }
+
+ SAFE_CLOSE(rtc_fd);
return 0;
}
--
2.43.0
More information about the ltp
mailing list