mesa: add buffer != 0 checks to glNamedBufferEXT functions
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Fri, 26 Apr 2019 15:47:05 +0000 (17:47 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 28 Jun 2019 19:41:26 +0000 (15:41 -0400)
The EXT_direct_state_access spec says:

    INVALID_OPERATION is generated by GetNamedBufferParameterivEXT,
    GetNamedBufferPointervEXT, GetNamedBufferSubDataEXT,
    MapNamedBufferEXT, NamedBufferDataEXT, NamedBufferSubDataEXT, and
    UnmapNamedBufferEXT if the buffer parameter is zero.

This commits adds buffer != 0 validation to the implemented functions.

glNamedBufferStorageEXT isn't included in this list and the EXT_buffer_storage
doesn't says that buffer = 0 is an error either so I didn't add the same
validation for this function.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/main/bufferobj.c

index 71bc9312f45504608188fc72615df7e49db9e5da..31c222ebf9a05a29952dc4c745e37000ccd931b2 100644 (file)
@@ -2189,8 +2189,15 @@ _mesa_NamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const GLvoid *data,
                          GLenum usage)
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct gl_buffer_object *bufObj;
 
-   struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
+   if (!buffer) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glNamedBufferDataEXT(invalid buffer 0)");
+      return;
+   }
+
+   bufObj = _mesa_lookup_bufferobj(ctx, buffer);
    if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
                                      &bufObj, "glNamedBufferDataEXT"))
       return;
@@ -2331,8 +2338,15 @@ _mesa_NamedBufferSubDataEXT(GLuint buffer, GLintptr offset,
                             GLsizeiptr size, const GLvoid *data)
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct gl_buffer_object *bufObj;
 
-   struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
+   if (!buffer) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glNamedBufferSubDataEXT(invalid buffer 0)");
+      return;
+   }
+
+   bufObj = _mesa_lookup_bufferobj(ctx, buffer);
    if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
                                      &bufObj, "glNamedBufferSubDataEXT"))
       return;
@@ -2702,6 +2716,12 @@ _mesa_UnmapNamedBufferEXT(GLuint buffer)
    GET_CURRENT_CONTEXT(ctx);
    struct gl_buffer_object *bufObj;
 
+   if (!buffer) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glUnmapNamedBufferEXT(invalid buffer 0)");
+      return GL_FALSE;
+   }
+
    bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, "glUnmapNamedBuffer");
    if (!bufObj)
       return GL_FALSE;
@@ -3310,6 +3330,12 @@ void * GLAPIENTRY
 _mesa_MapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length,
                              GLbitfield access)
 {
+   GET_CURRENT_CONTEXT(ctx);
+   if (!buffer) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapNamedBufferRangeEXT(invalid buffer 0)");
+      return NULL;
+   }
    return map_named_buffer_range(buffer, offset, length, access, true,
                                  "glMapNamedBufferRangeEXT");
 }
@@ -3431,6 +3457,11 @@ _mesa_MapNamedBufferEXT(GLuint buffer, GLenum access)
    GET_CURRENT_CONTEXT(ctx);
 
    GLbitfield accessFlags;
+   if (!buffer) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapNamedBufferEXT(invalid buffer 0)");
+      return NULL;
+   }
    if (!get_map_buffer_access_flags(ctx, access, &accessFlags)) {
       _mesa_error(ctx, GL_INVALID_ENUM, "glMapNamedBufferEXT(invalid access)");
       return NULL;