return ret < 0 ? -1 : 0;
#else
- pr_err("ERROR: Trying to read tracing data without libtraceevent support.\n");
- return -1;
+ /* Not an error — the feature is simply unsupported in this build */
+ pr_debug("Tracing data present but libtraceevent not available, skipping.\n");
+ return 0;
#endif
}
up_write(&env->bpf_progs.lock);
return err;
#else
- pr_err("ERROR: Trying to read bpf_prog_info without libbpf support.\n");
- return -1;
+ /* Not an error — the feature is simply unsupported in this build */
+ pr_debug("BPF prog info present but libbpf not available, skipping.\n");
+ return 0;
#endif // HAVE_LIBBPF_SUPPORT
}
free(node);
return err;
#else
- pr_err("ERROR: Trying to read btf data without libbpf support.\n");
- return -1;
+ /* Not an error — the feature is simply unsupported in this build */
+ pr_debug("BTF data present but libbpf not available, skipping.\n");
+ return 0;
#endif // HAVE_LIBBPF_SUPPORT
}
struct perf_file_header f_header;
struct perf_file_attr f_attr;
u64 f_id;
- int nr_attrs, nr_ids, i, j, err;
+ int nr_attrs, nr_ids, i, j, err = -ENOMEM;
int fd = perf_data__fd(data);
session->evlist = evlist__new();
return err;
}
+ err = -ENOMEM;
if (perf_file_header__read(&f_header, header, fd) < 0)
return -EINVAL;
lseek(fd, tmp, SEEK_SET);
}
+ /*
+ * Skip feature section processing for truncated files
+ * (data.size == 0 means recording was interrupted). The
+ * section table is unreliable in that case, and the event
+ * data can still be processed without the feature headers.
+ * Clear the bitmap so has_feat() returns false and tools
+ * use their "feature not present" fallbacks instead of
+ * accessing uninitialized env fields.
+ */
+ if (f_header.data.size == 0) {
+ bitmap_zero(header->adds_features, HEADER_FEAT_BITS);
+ } else {
#ifdef HAVE_LIBTRACEEVENT
- perf_header__process_sections(header, fd, &session->tevent,
- perf_file_section__process);
+ err = perf_header__process_sections(header, fd, &session->tevent,
+ perf_file_section__process);
+ if (err < 0)
+ goto out_delete_evlist;
- if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
- goto out_delete_evlist;
+ if (evlist__prepare_tracepoint_events(session->evlist,
+ session->tevent.pevent)) {
+ err = -ENOMEM;
+ goto out_delete_evlist;
+ }
#else
- perf_header__process_sections(header, fd, NULL, perf_file_section__process);
+ err = perf_header__process_sections(header, fd, NULL,
+ perf_file_section__process);
+ if (err < 0)
+ goto out_delete_evlist;
#endif
+ }
return 0;
out_errno:
out_delete_evlist:
evlist__delete(session->evlist);
session->evlist = NULL;
- return -ENOMEM;
+ return err;
}
int perf_event__process_feature(const struct perf_tool *tool __maybe_unused,