⬢ DragonFlyBSD Kernel Audit
DF-2505 / fix_combined.diff
← back to finding ↓ download raw
--- a/sys/dev/disk/nata/atapi-cd.c	2026-10-15 23:32:04.877306882 +0000
+++ b/sys/dev/disk/nata/atapi-cd.c	2026-10-15 23:32:19.813116281 +0000
@@ -721,6 +721,10 @@
 	break;
 
     case CDRIOCSETBLOCKSIZE:
+	if (*(int *)ap->a_data <= 0) {
+	    error = EINVAL;
+	    break;
+	}
 	cdp->block_size = *(int *)ap->a_data;
 	acd_set_ioparm(dev);
 	break;
@@ -1579,15 +1583,29 @@
 	bcopy(&d->data[0], &s->data[0], 2048);
 	break;
 
-    case DVD_STRUCT_BCA:
-	s->length = ntohs(d->length);
-	bcopy(&d->data[0], &s->data[0], s->length);
+    case DVD_STRUCT_BCA: {
+	u_int32_t copylen = ntohs(d->length);
+
+	if (copylen > length - 4)
+	    copylen = length - 4;
+	if (copylen > sizeof(s->data))
+	    copylen = sizeof(s->data);
+	s->length = copylen;
+	bcopy(&d->data[0], &s->data[0], copylen);
 	break;
+    }
 
-    case DVD_STRUCT_MANUFACT:
-	s->length = ntohs(d->length);
-	bcopy(&d->data[0], &s->data[0], s->length);
+    case DVD_STRUCT_MANUFACT: {
+	u_int32_t copylen = ntohs(d->length);
+
+	if (copylen > length - 4)
+	    copylen = length - 4;
+	if (copylen > sizeof(s->data))
+	    copylen = sizeof(s->data);
+	s->length = copylen;
+	bcopy(&d->data[0], &s->data[0], copylen);
 	break;
+    }
 		
     default:
 	error = EINVAL;