glapi: Harden GLX request size processing (v2)
v2: Use == not is for equality testing (Dylan Baker) Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
@@ -357,7 +357,7 @@ class glx_function(gl_XML.gl_function):
|
|||||||
# FIXME adds some extra diffs to the generated
|
# FIXME adds some extra diffs to the generated
|
||||||
# FIXME code.
|
# FIXME code.
|
||||||
|
|
||||||
size_string = size_string + " + __GLX_PAD(%s)" % (p.size_string(1))
|
size_string = size_string + " + safe_pad(%s)" % (p.size_string(1))
|
||||||
|
|
||||||
return size_string
|
return size_string
|
||||||
|
|
||||||
|
@@ -89,8 +89,6 @@ class PrintGlxDispatchFunctions(glX_proto_common.glx_print_proto):
|
|||||||
print '#include "indirect_util.h"'
|
print '#include "indirect_util.h"'
|
||||||
print '#include "singlesize.h"'
|
print '#include "singlesize.h"'
|
||||||
print ''
|
print ''
|
||||||
print '#define __GLX_PAD(x) (((x) + 3) & ~3)'
|
|
||||||
print ''
|
|
||||||
print 'typedef struct {'
|
print 'typedef struct {'
|
||||||
print ' __GLX_PIXEL_3D_HDR;'
|
print ' __GLX_PIXEL_3D_HDR;'
|
||||||
print '} __GLXpixel3DHeader;'
|
print '} __GLXpixel3DHeader;'
|
||||||
|
@@ -176,8 +176,6 @@ class PrintGlxProtoStubs(glX_proto_common.glx_print_proto):
|
|||||||
print '#include <xcb/glx.h>'
|
print '#include <xcb/glx.h>'
|
||||||
print '#include <limits.h>'
|
print '#include <limits.h>'
|
||||||
|
|
||||||
print ''
|
|
||||||
print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
|
|
||||||
print ''
|
print ''
|
||||||
self.printFastcall()
|
self.printFastcall()
|
||||||
self.printNoinline()
|
self.printNoinline()
|
||||||
|
@@ -291,7 +291,7 @@ class glx_server_enum_function(glx_enum_function):
|
|||||||
print ''
|
print ''
|
||||||
print ' compsize = __gl%s_size(%s);' % (f.name, string.join(f.count_parameter_list, ","))
|
print ' compsize = __gl%s_size(%s);' % (f.name, string.join(f.count_parameter_list, ","))
|
||||||
p = f.variable_length_parameter()
|
p = f.variable_length_parameter()
|
||||||
print ' return __GLX_PAD(%s);' % (p.size_string())
|
print ' return safe_pad(%s);' % (p.size_string())
|
||||||
|
|
||||||
print '}'
|
print '}'
|
||||||
print ''
|
print ''
|
||||||
@@ -428,7 +428,7 @@ class PrintGlxReqSize_h(PrintGlxReqSize_common):
|
|||||||
def printBody(self, api):
|
def printBody(self, api):
|
||||||
for func in api.functionIterateGlx():
|
for func in api.functionIterateGlx():
|
||||||
if not func.ignore and func.has_variable_size_request():
|
if not func.ignore and func.has_variable_size_request():
|
||||||
print 'extern PURE _X_HIDDEN int __glX%sReqSize(const GLbyte *pc, Bool swap);' % (func.name)
|
print 'extern PURE _X_HIDDEN int __glX%sReqSize(const GLbyte *pc, Bool swap, int reqlen);' % (func.name)
|
||||||
|
|
||||||
|
|
||||||
class PrintGlxReqSize_c(PrintGlxReqSize_common):
|
class PrintGlxReqSize_c(PrintGlxReqSize_common):
|
||||||
@@ -452,20 +452,18 @@ class PrintGlxReqSize_c(PrintGlxReqSize_common):
|
|||||||
print '#include "indirect_size.h"'
|
print '#include "indirect_size.h"'
|
||||||
print '#include "indirect_reqsize.h"'
|
print '#include "indirect_reqsize.h"'
|
||||||
print ''
|
print ''
|
||||||
print '#define __GLX_PAD(x) (((x) + 3) & ~3)'
|
|
||||||
print ''
|
|
||||||
print '#if defined(__CYGWIN__) || defined(__MINGW32__)'
|
print '#if defined(__CYGWIN__) || defined(__MINGW32__)'
|
||||||
print '# undef HAVE_ALIAS'
|
print '# undef HAVE_ALIAS'
|
||||||
print '#endif'
|
print '#endif'
|
||||||
print '#ifdef HAVE_ALIAS'
|
print '#ifdef HAVE_ALIAS'
|
||||||
print '# define ALIAS2(from,to) \\'
|
print '# define ALIAS2(from,to) \\'
|
||||||
print ' GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \\'
|
print ' GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap, int reqlen ) \\'
|
||||||
print ' __attribute__ ((alias( # to )));'
|
print ' __attribute__ ((alias( # to )));'
|
||||||
print '# define ALIAS(from,to) ALIAS2( from, __glX ## to ## ReqSize )'
|
print '# define ALIAS(from,to) ALIAS2( from, __glX ## to ## ReqSize )'
|
||||||
print '#else'
|
print '#else'
|
||||||
print '# define ALIAS(from,to) \\'
|
print '# define ALIAS(from,to) \\'
|
||||||
print ' GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \\'
|
print ' GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap, int reqlen ) \\'
|
||||||
print ' { return __glX ## to ## ReqSize( pc, swap ); }'
|
print ' { return __glX ## to ## ReqSize( pc, swap, reqlen ); }'
|
||||||
print '#endif'
|
print '#endif'
|
||||||
print ''
|
print ''
|
||||||
print ''
|
print ''
|
||||||
@@ -547,7 +545,7 @@ class PrintGlxReqSize_c(PrintGlxReqSize_common):
|
|||||||
|
|
||||||
def common_func_print_just_header(self, f):
|
def common_func_print_just_header(self, f):
|
||||||
print 'int'
|
print 'int'
|
||||||
print '__glX%sReqSize( const GLbyte * pc, Bool swap )' % (f.name)
|
print '__glX%sReqSize( const GLbyte * pc, Bool swap, int reqlen )' % (f.name)
|
||||||
print '{'
|
print '{'
|
||||||
|
|
||||||
|
|
||||||
@@ -602,7 +600,6 @@ class PrintGlxReqSize_c(PrintGlxReqSize_common):
|
|||||||
offset = 0
|
offset = 0
|
||||||
fixup = []
|
fixup = []
|
||||||
params = []
|
params = []
|
||||||
plus = ''
|
|
||||||
size = ''
|
size = ''
|
||||||
param_offsets = {}
|
param_offsets = {}
|
||||||
|
|
||||||
@@ -620,9 +617,10 @@ class PrintGlxReqSize_c(PrintGlxReqSize_common):
|
|||||||
if s == 0: s = 1
|
if s == 0: s = 1
|
||||||
|
|
||||||
sig += "(%u,%u)" % (f.offset_of(p.counter), s)
|
sig += "(%u,%u)" % (f.offset_of(p.counter), s)
|
||||||
size += '%s%s' % (plus, p.size_string())
|
if size == '':
|
||||||
plus = ' + '
|
size = p.size_string()
|
||||||
|
else:
|
||||||
|
size = "safe_add(%s, %s)" % (size, p.size_string())
|
||||||
|
|
||||||
# If the calculated signature matches a function that has
|
# If the calculated signature matches a function that has
|
||||||
# already be emitted, don't emit this function. Instead, add
|
# already be emitted, don't emit this function. Instead, add
|
||||||
@@ -645,7 +643,7 @@ class PrintGlxReqSize_c(PrintGlxReqSize_common):
|
|||||||
self.common_emit_fixups(fixup)
|
self.common_emit_fixups(fixup)
|
||||||
print ''
|
print ''
|
||||||
|
|
||||||
print ' return __GLX_PAD(%s);' % (size)
|
print ' return safe_pad(%s);' % (size)
|
||||||
print '}'
|
print '}'
|
||||||
print ''
|
print ''
|
||||||
|
|
||||||
|
@@ -576,7 +576,7 @@ class gl_parameter(object):
|
|||||||
list.append( str(s) )
|
list.append( str(s) )
|
||||||
|
|
||||||
if len(list) > 1 and use_parens :
|
if len(list) > 1 and use_parens :
|
||||||
return "(%s)" % (string.join(list, " * "))
|
return "safe_mul(%s)" % (string.join(list, ", "))
|
||||||
else:
|
else:
|
||||||
return string.join(list, " * ")
|
return string.join(list, " * ")
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user