Building libselinux with GCC 11.1.1 produces the following warning: ``` In file included from label_file.c:24: In function ‘store_stem’, inlined from ‘load_mmap’ at label_file.c:277:12, inlined from ‘process_file’ at label_file.c:551:5: label_file.h:289:25: error: ‘free’ called on pointer ‘*mmap_area.next_addr’ with nonzero offset 4 [-Werror=free-nonheap-object] 289 | free(buf); | ^~~~~~~~~ ``` Indeed, in this case the pointer shouldn't be freed as it comes from mmap. Fix this by adding a from_mmap parameter to store_stem() instead of overriding the saved_data::from_mmap value in load_mmap(). Signed-off-by: Ondrej Mosnacek <omosnace@xxxxxxxxxx> --- libselinux/src/label_file.c | 3 +-- libselinux/src/label_file.h | 12 +++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c index cfce23e0..199ae66b 100644 --- a/libselinux/src/label_file.c +++ b/libselinux/src/label_file.c @@ -274,12 +274,11 @@ end_arch_check: /* store the mapping between old and new */ newid = find_stem(data, buf, stem_len); if (newid < 0) { - newid = store_stem(data, buf, stem_len); + newid = store_stem(data, buf, stem_len, true); if (newid < 0) { rc = newid; goto out; } - data->stem_arr[newid].from_mmap = 1; } stem_map[i] = newid; } diff --git a/libselinux/src/label_file.h b/libselinux/src/label_file.h index baed3341..66e5721f 100644 --- a/libselinux/src/label_file.h +++ b/libselinux/src/label_file.h @@ -62,7 +62,7 @@ struct spec { struct stem { char *buf; int len; - char from_mmap; + bool from_mmap; }; /* Where we map the file in during selabel_open() */ @@ -276,7 +276,8 @@ static inline int find_stem(struct saved_data *data, const char *buf, } /* returns the index of the new stored object */ -static inline int store_stem(struct saved_data *data, char *buf, int stem_len) +static inline int store_stem(struct saved_data *data, char *buf, int stem_len, + bool from_mmap) { int num = data->num_stems; @@ -286,7 +287,8 @@ static inline int store_stem(struct saved_data *data, char *buf, int stem_len) tmp_arr = realloc(data->stem_arr, sizeof(*tmp_arr) * alloc_stems); if (!tmp_arr) { - free(buf); + if (!from_mmap) + free(buf); return -1; } data->alloc_stems = alloc_stems; @@ -294,7 +296,7 @@ static inline int store_stem(struct saved_data *data, char *buf, int stem_len) } data->stem_arr[num].len = stem_len; data->stem_arr[num].buf = buf; - data->stem_arr[num].from_mmap = 0; + data->stem_arr[num].from_mmap = from_mmap; data->num_stems++; return num; @@ -321,7 +323,7 @@ static inline int find_stem_from_spec(struct saved_data *data, const char *buf) if (!stem) return -1; - return store_stem(data, stem, stem_len); + return store_stem(data, stem, stem_len, false); } /* This will always check for buffer over-runs and either read the next entry -- 2.31.1