summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@ovn.org>2017-05-30 07:39:44 -0700
committerBen Pfaff <blp@ovn.org>2017-06-01 21:00:48 -0700
commit35368d504e0c899825496cd8e9263398cbd9bf8a (patch)
tree28cfb2327f2c4cb3fe645fed23a762d7428ee302
parent6513cb3d6dbf4479ee19b29ba4d8a3c4f71a709c (diff)
downloadopenvswitch-35368d504e0c899825496cd8e9263398cbd9bf8a.tar.gz
extract-ofp-errors: Avoid unintentional sign extension in generated code.
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>
-rwxr-xr-xbuild-aux/extract-ofp-errors6
1 files changed, 4 insertions, 2 deletions
diff --git a/build-aux/extract-ofp-errors b/build-aux/extract-ofp-errors
index 9642593d2..2312b76ed 100755
--- a/build-aux/extract-ofp-errors
+++ b/build-aux/extract-ofp-errors
@@ -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 ("""\
}