Module Name:    src
Committed By:   mrg
Date:           Sat Sep  6 18:43:00 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/radeon: evergreen_cs.c

Log Message:
test some pointers and return EINVAL instead of blindly assuming
they're valid.  converts kernel crashes in to app failures.

GL is still not working on evergreen for me.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/radeon/evergreen_cs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/radeon/evergreen_cs.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/evergreen_cs.c:1.2 src/sys/external/bsd/drm2/dist/drm/radeon/evergreen_cs.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/radeon/evergreen_cs.c:1.2	Wed Jul 16 20:59:57 2014
+++ src/sys/external/bsd/drm2/dist/drm/radeon/evergreen_cs.c	Sat Sep  6 18:43:00 2014
@@ -546,6 +546,10 @@ static int evergreen_cs_track_validate_h
 	size = roundup(nbx * nby * 4, track->npipes * (2 << 10));
 	size += track->htile_offset;
 
+	if (!track->htile_bo) {
+		dev_warn(p->dev, "%s:%d htile_bo not set", __func__, __LINE__);
+		return -EINVAL;
+	}
 	if (size > radeon_bo_size(track->htile_bo)) {
 		dev_warn(p->dev, "%s:%d htile surface too small %ld for %ld (%d %d)\n",
 				__func__, __LINE__, radeon_bo_size(track->htile_bo),
@@ -613,6 +617,10 @@ static int evergreen_cs_track_validate_s
 		return -EINVAL;
 	}
 	offset += surf.layer_size * mslice;
+	if (!track->db_s_read_bo) {
+		dev_warn(p->dev, "%s:%d db_s_read_bo not set", __func__, __LINE__);
+		return -EINVAL;
+	}
 	if (offset > radeon_bo_size(track->db_s_read_bo)) {
 		dev_warn(p->dev, "%s:%d stencil read bo too small (layer size %d, "
 			 "offset %ld, max layer %d, bo size %ld)\n",
@@ -632,6 +640,10 @@ static int evergreen_cs_track_validate_s
 		return -EINVAL;
 	}
 	offset += surf.layer_size * mslice;
+	if (!track->db_s_write_bo) {
+		dev_warn(p->dev, "%s:%d db_s_write_bo not set", __func__, __LINE__);
+		return -EINVAL;
+	}
 	if (offset > radeon_bo_size(track->db_s_write_bo)) {
 		dev_warn(p->dev, "%s:%d stencil write bo too small (layer size %d, "
 			 "offset %ld, max layer %d, bo size %ld)\n",
@@ -711,6 +723,10 @@ static int evergreen_cs_track_validate_d
 		return -EINVAL;
 	}
 	offset += surf.layer_size * mslice;
+	if (!track->db_z_read_bo) {
+		dev_warn(p->dev, "%s:%d db_z_read_bo not set", __func__, __LINE__);
+		return -EINVAL;
+	}
 	if (offset > radeon_bo_size(track->db_z_read_bo)) {
 		dev_warn(p->dev, "%s:%d depth read bo too small (layer size %d, "
 			 "offset %ld, max layer %d, bo size %ld)\n",
@@ -727,6 +743,10 @@ static int evergreen_cs_track_validate_d
 		return -EINVAL;
 	}
 	offset += surf.layer_size * mslice;
+	if (!track->db_z_write_bo) {
+		dev_warn(p->dev, "%s:%d db_z_write_bo not set", __func__, __LINE__);
+		return -EINVAL;
+	}
 	if (offset > radeon_bo_size(track->db_z_write_bo)) {
 		dev_warn(p->dev, "%s:%d depth write bo too small (layer size %d, "
 			 "offset %ld, max layer %d, bo size %ld)\n",

Reply via email to