aboutsummaryrefslogtreecommitdiff
path: root/lib/libefivar
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2017-03-23 02:30:52 +0000
committerWarner Losh <imp@FreeBSD.org>2017-03-23 02:30:52 +0000
commit8af6a2c64e86a7d24d41778130323e9195479402 (patch)
tree8c491e06632c54ad996aef7d34b8501ae0046b8c /lib/libefivar
parenta121d3a8dc6dfd3b315922b809d252c15ad31898 (diff)
downloadsrc-8af6a2c64e86a7d24d41778130323e9195479402.tar.gz
src-8af6a2c64e86a7d24d41778130323e9195479402.zip
Define StrCmp in a funky was to be bug-compatible with EDK2 code.
Paper over a coverity issue: *** CID 1372592: API usage errors (BAD_COMPARE) /lib/libefivar/efivar-dp-parse.c: 2723 in DevPathFromTextiSCSI() Truncating the result of "strcmp" to "unsigned short" may cause it to be misinterpreted as 0. Note that "strcmp" may return an integer besides -1, 0, or 1. We do this by making StrCmp return either 0 or 1 for equal or not-equal. There's a bug in the DevPathFromTextiSCSI cast of the return value and this workaround will fix it without breaking other users of StrCmp (all of which test for == 0). https://bugzilla.tianocore.org/show_bug.cgi?id=440 has been filed upstream to log this issue. CID: 1372592 Sponsored by: Netflix
Notes
Notes: svn path=/head/; revision=315770
Diffstat (limited to 'lib/libefivar')
-rw-r--r--lib/libefivar/uefi-dplib.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/libefivar/uefi-dplib.h b/lib/libefivar/uefi-dplib.h
index 464c2e9695a8..a7d3b72c4b6d 100644
--- a/lib/libefivar/uefi-dplib.h
+++ b/lib/libefivar/uefi-dplib.h
@@ -508,7 +508,16 @@ UefiDevicePathLibConvertTextToDevicePath (
#define LShiftU64(x, s) ((x) << s)
#define ReadUnaligned64(x) le64dec(x)
#define ReallocatePool(old, new, ptr) realloc(ptr, new)
-#define StrCmp(a, b) strcmp(a, b)
+/*
+ * Quirky StrCmp returns 0 if equal, 1 if not. This is what the code
+ * expects, though that expectation is likely a bug (it casts the
+ * return value. EDK2's StrCmp returns values just like C's strcmp,
+ * but the parse code casts this to an UINTN, which is bogus. This
+ * definition papers over that bogusness to do the right thing. If
+ * iSCSI protocol string processing is ever fixed, we can remove this
+ * bletcherous kludge.
+ */
+#define StrCmp(a, b) (strcmp(a, b) != 0)
#define StrCpyS(d, l, s) strcpy(d, s)
#define StrHexToUint64(x) strtoll(x, NULL, 16)
#define StrHexToUintn(x) strtoll(x, NULL, 16)