]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - plugins/md3model/md2.cpp
prevent string overflow in radiant md2 loader
[xonotic/netradiant.git] / plugins / md3model / md2.cpp
index 56a18ddc254e5e435221805a89adfd1563882c9b..a347c5f4909f2b7e20909cd56cd2a6bab781dc46 100644 (file)
@@ -40,17 +40,16 @@ typedef unsigned char byte;
 
    ========================================================================
  */
-#define MD2_NUMVERTEXNORMALS 162
-#define MD2_MAX_SKINNAME    64
+const int MD2_NUMVERTEXNORMALS = 162;
 
 const unsigned char MD2_IDENT[4] = { 'I', 'D', 'P', '2', };
-#define MD2_VERSION 8
+const int MD2_VERSION = 8;
 
-#define MD2_MAX_TRIANGLES   4096
-#define MD2_MAX_VERTS       2048
-#define MD2_MAX_FRAMES      512
-#define MD2_MAX_MD2SKINS    32
-#define MD2_MAX_SKINNAME    64
+const int MD2_MAX_TRIANGLES   = 4096;
+const int MD2_MAX_VERTS       = 2048;
+const int MD2_MAX_FRAMES      = 512;
+const int MD2_MAX_MD2SKINS    = 32;
+const int MD2_MAX_SKINNAME    = 64;
 
 typedef struct
 {
@@ -89,11 +88,11 @@ void istream_read_md2XyzNormal( PointerInputStream& inputStream, md2XyzNormal_t&
        inputStream.read( &xyz.lightnormalindex, 1 );
 }
 
-#define MD2_XYZNORMAL_V0   0
-#define MD2_XYZNORMAL_V1   1
-#define MD2_XYZNORMAL_V2   2
-#define MD2_XYZNORMAL_LNI  3
-#define MD2_XYZNORMAL_SIZE 4
+const int MD2_XYZNORMAL_V0   = 0;
+const int MD2_XYZNORMAL_V1   = 1;
+const int MD2_XYZNORMAL_V2   = 2;
+const int MD2_XYZNORMAL_LNI  = 3;
+const int MD2_XYZNORMAL_SIZE = 4;
 
 typedef struct
 {
@@ -234,7 +233,8 @@ void MD2Surface_read( Model& model, const byte* buffer, ArchiveFile& file ){
 
        char skinname[MD2_MAX_SKINNAME];
        char skinnameRelative[MD2_MAX_SKINNAME];
-       char path[MD2_MAX_SKINNAME];
+       char path[MD2_MAX_SKINNAME + 1];
+       path[MD2_MAX_SKINNAME] = '\0';
        int i = MD2_MAX_SKINNAME;
        PointerInputStream inputStream( buffer + header.ofs_skins );
        inputStream.read( reinterpret_cast<byte*>( skinnameRelative ), MD2_MAX_SKINNAME );
@@ -256,7 +256,8 @@ void MD2Surface_read( Model& model, const byte* buffer, ArchiveFile& file ){
        }
        else
        {
-               strcpy( skinname, skinnameRelative );
+               strncpy( skinname, skinnameRelative, MD2_MAX_SKINNAME - 1 );
+               skinname[MD2_MAX_SKINNAME - 1] = '\0';
        }
        surface.setShader( skinname );
        surface.updateAABB();