BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / c4a1ba4bf904af4c5944b30c698180d41df41911 / drivers

// Related

Nucleus

Barry Fixed resource leak in VFS c4a1ba4 (3 years, 2 months ago)
diff --git a/drivers/video/bga.c b/drivers/video/bga.c
index 3354d01..061409a 100644
--- a/drivers/video/bga.c
+++ b/drivers/video/bga.c
@@ -10,9 +10,11 @@
 #include <sys/stat.h>
 #include <sys/fb.h>
 #include <fcntl.h>
+#include <errno.h>
 #include <io.h>
 #include <nucleus/driver.h>
-#include <nucleus/panic.h>
+#include <nucleus/kernel.h>
+#include <nucleus/memory.h>
 #include <nucleus/pci.h>
 #include <nucleus/vfs.h>
 
@@ -108,22 +110,33 @@ bga_dev_ioctl(File *file, unsigned long request, uintptr_t argp)
 	FBVarInfo *vinfo;
 	FBFixInfo *finfo;
 
+	if (!argp)
+		return -EFAULT;
+
 	switch (request) {
 	case FBIOGET_VSCREENINFO:
 		vinfo = (void *) argp;
+		if (!verify_access(vinfo, sizeof(FBVarInfo), PROT_WRITE))
+			return -EFAULT;
 		vinfo->xres = bgaDev.width;
 		vinfo->yres = bgaDev.height;
 		vinfo->bpp = bgaDev.bpp;
 		return 0;
 	case FBIOPUT_VSCREENINFO:
 		vinfo = (void *) argp;
+		if (!verify_access(vinfo, sizeof(FBVarInfo), PROT_WRITE))
+			return -EFAULT;
 		bga_set_mode(vinfo->xres, vinfo->yres, vinfo->bpp);
 		return 0;
 	case FBIOGET_FSCREENINFO:
 		finfo = (void *) argp;
+		if (!verify_access(finfo, sizeof(FBFixInfo), PROT_WRITE))
+			return -EFAULT;
 		finfo->fbmem = bgaDev.lfb;
 		finfo->fbmemLen = bgaDev.memSize;
 		return 0;
+	default:
+		return -EINVAL;
 	}
 }