VirtualBox

Changeset 73223 in vbox


Ignore:
Timestamp:
Jul 18, 2018 8:07:50 PM (7 years ago)
Author:
vboxsync
Message:

3D: texture unpacking reworked, bugref:9192. Merged r123597, r123598, r123600, r123601, r123755.

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:mergeinfo
      •  

        old new  
        88/branches/VBox-5.0:104445,104938,104943,104950,104952-104953,104987-104988,104990,106453
        99/branches/VBox-5.1:112367,115992,116543,116550,116568,116573
        10 /branches/VBox-5.2:120083,120099,120213,120221,120239
         10/branches/VBox-5.2:120083,120099,120213,120221,120239,123597-123598,123600-123601,123755
        1111/branches/andy/draganddrop:90781-91268
        1212/branches/andy/guestctrl20:78916,78930
  • trunk/src/VBox

    • Property svn:mergeinfo
      •  

        old new  
        88/branches/VBox-5.0/src/VBox:104938,104943,104950,104987-104988,104990,106453
        99/branches/VBox-5.1/src/VBox:112367,116543,116550,116568,116573
        10 /branches/VBox-5.2/src/VBox:120083,120099,120213,120221,120239
         10/branches/VBox-5.2/src/VBox:120083,120099,120213,120221,120239,123597-123598,123600-123601,123755
        1111/branches/andy/draganddrop/src/VBox:90781-91268
        1212/branches/andy/guestctrl20/src/VBox:78916,78930
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_unpack.h

    r71469 r73223  
    7070
    7171#define DATA_POINTER_CHECK( offset ) \
    72     ( (cr_unpackDataEnd ? cr_unpackData + (offset) < cr_unpackDataEnd : true) )
     72    ( (offset) >= 0 && (cr_unpackDataEnd >= cr_unpackData) && (size_t)(cr_unpackDataEnd - cr_unpackData) > (size_t)(offset) )
    7373
    7474#define INCR_DATA_PTR( delta ) \
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_teximage.c

    r69392 r73223  
    740740    CRStateBits *sb = GetCurrentBits();
    741741    CRTextureBits *tb = &(sb->texture);
    742     const int is_distrib = ((type == GL_TRUE) || (type == GL_FALSE));
     742    // Distributed textures are not used by VBox
     743    const int is_distrib = 0; // ((type == GL_TRUE) || (type == GL_FALSE));
    743744
    744745    FLUSH();
  • trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c

    r69989 r73223  
    10791079
    10801080#ifndef IN_GUEST
     1081    /* Expect only CR_MESSAGE_OPCODES from the guest. */
     1082    AssertPtrReturnVoid(conn->pBuffer);
     1083
     1084    if (   conn->cbBuffer >= sizeof(CRMessageHeader)
     1085        && ((CRMessageHeader*) (conn->pBuffer))->type == CR_MESSAGE_OPCODES)
     1086    {
     1087        /* Looks good. */
     1088    }
     1089    else
     1090    {
     1091        AssertFailed();
     1092        /** @todo Find out if this is the expected cleanup. */
     1093        conn->cbBuffer = 0;
     1094        conn->pBuffer  = NULL;
     1095        return;
     1096    }
     1097#endif
     1098
     1099#ifndef IN_GUEST
    10811100    if (conn->allow_redir_ptr)
    10821101    {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_getshaders.c

    r69500 r73223  
    3737void SERVER_DISPATCH_APIENTRY crServerDispatchGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, char *name)
    3838{
    39     crGetActive_t *pLocal;
    40 
    41     pLocal = (crGetActive_t*) crAlloc(bufSize+sizeof(crGetActive_t));
     39    crGetActive_t *pLocal = NULL;
     40
     41    if (bufSize < INT32_MAX / 2)
     42        pLocal = (crGetActive_t*)crAlloc(bufSize + sizeof(crGetActive_t));
     43
    4244    if (!pLocal)
    4345    {
     
    5658void SERVER_DISPATCH_APIENTRY crServerDispatchGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, char *name)
    5759{
    58     crGetActive_t *pLocal;
    59 
    60     pLocal = (crGetActive_t*) crAlloc(bufSize+sizeof(crGetActive_t));
     60    crGetActive_t *pLocal = NULL;
     61
     62    if (bufSize < INT32_MAX / 2)
     63        pLocal = (crGetActive_t*) crAlloc(bufSize + sizeof(crGetActive_t));
     64
    6165    if (!pLocal)
    6266    {
     
    7579void SERVER_DISPATCH_APIENTRY crServerDispatchGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders)
    7680{
    77     GLsizei *pLocal;
    78 
    79     pLocal = (GLsizei*) crAlloc(maxCount*sizeof(GLuint)+sizeof(GLsizei));
     81    GLsizei *pLocal = NULL;
     82
     83    if (maxCount < INT32_MAX / sizeof(GLuint) / 2)
     84        pLocal = (GLsizei*) crAlloc(maxCount * sizeof(GLuint) + sizeof(GLsizei));
     85
    8086    if (!pLocal)
    8187    {
     
    102108void SERVER_DISPATCH_APIENTRY crServerDispatchGetAttachedObjectsARB(VBoxGLhandleARB containerObj, GLsizei maxCount, GLsizei * count, VBoxGLhandleARB * obj)
    103109{
    104     GLsizei *pLocal;
    105 
    106     pLocal = (GLsizei*) crAlloc(maxCount*sizeof(VBoxGLhandleARB)+sizeof(GLsizei));
     110    GLsizei *pLocal = NULL;
     111
     112    if (maxCount < INT32_MAX / sizeof(VBoxGLhandleARB) / 2)
     113        pLocal = (GLsizei*) crAlloc(maxCount * sizeof(VBoxGLhandleARB) + sizeof(GLsizei));
     114
    107115    if (!pLocal)
    108116    {
     
    131139void SERVER_DISPATCH_APIENTRY crServerDispatchGetInfoLogARB(VBoxGLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog)
    132140{
    133     GLsizei *pLocal;
     141    GLsizei *pLocal = NULL;
    134142    GLuint hwid;
    135143
    136     pLocal = (GLsizei*) crAlloc(maxLength+sizeof(GLsizei));
     144    if (maxLength < INT32_MAX / 2)
     145        pLocal = (GLsizei*) crAlloc(maxLength + sizeof(GLsizei));
     146
    137147    if (!pLocal)
    138148    {
     
    154164void SERVER_DISPATCH_APIENTRY crServerDispatchGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, char *infoLog)
    155165{
    156     GLsizei *pLocal;
    157 
    158     pLocal = (GLsizei*) crAlloc(bufSize+sizeof(GLsizei));
     166    GLsizei *pLocal = NULL;
     167
     168    if (bufSize < INT32_MAX / 2)
     169        pLocal = (GLsizei*) crAlloc(bufSize + sizeof(GLsizei));
     170
    159171    if (!pLocal)
    160172    {
     
    172184void SERVER_DISPATCH_APIENTRY crServerDispatchGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, char *infoLog)
    173185{
    174     GLsizei *pLocal;
    175 
    176     pLocal = (GLsizei*) crAlloc(bufSize+sizeof(GLsizei));
     186    GLsizei *pLocal = NULL;
     187
     188    if (bufSize < INT32_MAX / 2)
     189        pLocal = (GLsizei*) crAlloc(bufSize + sizeof(GLsizei));
     190
    177191    if (!pLocal)
    178192    {
     
    191205void SERVER_DISPATCH_APIENTRY crServerDispatchGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, char *source)
    192206{
    193     GLsizei *pLocal;
    194 
    195     pLocal = (GLsizei*) crAlloc(bufSize+sizeof(GLsizei));
     207    GLsizei *pLocal = NULL;
     208
     209    if (bufSize < INT32_MAX / 2)
     210        pLocal = (GLsizei*) crAlloc(bufSize + sizeof(GLsizei));
     211
    196212    if (!pLocal)
    197213    {
     
    211227crServerDispatchGetUniformsLocations(GLuint program, GLsizei maxcbData, GLsizei * cbData, GLvoid * pData)
    212228{
    213     GLsizei *pLocal;
     229    GLsizei *pLocal = NULL;
    214230
    215231    (void) cbData;
    216232    (void) pData;
    217233
    218     pLocal = (GLsizei*) crAlloc(maxcbData+sizeof(GLsizei));
     234    if (maxcbData < INT32_MAX / 2)
     235        pLocal = (GLsizei*) crAlloc(maxcbData + sizeof(GLsizei));
     236
    219237    if (!pLocal)
    220238    {
     
    235253crServerDispatchGetAttribsLocations(GLuint program, GLsizei maxcbData, GLsizei * cbData, GLvoid * pData)
    236254{
    237     GLsizei *pLocal;
     255    GLsizei *pLocal = NULL;
    238256
    239257    (void) cbData;
    240258    (void) pData;
    241259
    242     pLocal = (GLsizei*) crAlloc(maxcbData+sizeof(GLsizei));
     260    if (maxcbData < INT32_MAX / 2)
     261        pLocal = (GLsizei*) crAlloc(maxcbData + sizeof(GLsizei));
     262
    243263    if (!pLocal)
    244264    {
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_drawpixels.c

    r69390 r73223  
    88#include "cr_error.h"
    99
     10#include "state/cr_bufferobject.h"
     11
    1012void crUnpackDrawPixels( void )
    1113{
     
    1618    GLint noimagedata = READ_DATA( sizeof( int ) + 16, GLint );
    1719    GLvoid *pixels;
     20
     21    if (noimagedata && !crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
     22        return;
    1823
    1924    if (noimagedata)
     
    4247    GLuint noimagedata = READ_DATA( sizeof( int ) + 24, GLuint );
    4348    GLubyte *bitmap;
     49
     50    if (noimagedata && !crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
     51        return;
    4452
    4553    if (noimagedata)
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_pixelmap.c

    r69390 r73223  
    66
    77#include "unpacker.h"
     8#include "state/cr_bufferobject.h"
    89
    910void crUnpackPixelMapfv( void  )
     
    1314    int nodata = READ_DATA( sizeof(int) + 8, int);
    1415    GLfloat *values;
     16
     17    if (nodata && !crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
     18        return;
    1519
    1620    if (nodata)
     
    3034    GLuint *values;
    3135
     36    if (nodata && !crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
     37        return;
     38
    3239    if (nodata)
    3340        values = (GLuint*) (uintptr_t) READ_DATA(sizeof(int) + 12, GLint);
     
    4653    GLushort *values;
    4754
     55    if (nodata && !crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
     56        return;
     57
    4858    if (nodata)
    4959        values = (GLushort*) (uintptr_t) READ_DATA(sizeof(int) + 12, GLint);
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_program.c

    r71903 r73223  
    9292void crUnpackExtendAreProgramsResidentNV(void)
    9393{
    94         GLsizei n = READ_DATA(8, GLsizei);
    95         const GLuint *programs = DATA_POINTER(12, const GLuint);
    96         SET_RETURN_PTR(12 + n * sizeof(GLuint));
    97         SET_WRITEBACK_PTR(20 + n * sizeof(GLuint));
    98         (void) cr_unpackDispatch.AreProgramsResidentNV(n, programs, NULL);
     94    GLsizei n = READ_DATA(8, GLsizei);
     95    const GLuint *programs = DATA_POINTER(12, const GLuint);
     96
     97    if (n > UINT32_MAX / sizeof(GLuint) / 4 || !DATA_POINTER_CHECK(20 + n * sizeof(GLuint)))
     98    {
     99        crError("crUnpackExtendAreProgramsResidentNV: %d is out of range", n);
     100        return;
     101    }
     102
     103    SET_RETURN_PTR(12 + n * sizeof(GLuint));
     104    SET_WRITEBACK_PTR(20 + n * sizeof(GLuint));
     105    (void) cr_unpackDispatch.AreProgramsResidentNV(n, programs, NULL);
    99106}
    100107
     
    215222void crUnpackExtendGetProgramNamedParameterdvNV(void)
    216223{
    217         GLuint id = READ_DATA(8, GLuint);
    218         GLsizei len = READ_DATA(12, GLsizei);
    219         const GLubyte *name = DATA_POINTER(16, GLubyte);
    220         SET_RETURN_PTR(16+len);
    221         SET_WRITEBACK_PTR(16+len+8);
    222         cr_unpackDispatch.GetProgramNamedParameterdvNV(id, len, name, NULL);
     224    GLuint id = READ_DATA(8, GLuint);
     225    GLsizei len = READ_DATA(12, GLsizei);
     226    const GLubyte *name = DATA_POINTER(16, GLubyte);
     227
     228    if (len > UINT32_MAX / 4 || !DATA_POINTER_CHECK(16 + len + 8))
     229    {
     230        crError("crUnpackExtendGetProgramNamedParameterdvNV: len %d is out of range", len);
     231        return;
     232    }
     233
     234    SET_RETURN_PTR(16+len);
     235    SET_WRITEBACK_PTR(16+len+8);
     236    cr_unpackDispatch.GetProgramNamedParameterdvNV(id, len, name, NULL);
    223237}
    224238
    225239void crUnpackExtendGetProgramNamedParameterfvNV(void)
    226240{
    227         GLuint id = READ_DATA(8, GLuint);
    228         GLsizei len = READ_DATA(12, GLsizei);
    229         const GLubyte *name = DATA_POINTER(16, GLubyte);
    230         SET_RETURN_PTR(16+len);
    231         SET_WRITEBACK_PTR(16+len+8);
    232         cr_unpackDispatch.GetProgramNamedParameterfvNV(id, len, name, NULL);
     241    GLuint id = READ_DATA(8, GLuint);
     242    GLsizei len = READ_DATA(12, GLsizei);
     243    const GLubyte *name = DATA_POINTER(16, GLubyte);
     244
     245    if (len > UINT32_MAX / 4 || !DATA_POINTER_CHECK(16 + len + 8))
     246    {
     247        crError("crUnpackExtendGetProgramNamedParameterfvNV: len %d is out of range", len);
     248        return;
     249    }
     250
     251    SET_RETURN_PTR(16+len);
     252    SET_WRITEBACK_PTR(16+len+8);
     253    cr_unpackDispatch.GetProgramNamedParameterfvNV(id, len, name, NULL);
    233254}
    234255
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_texture.c

    r70601 r73223  
    327327    GLsizei n = READ_DATA( 8, GLsizei );
    328328    const GLuint *textures = DATA_POINTER( 12, const GLuint );
     329
     330    if (n > UINT32_MAX / sizeof(GLuint) / 4 || !DATA_POINTER_CHECK(20 + n * sizeof(GLuint)))
     331    {
     332        crError("crUnpackExtendAreTexturesResident: %d is out of range", n);
     333        return;
     334    }
     335
    329336    SET_RETURN_PTR(12 + n * sizeof(GLuint));
    330337    SET_WRITEBACK_PTR(20 + n * sizeof(GLuint));
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette