ring: check flag settings for future proofing

All API's should check that they support the flag values passed.
These checks ensure that the extra bits can safely be used
without risk of ABI breakage.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
This commit is contained in:
Stephen Hemminger 2020-04-27 16:16:22 -07:00 committed by Thomas Monjalon
parent 0371535d46
commit 3e71b3d456

View File

@ -42,6 +42,11 @@ static struct rte_tailq_elem rte_ring_tailq = {
};
EAL_REGISTER_TAILQ(rte_ring_tailq)
/* mask of all valid flag values to ring_create() */
#define RING_F_MASK (RING_F_SP_ENQ | RING_F_SC_DEQ | RING_F_EXACT_SZ | \
RING_F_MP_RTS_ENQ | RING_F_MC_RTS_DEQ | \
RING_F_MP_HTS_ENQ | RING_F_MC_HTS_DEQ)
/* true if x is a power of 2 */
#define POWEROF2(x) ((((x)-1) & (x)) == 0)
@ -197,6 +202,13 @@ rte_ring_init(struct rte_ring *r, const char *name, unsigned count,
RTE_BUILD_BUG_ON(offsetof(struct rte_ring_headtail, tail) !=
offsetof(struct rte_ring_rts_headtail, tail.val.pos));
/* future proof flags, only allow supported values */
if (flags & ~RING_F_MASK) {
RTE_LOG(ERR, RING,
"Unsupported flags requested %#x\n", flags);
return -EINVAL;
}
/* init the ring structure */
memset(r, 0, sizeof(*r));
ret = strlcpy(r->name, name, sizeof(r->name));