glapi: Add the safe_{add,mul,pad} functions from xserver
authorAdam Jackson <ajax@redhat.com>
Thu, 24 Mar 2016 17:57:58 +0000 (13:57 -0400)
committerAdam Jackson <ajax@redhat.com>
Tue, 17 May 2016 19:04:56 +0000 (15:04 -0400)
We're about to update the generator scripts to use these, easier not to
vary between client and server.

Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Adam Jackson <ajax@redhat.com>
src/mapi/glapi/gen/glX_proto_send.py

index 2b3303078a21c6517d93cab4c6c1ab142c28d2d5..8b3d8d756b8d4c0a55f03625cd16b999310e44a3 100644 (file)
@@ -174,6 +174,7 @@ class PrintGlxProtoStubs(glX_proto_common.glx_print_proto):
         print '#include <X11/Xlib-xcb.h>'
         print '#include <xcb/xcb.h>'
         print '#include <xcb/glx.h>'
+        print '#include <limits.h>'
 
         print ''
         print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
@@ -181,6 +182,29 @@ class PrintGlxProtoStubs(glX_proto_common.glx_print_proto):
         self.printFastcall()
         self.printNoinline()
         print ''
+
+        print 'static _X_INLINE int safe_add(int a, int b)'
+        print '{'
+        print '    if (a < 0 || b < 0) return -1;'
+        print '    if (INT_MAX - a < b) return -1;'
+        print '    return a + b;'
+        print '}'
+        print 'static _X_INLINE int safe_mul(int a, int b)'
+        print '{'
+        print '    if (a < 0 || b < 0) return -1;'
+        print '    if (a == 0 || b == 0) return 0;'
+        print '    if (a > INT_MAX / b) return -1;'
+        print '    return a * b;'
+        print '}'
+        print 'static _X_INLINE int safe_pad(int a)'
+        print '{'
+        print '    int ret;'
+        print '    if (a < 0) return -1;'
+        print '    if ((ret = safe_add(a, 3)) < 0) return -1;'
+        print '    return ret & (GLuint)~3;'
+        print '}'
+        print ''
+
         print '#ifndef __GNUC__'
         print '#  define __builtin_expect(x, y) x'
         print '#endif'