diff options
| author | Bojan Novković <bnovkov@FreeBSD.org> | 2026-02-23 15:30:26 +0000 |
|---|---|---|
| committer | Bojan Novković <bnovkov@FreeBSD.org> | 2026-02-25 11:30:05 +0000 |
| commit | bce0c14fe19defeef4f02cfebc018e9adf979783 (patch) | |
| tree | 26d542253975251f6bf7a88fac22ccb6c3585e92 | |
| parent | 3023bb49e115b4149f9fc0683dabde172ecb1336 (diff) | |
mpool/mpool_get.c: Avoid clobbering 'errno' when handling 'pread' errors
POSIX.1-2024 states that the 'free' function "shall not modify errno if
ptr is a null pointer or a pointer previously returned as if by malloc()
and not yet deallocated". However this is a fairly recent addition
and non-compliant allocators might still clobber 'errno', causing
'mpool_get' to return the wrong error code. Fix this by saving
and restoring 'errno' after calling 'free'.
Sponsored by: Klara, Inc.
Reviewed by: obiwac
Differential Revision: https://reviews.freebsd.org/D55463
MFC after: 1 week
| -rw-r--r-- | lib/libc/db/mpool/mpool.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/lib/libc/db/mpool/mpool.c b/lib/libc/db/mpool/mpool.c index 1bab66d73baf..0df19dc09e4d 100644 --- a/lib/libc/db/mpool/mpool.c +++ b/lib/libc/db/mpool/mpool.c @@ -214,10 +214,14 @@ mpool_get(MPOOL *mp, pgno_t pgno, /* Read in the contents. */ off = mp->pagesize * pgno; if ((nr = pread(mp->fd, bp->page, mp->pagesize, off)) != (ssize_t)mp->pagesize) { + int serrno; + switch (nr) { case -1: /* errno is set for us by pread(). */ + serrno = errno; free(bp); + errno = serrno; mp->curcache--; return (NULL); case 0: |
