- Update "Other Linux 3.x kernel" to "Other Linux 3.x or later kernel".
Add checks to services/plugins/dndcp/dnd/dndCPMsgV4.c to validate packet
and payload size to prevent out-of-bounds read and writes.
Correct the requestNextCmd parameter used when asking for the next piece
of a big binary transfer in RpcV4Util::RequestNextPacket().
Common header file change; not applicable to open-vm-tools.
#define STR_OS_OTHER_26 "other26xlinux"
#define STR_OS_OTHER_26_FULL "Other Linux 2.6.x kernel"
#define STR_OS_OTHER_3X "other3xlinux"
-#define STR_OS_OTHER_3X_FULL "Other Linux 3.x kernel"
+#define STR_OS_OTHER_3X_FULL "Other Linux 3.x or later kernel"
#define STR_OS_PHOTON "vmware-photon"
#define STR_OS_PHOTON_FULL "VMware Photon OS"
#define STR_OS_PLD "PLD"
#define PRODUCT_VERSION_SCALABLE_SERVER_51 PRODUCT_ESXI_BRIEF_NAME " 5.1"
#define PRODUCT_VERSION_SCALABLE_SERVER_55 PRODUCT_ESXI_BRIEF_NAME " 5.5"
#define PRODUCT_VERSION_SCALABLE_SERVER_60 PRODUCT_ESXI_BRIEF_NAME " 6.0"
+#define PRODUCT_VERSION_SCALABLE_SERVER_65 PRODUCT_ESXI_BRIEF_NAME " 6.5"
#define PRODUCT_VERSION_WGS_1 "Server 1.x"
#define PRODUCT_VERSION_WGS_2 "Server 2.x"
#define PRODUCT_VERSION_GSX_3 "GSX Server 3.x"
#define PRODUCT_VERSION_WORKSTATION_100 PRODUCT_WORKSTATION_BRIEF_NAME " 10.x"
#define PRODUCT_VERSION_WORKSTATION_110 PRODUCT_WORKSTATION_BRIEF_NAME " 11.x"
#define PRODUCT_VERSION_WORKSTATION_120 PRODUCT_WORKSTATION_BRIEF_NAME " 12.0"
+#define PRODUCT_VERSION_WORKSTATION_130 PRODUCT_WORKSTATION_BRIEF_NAME " 2017"
#define PRODUCT_VERSION_WORKSTATION_ENTERPRISE_1 "ACE 1.x"
#define PRODUCT_VERSION_WORKSTATION_ENTERPRISE_2 "ACE 2.0"
#define PRODUCT_VERSION_WORKSTATION_ENTERPRISE_25 "ACE 2.5"
#define PRODUCT_VERSION_MAC_DESKTOP_60 PRODUCT_MAC_DESKTOP_BRIEF_NAME " 6.x"
#define PRODUCT_VERSION_MAC_DESKTOP_70 PRODUCT_MAC_DESKTOP_BRIEF_NAME " 7.x"
#define PRODUCT_VERSION_MAC_DESKTOP_80 PRODUCT_MAC_DESKTOP_BRIEF_NAME " 8.x"
+#define PRODUCT_VERSION_MAC_DESKTOP_90 PRODUCT_MAC_DESKTOP_BRIEF_NAME " 2017"
#endif
return FALSE;
}
+ /* Payload size plus header size should not be greater than packet size. */
+ if (msgHdr->payloadSize + DND_CP_MSG_HEADERSIZE_V4 > packetSize) {
+ return FALSE;
+ }
+
/* Binary size is not valid. */
if (msgHdr->binarySize > DND_CP_MSG_MAX_BINARY_SIZE_V4) {
return FALSE;
msg->binary = Util_SafeMalloc(msg->hdr.binarySize);
}
+ /*
+ * Please notice msg->hdr may be different from msgHdr if this is not the
+ * first packet. We need to make sure we have sufficient buffer to contain
+ * the payload indicated by the new header(msgHdr), which may have been
+ * faked. Otherwise heap overflow will occur.
+ */
+ if (msg->hdr.binarySize < msg->hdr.payloadOffset + msgHdr->payloadSize) {
+ return FALSE;
+ }
+
/* msg->hdr.payloadOffset is used as received binary size. */
memcpy(msg->binary + msg->hdr.payloadOffset,
packet + DND_CP_MSG_HEADERSIZE_V4,
params.cmd = DNDCP_CMD_REQUEST_NEXT;
params.sessionId = mBigMsgIn.hdr.sessionId;
params.optional.requestNextCmd.cmd = mBigMsgIn.hdr.cmd;
- params.optional.requestNextCmd.cmd = mBigMsgIn.hdr.binarySize;
- params.optional.requestNextCmd.cmd = mBigMsgIn.hdr.payloadOffset;
+ params.optional.requestNextCmd.binarySize = mBigMsgIn.hdr.binarySize;
+ params.optional.requestNextCmd.payloadOffset = mBigMsgIn.hdr.payloadOffset;
return SendMsg(¶ms);
}