]> git.proxmox.com Git - mirror_ovs.git/commitdiff
extract-ofp-errors: Avoid unintentional sign extension in generated code.
authorBen Pfaff <blp@ovn.org>
Tue, 30 May 2017 14:39:44 +0000 (07:39 -0700)
committerBen Pfaff <blp@ovn.org>
Fri, 2 Jun 2017 04:00:48 +0000 (21:00 -0700)
Code generated by this program includes constructs like this:

    switch (((uint64_t) vendor << 32) | (type << 16) | code)

with variables uint32_t vendor, uint16_t type, uint16_t code.  By C rules,
"type << 16" has type "int", which means that it will be sign-extended to
64 bits when ORed with uint64_t.  Thus, if 'type' has bit 15 set, then
the overall result will have all of its top 32 bits set, which is not
the desired result.

This commit fixes the problem.

No actual error types used in OVS or OpenFlow have bit 15 set, so this
does not fix a user-visible problem.

Found by Coverity.

Reported-at: https://scan3.coverity.com/reports.htm#v16889/p10449/fileInstanceId=14762955&defectInstanceId=4304798&mergedDefectId=180406
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Justin Pettit <jpettit@ovn.org>
build-aux/extract-ofp-errors

index 9642593d24581b96863ef00cf74e0ac19cd2c354..2312b76ed85c20815d5141643e92569d2c66ab7f 100755 (executable)
@@ -391,7 +391,8 @@ static const char *error_comments[OFPERR_N_ERRORS] = {
 static enum ofperr
 %s_decode(uint32_t vendor, uint16_t type, uint16_t code)
 {
-    switch (((uint64_t) vendor << 32) | (type << 16) | code) {""" % name)
+    switch (((uint64_t) vendor << 32) | (uint32_t) (type << 16) | code) {"""
+               % name)
         found = set()
         for enum in names:
             if enum not in map:
@@ -405,7 +406,8 @@ static enum ofperr
                 vendor_s = "(%#xULL << 32) | " % vendor
             else:
                 vendor_s = ""
-            print ("    case %s(%d << 16) | %d:" % (vendor_s, type_, code))
+            print ("    case %s(uint32_t) (%d << 16) | %d:" % (vendor_s,
+                                                               type_, code))
             print ("        return OFPERR_%s;" % enum)
         print ("""\
     }