]> git.tdb.fi Git - gldbg.git/blobdiff - source/glprint.c
Protect against giving invalid pointers to writev
[gldbg.git] / source / glprint.c
index 0081953d8b088de4998ecc8c62b5c6e8d91d499c..6f645a7175bf6cd6daa746973267190f55dd7622 100644 (file)
@@ -14,6 +14,8 @@ Distributed under the GPL
 #include "glprint.h"
 #include "tmpalloc.h"
 
+#define UNUSED __attribute__((unused))
+
 typedef struct sGlPrintData
 {
        char *buffer;
@@ -24,6 +26,7 @@ typedef struct sGlPrintData
 static void init_print(GlDecoder *);
 static void glprint_free(void *);
 static void print_gldError(void *, GLenum);
+static void print_unhandled(void *, unsigned short);
 
 GlDecoder *glprint_new(char *buffer, unsigned bufsize)
 {
@@ -45,6 +48,7 @@ GlDecoder *glprint_new(char *buffer, unsigned bufsize)
 
        init_print(dec);
        dec->gldError = print_gldError;
+       dec->unhandled = print_unhandled;
 
        return dec;
 }
@@ -119,6 +123,12 @@ static const char *print_data(const void *data, unsigned size)
 {
        if(!data)
                return "NULL";
+       else if((unsigned long)data<0x100000)
+       {
+               char *buffer = tmpalloc(20);
+               snprintf(buffer, 20, "%p", data);
+               return buffer;
+       }
        else if(!size)
                return "/* data */";
        else
@@ -129,10 +139,16 @@ static const char *print_data(const void *data, unsigned size)
        }
 }
 
-#include "glprint.funcs"
+#include "gensrc/glprint.funcs"
 
 static void print_gldError(void *user_data, GLenum code)
 {
        GlPrintData *gpd = (GlPrintData *)user_data;
        snprintf(gpd->buffer, gpd->bufsize, "ERROR: %s", describe_enum(code, "ErrorCode"));
 }
+
+static void print_unhandled(void *user_data, unsigned short func UNUSED)
+{
+       GlPrintData *gpd = (GlPrintData *)user_data;
+       gpd->buffer[0] = 0;
+}