}
/*
- * TBD -
- * - validate the packet size with the header, write request and write data
+ * Validate the packet size with the header, write request and write data.
*/
+ if (!HSPU_ValidateDataPacketSize(input->packet, requestWriteDataSize) ||
+ !HSPU_ValidateRequestPacketSize(input->packet,
+ requestWriteHeaderSize,
+ requestWritePacketSize,
+ requestWritePacketDataSize)) {
+ status = HGFS_ERROR_INVALID_PARAMETER;
+ LOG(4, ("%s: Error: write data size pkt %"FMTSZ"u data %"FMTSZ"u\n",
+ __FUNCTION__, requestWritePacketDataSize, requestWriteDataSize));
+ goto exit;
+ }
/*
* Now map the file handle, and extract the details of the write e.g. writing
HSPU_PutMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
HgfsServerChannelCallbacks *chanCb); // IN: Channel callbacks
+Bool
+HSPU_ValidateRequestPacketSize(HgfsPacket *packet, // IN: Hgfs Packet
+ size_t requestHeaderSize, // IN: request header size
+ size_t requestOpSize, // IN: request packet size
+ size_t requestOpDataSize); // IN: request packet data size
+
Bool
HSPU_ValidateReplyPacketSize(HgfsPacket *packet, // IN: Hgfs Packet
size_t replyHeaderSize, // IN: reply header size
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * HSPU_ValidateRequestPacketSize --
+ *
+ * Validate an HGFS packet size with the HGFS header in use, the HGFS opcode request
+ * (its arguments) and optionally any opcode request data that is contained in the
+ * size for the packet.
+ *
+ * Results:
+ * TRUE if the packet size is large enough for the required request data.
+ * FALSE if not.
+ *
+ * Side effects:
+ * None.
+ *-----------------------------------------------------------------------------
+ */
+
+Bool
+HSPU_ValidateRequestPacketSize(HgfsPacket *packet, // IN: Hgfs Packet
+ size_t requestHeaderSize, // IN: request header size
+ size_t requestOpSize, // IN: request op size
+ size_t requestOpDataSize) // IN: request op data size
+{
+ size_t bytesRemaining = packet->metaPacketDataSize;
+ Bool requestSizeIsOkay = FALSE;
+
+ /*
+ * Validate the request buffer size ensuring that the the contained components
+ * (request header, the operation arguments and lastly any data) fall within it.
+ */
+
+ if (bytesRemaining >= requestHeaderSize) {
+ bytesRemaining -= requestHeaderSize;
+ } else {
+ goto exit;
+ }
+ if (bytesRemaining >= requestOpSize) {
+ bytesRemaining -= requestOpSize;
+ } else {
+ goto exit;
+ }
+ if (bytesRemaining >= requestOpDataSize) {
+ requestSizeIsOkay = TRUE;
+ }
+
+exit:
+ return requestSizeIsOkay;
+}
+
+
/*
*-----------------------------------------------------------------------------
*