⬢ DragonFlyBSD Kernel Audit
DF-3996 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/sound/pci/envy24.c
+++ b/sys/dev/sound/pci/envy24.c
@@ -1412,7 +1412,7 @@ envy24_p32sl(struct sc_chinfo *ch)
 	length = sndbuf_getready(ch->buffer) / 8;
 	dmabuf = ch->parent->pbuf;
 	data = (u_int32_t *)ch->data;
 	src = sndbuf_getreadyptr(ch->buffer) / 4;
-	dst = src / 2 + ch->offset;
+	dst = (src / 2 + ch->offset) % (ch->size / 8);
 	ssize = ch->size / 4;
 	dsize = ch->size / 8;
 	slot = ch->num * 2;
@@ -1444,7 +1444,7 @@ envy24_p16sl(struct sc_chinfo *ch)
 	length = sndbuf_getready(ch->buffer) / 4;
 	dmabuf = ch->parent->pbuf;
 	data = (u_int16_t *)ch->data;
 	src = sndbuf_getreadyptr(ch->buffer) / 2;
-	dst = src / 2 + ch->offset;
+	dst = (src / 2 + ch->offset) % (ch->size / 4);
 	ssize = ch->size / 2;
 	dsize = ch->size / 4;
 	slot = ch->num * 2;
@@ -1486,7 +1486,7 @@ envy24_p8u(struct sc_chinfo *ch)
 	length = sndbuf_getready(ch->buffer) / 2;
 	dmabuf = ch->parent->pbuf;
 	data = (u_int8_t *)ch->data;
 	src = sndbuf_getreadyptr(ch->buffer);
-	dst = src / 2 + ch->offset;
+	dst = (src / 2 + ch->offset) % (ch->size / 4);
 	ssize = ch->size;
 	dsize = ch->size / 4;
 	slot = ch->num * 2;
@@ -1516,7 +1516,7 @@ envy24_r32sl(struct sc_chinfo *ch)
 	length = sndbuf_getfree(ch->buffer) / 8;
 	dmabuf = ch->parent->rbuf;
 	data = (u_int32_t *)ch->data;
 	dst = sndbuf_getfreeptr(ch->buffer) / 4;
-	src = dst / 2 + ch->offset;
+	src = (dst / 2 + ch->offset) % (ch->size / 8);
 	dsize = ch->size / 4;
 	ssize = ch->size / 8;
 	slot = (ch->num - ENVY24_CHAN_REC_ADC1) * 2;
@@ -1547,7 +1547,7 @@ envy24_r16sl(struct sc_chinfo *ch)
 	length = sndbuf_getfree(ch->buffer) / 4;
 	dmabuf = ch->parent->rbuf;
 	data = (u_int16_t *)ch->data;
 	dst = sndbuf_getfreeptr(ch->buffer) / 2;
-	src = dst / 2 + ch->offset;
+	src = (dst / 2 + ch->offset) % (ch->size / 8);
 	dsize = ch->size / 2;
 	ssize = ch->size / 8;
 	slot = (ch->num - ENVY24_CHAN_REC_ADC1) * 2;