Currently, EROFS keeps all fragments into a temporary file for later
packed inode compression. However, this could trigger an unexpected
segfault if temporary storage runs low.
Print a proper error message and gracefully exit.
Closes: https://github.com/erofs/erofs-utils/issues/13
Link: https://lore.kernel.org/r/20250212123633.40004-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
unsigned int eof_tailrawsize;
union {
- void *compressmeta;
void *chunkindexes;
struct {
uint16_t z_advise;
#define z_idata_size idata_size
};
};
+ void *compressmeta;
+
#ifdef WITH_ANDROID
uint64_t capabilities;
#endif
else
rc = 0;
out:
+ if (rc)
+ erofs_err("Failed to record %llu-byte fragment data @ %llu for nid %llu: %d",
+ inode->fragment_size | 0ULL,
+ inode->fragmentoff | 0ULL, inode->nid | 0ULL, rc);
if (memblock)
munmap(memblock, inode->i_size);
return rc;
free(d);
free(inode->compressmeta);
- if (inode->eof_tailraw)
- free(inode->eof_tailraw);
+ free(inode->eof_tailraw);
list_del(&inode->i_hash);
- if (inode->i_srcpath)
- free(inode->i_srcpath);
+ free(inode->i_srcpath);
if (inode->datasource == EROFS_INODE_DATA_SOURCE_DISKBUF) {
erofs_diskbuf_close(inode->i_diskbuf);
free(inode->i_diskbuf);
- } else if (inode->i_link) {
+ } else {
free(inode->i_link);
}
free(inode);