spice_codegen: Always write a channels entry for an ifdef-ed channel

Before this patch, if a channel is defined conditionally in spice.proto
(because it depends on external headers like the smartcard channel),
spice_codegen would write an entry to the channels array in
spice_get_*_channel_parser which would only take up a place in the array
if the ifdef condition is true, thus moving up all other intializers
one place when it is not true. This was causing issues (crashes) when building
spice-gtk with the combination of usbredir support enabled and smartcard
support disabled.

This patch fixes this by adding #else { NULL, 0 }, to the generated code.

Thanks to coolper chen <lixin.chen@saicocch.com> for reporting this!

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Hans de Goede 2011-09-30 11:19:38 +02:00 committed by Marc-André Lureau
parent 12a5ce3dc5
commit ca57afda34
2 changed files with 11 additions and 0 deletions

View File

@ -328,6 +328,12 @@ class CodeWriter:
self.write("#ifdef %s" % (name)).newline()
self.indentation = indentation
def ifdef_else(self, name):
indentation = self.indentation
self.indentation = 0;
self.write("#else /* %s */" % (name)).newline()
self.indentation = indentation
def endif(self, name):
indentation = self.indentation
self.indentation = 0;

View File

@ -1192,6 +1192,11 @@ def write_get_channel_parser(writer, channel_parsers, max_channel, is_server):
writer.write(",")
writer.newline()
if channel and channel.has_attr("ifdef"):
writer.ifdef_else(channel.attributes["ifdef"][0])
writer.write("{ NULL, 0 }")
if i != max_channel:
writer.write(",")
writer.newline()
writer.endif(channel.attributes["ifdef"][0])
writer.end_block(semicolon = True)