@@ -2321,6 +2321,7 @@ static int perf_header__read_build_ids(struct perf_header *header,
2321
2321
#define FEAT_PROCESS_STR_FUN (__feat , __feat_env ) \
2322
2322
static int process_##__feat(struct feat_fd *ff, void *data __maybe_unused) \
2323
2323
{\
2324
+ free(ff->ph->env.__feat_env); \
2324
2325
ff->ph->env.__feat_env = do_read_string(ff); \
2325
2326
return ff->ph->env.__feat_env ? 0 : -ENOMEM; \
2326
2327
}
@@ -4124,6 +4125,7 @@ int perf_event__process_feature(struct perf_session *session,
4124
4125
struct perf_record_header_feature * fe = (struct perf_record_header_feature * )event ;
4125
4126
int type = fe -> header .type ;
4126
4127
u64 feat = fe -> feat_id ;
4128
+ int ret = 0 ;
4127
4129
4128
4130
if (type < 0 || type >= PERF_RECORD_HEADER_MAX ) {
4129
4131
pr_warning ("invalid record type %d in pipe-mode\n" , type );
@@ -4141,11 +4143,13 @@ int perf_event__process_feature(struct perf_session *session,
4141
4143
ff .size = event -> header .size - sizeof (* fe );
4142
4144
ff .ph = & session -> header ;
4143
4145
4144
- if (feat_ops [feat ].process (& ff , NULL ))
4145
- return -1 ;
4146
+ if (feat_ops [feat ].process (& ff , NULL )) {
4147
+ ret = -1 ;
4148
+ goto out ;
4149
+ }
4146
4150
4147
4151
if (!feat_ops [feat ].print || !tool -> show_feat_hdr )
4148
- return 0 ;
4152
+ goto out ;
4149
4153
4150
4154
if (!feat_ops [feat ].full_only ||
4151
4155
tool -> show_feat_hdr >= SHOW_FEAT_HEADER_FULL_INFO ) {
@@ -4154,8 +4158,9 @@ int perf_event__process_feature(struct perf_session *session,
4154
4158
fprintf (stdout , "# %s info available, use -I to display\n" ,
4155
4159
feat_ops [feat ].name );
4156
4160
}
4157
-
4158
- return 0 ;
4161
+ out :
4162
+ free_event_desc (ff .events );
4163
+ return ret ;
4159
4164
}
4160
4165
4161
4166
size_t perf_event__fprintf_event_update (union perf_event * event , FILE * fp )
0 commit comments