]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Hgfs Server: more minor clean up of write operations
authorOliver Kurth <okurth@vmware.com>
Fri, 15 Sep 2017 18:23:00 +0000 (11:23 -0700)
committerOliver Kurth <okurth@vmware.com>
Fri, 15 Sep 2017 18:23:00 +0000 (11:23 -0700)
More clean up in preparation for write operation security fixes.

open-vm-tools/lib/hgfsServer/hgfsServer.c

index eb987dc17367692f1e19ff596ed9a010e19952d5..193aa24ab5b2cd8a2dbdf3be29d59cdd1cf1bfeb 100644 (file)
@@ -6283,50 +6283,57 @@ exit:
 static void
 HgfsServerWrite(HgfsInputParam *input)  // IN: Input params
 {
-   uint32 numberBytesToWrite;
-   HgfsInternalStatus status;
-   HgfsWriteFlags flags;
-   uint64 offset;
-   const void *dataToWrite;
-   uint32 replyActualSize;
-   size_t replyPayloadSize = 0;
-   HgfsHandle file;
+   uint64 writeOffset;
+   uint32 writeSize;
+   uint32 writtenSize = 0;
+   HgfsInternalStatus status = HGFS_ERROR_SUCCESS;
+   HgfsWriteFlags writeFlags;
+   const void *writeData;
+   size_t writeReplySize = 0;
+   HgfsHandle writeFile;
 
    HGFS_ASSERT_INPUT(input);
 
    if (!HgfsUnpackWriteRequest(input->payload, input->payloadSize, input->op,
-                              &file, &offset, &numberBytesToWrite, &flags,
-                              &dataToWrite)) {
+                               &writeFile, &writeOffset, &writeSize, &writeFlags,
+                               &writeData)) {
       LOG(4, ("%s: Error: Op %d unpack write request arguments\n", __FUNCTION__, input->op));
       status = HGFS_ERROR_PROTOCOL;
       goto exit;
    }
 
-   if (NULL == dataToWrite) {
-      /* No inline data to write, get it from the transport shared memory. */
-      HSPU_SetDataPacketSize(input->packet, numberBytesToWrite);
-      dataToWrite = HSPU_GetDataPacketBuf(input->packet, BUF_READABLE,
-                                          input->transportSession->channelCbTable);
-      if (NULL == dataToWrite) {
-         LOG(4, ("%s: Error: Op %d mapping write data buffer\n", __FUNCTION__, input->op));
-         status = HGFS_ERROR_PROTOCOL;
-         goto exit;
+   if (writeSize > 0) {
+      if (NULL == writeData) {
+         /* No inline data to write, get it from the transport shared memory. */
+         HSPU_SetDataPacketSize(input->packet, writeSize);
+         writeData = HSPU_GetDataPacketBuf(input->packet, BUF_READABLE,
+                                           input->transportSession->channelCbTable);
+         if (NULL == writeData) {
+            LOG(4, ("%s: Error: Op %d mapping write data buffer\n", __FUNCTION__, input->op));
+            status = HGFS_ERROR_PROTOCOL;
+            goto exit;
+         }
       }
-   }
 
-   status = HgfsPlatformWriteFile(file, input->session, offset, numberBytesToWrite,
-                                  flags, dataToWrite, &replyActualSize);
-   if (HGFS_ERROR_SUCCESS != status) {
-      goto exit;
+      status = HgfsPlatformWriteFile(writeFile,
+                                     input->session,
+                                     writeOffset,
+                                     writeSize,
+                                     writeFlags,
+                                     writeData,
+                                     &writtenSize);
+      if (HGFS_ERROR_SUCCESS != status) {
+         goto exit;
+      }
    }
 
    if (!HgfsPackWriteReply(input->packet, input->request, input->op,
-                           replyActualSize, &replyPayloadSize, input->session)) {
+                           writtenSize, &writeReplySize, input->session)) {
       status = HGFS_ERROR_INTERNAL;
    }
 
 exit:
-   HgfsServerCompleteRequest(status, replyPayloadSize, input);
+   HgfsServerCompleteRequest(status, writeReplySize, input);
 }