xfs: check healthmon outbuffer space correctly

LOLLM notices that the outbuf space check in xfs_healthmon_format_pop
isn't quite correct -- it checks that there's enough space to write a
xfs_healthmon_event object, but the outbuffer is supposed to contain
xfs_health_monitor_event objects.  Fix this by adding a helper, and
refactoring all three outbuf size checks to use it.

Cc: stable@vger.kernel.org # v7.0
Fixes: b3a289a2a9 ("xfs: create event queuing, formatting, and discovery infrastructure")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Assisted-by: LOLLM # finding obvious bugs
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
Darrick J. Wong 2026-09-01 22:47:43 -07:00 committed by Carlos Maiolino
parent 4c98464e12
commit 74eeb68a62

View File

@ -735,6 +735,13 @@ static const unsigned int type_map[] = {
[XFS_HEALTHMON_DATALOST] = XFS_HEALTH_MONITOR_TYPE_DATALOST,
};
static inline bool
xfs_healthmon_check_outbuffer_space(const struct xfs_healthmon *hm)
{
return hm->bufhead + sizeof(struct xfs_health_monitor_event) <=
hm->bufsize;
}
/* Render event as a V0 structure */
STATIC int
xfs_healthmon_format_v0(
@ -801,10 +808,10 @@ xfs_healthmon_format_v0(
break;
}
ASSERT(hm->bufhead + sizeof(hme) <= hm->bufsize);
ASSERT(xfs_healthmon_check_outbuffer_space(hm));
/* copy formatted object to the outbuf */
if (hm->bufhead + sizeof(hme) <= hm->bufsize) {
if (xfs_healthmon_check_outbuffer_space(hm)) {
memcpy(hm->buffer + hm->bufhead, &hme, sizeof(hme));
hm->bufhead += sizeof(hme);
}
@ -887,7 +894,11 @@ xfs_healthmon_format_pop(
{
struct xfs_healthmon_event *event;
if (hm->bufhead + sizeof(*event) > hm->bufsize)
/*
* Don't bother if there's not enough space to format even one event in
* the outbuffer.
*/
if (!xfs_healthmon_check_outbuffer_space(hm))
return NULL;
mutex_lock(&hm->lock);