]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf hwmon: Fix fd check to accept fd 0 in hwmon_pmu__describe_items()
authorArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 10 Jun 2026 23:40:34 +0000 (20:40 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 17 Jun 2026 11:28:47 +0000 (08:28 -0300)
hwmon_pmu__describe_items() checks 'if (fd > 0)' after openat(), which
incorrectly rejects fd 0.  While fd 0 is normally stdin, if stdin has
been closed (common in daemon/service contexts), the kernel reuses fd 0
for the next open.  With fd > 0, the sysfs file is not read and the fd
is leaked.

Change to 'if (fd >= 0)' to match the standard openat() error check.

Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Fixes: 53cc0b351ec99278 ("perf hwmon_pmu: Add a tool PMU exposing events from hwmon in sysfs")
Reviewed-by: Ian Rogers <irogers@google.com>
Cc: Ian Rogers <irogers@google.com>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/hwmon_pmu.c

index efd3067a2e591050bfb131ab00d439ee4b787cb9..ed544dca70c380b2cbcd6758b99fc452507fd1b6 100644 (file)
@@ -435,7 +435,7 @@ static size_t hwmon_pmu__describe_items(struct hwmon_pmu *hwm, char *out_buf, si
                        hwmon_item_strs[bit],
                        is_alarm ? "_alarm" : "");
                fd = openat(dir, buf, O_RDONLY);
-               if (fd > 0) {
+               if (fd >= 0) {
                        ssize_t read_len = read(fd, buf, sizeof(buf) - 1);
 
                        while (read_len > 0 && buf[read_len - 1] == '\n')