~n-muench/ubuntu/precise/open-vm-tools/open-vm-tools.raring-precise.backport

« back to all changes in this revision

Viewing changes to lib/hgfsServer/hgfsServerParameters.c

  • Committer: Nate Muench
  • Date: 2013-06-07 19:36:13 UTC
  • mfrom: (1.4.7)
  • Revision ID: nowiwilldestroyabydos@gmail.com-20130607193613-kctd63r2cs35g2ms
Tags: 2012.12.26-958366-0ubuntu1
* Merging upstream version 2012.12.26-958366.
  - Adds support for 3.5 Kernels (LP: #1083719)
* Adding patch from Mathias Krause <minipli@googlemail.com> to fix
  kernel stack memory leack in vsock module [CVE-2013-3237].

Show diffs side-by-side

added added

removed removed

Lines of Context:
5250
5250
 */
5251
5251
 
5252
5252
Bool
5253
 
HgfsPackDestorySessionReply(HgfsPacket *packet,        // IN/OUT: Hgfs Packet
 
5253
HgfsPackDestroySessionReply(HgfsPacket *packet,        // IN/OUT: Hgfs Packet
5254
5254
                            char const *packetHeader,  // IN: packet header
5255
5255
                            size_t *payloadSize,        // OUT: size of packet
5256
5256
                            HgfsSessionInfo *session)  // IN: Session info
5700
5700
/*
5701
5701
 *-----------------------------------------------------------------------------
5702
5702
 *
5703
 
 * HgfsPackChangeNotificationV4 --
 
5703
 * HgfsPackChangeNotifyEventV4 --
5704
5704
 *
5705
5705
 *    Pack single change directory notification event information.
5706
5706
 *
5715
5715
 */
5716
5716
 
5717
5717
static size_t
5718
 
HgfsPackChangeNotificationV4(uint32 mask,              // IN: event mask
5719
 
                             char const *shareName,    // IN: share name
5720
 
                             char *fileName,           // IN: file name
5721
 
                             size_t bufferSize,        // IN: available space
5722
 
                             HgfsNotifyEventV4 *reply) // OUT: notificaiton buffer
 
5718
HgfsPackChangeNotifyEventV4(uint32 mask,              // IN: event mask
 
5719
                            char const *shareName,    // IN: share name
 
5720
                            char *fileName,           // IN: file name
 
5721
                            size_t bufferSize,        // IN: available space
 
5722
                            HgfsNotifyEventV4 *reply) // OUT: notificaiton buffer
5723
5723
{
5724
 
   size_t remainingSize;
5725
 
   size_t totalLength = sizeof *reply;
 
5724
   size_t totalLength;
5726
5725
 
5727
5726
   if (sizeof *reply > bufferSize) {
5728
5727
      return 0;
5732
5731
   reply->mask = mask;
5733
5732
   if (NULL != fileName) {
5734
5733
      char *fullPath;
 
5734
      size_t remainingSize;
5735
5735
      size_t nameSize;
 
5736
      size_t hgfsNameSize;
5736
5737
 
5737
5738
      nameSize = HgfsBuildCPName(shareName, fileName, &fullPath);
5738
5739
      remainingSize = bufferSize - offsetof(HgfsNotifyEventV4, fileName);
5739
 
      if (HgfsPackHgfsName(fullPath, nameSize, remainingSize, &nameSize,
 
5740
      if (HgfsPackHgfsName(fullPath, nameSize, remainingSize, &hgfsNameSize,
5740
5741
                           &reply->fileName)) {
5741
 
          remainingSize -= nameSize;
5742
 
          totalLength += nameSize;
 
5742
          remainingSize -= hgfsNameSize;
 
5743
          totalLength = bufferSize - remainingSize;
5743
5744
      } else {
5744
5745
         totalLength = 0;
5745
5746
      }
5798
5799
       */
5799
5800
      reply->count = 1;
5800
5801
      notificationOffset = offsetof(HgfsRequestNotifyV4, events);
5801
 
      size = HgfsPackChangeNotificationV4(mask, shareName, fileName,
 
5802
      size = HgfsPackChangeNotifyEventV4(mask, shareName, fileName,
5802
5803
                                          bufferSize - notificationOffset,
5803
5804
                                          reply->events);
5804
5805
      if (size != 0) {
5844
5845
                                  HgfsSessionInfo *session,        // IN: session
5845
5846
                                  size_t *bufferSize)              // INOUT: size of packet
5846
5847
{
5847
 
   size_t size;
5848
 
   HgfsRequestNotifyV4 *reply;
5849
 
   HgfsHeader *header = (HgfsHeader *)packet;
 
5848
   size_t notifyRequestSize;
 
5849
   HgfsRequestNotifyV4 *notifyRequest;
 
5850
   HgfsHeader *header = packet;
5850
5851
   Bool result;
5851
5852
 
5852
5853
   ASSERT(packet);
5866
5867
    *  notifications.
5867
5868
    *  Initialize payload size to 0 - it is not known yet and will be filled later.
5868
5869
    */
5869
 
   header->headerSize = sizeof *header;
5870
 
 
5871
 
   HgfsPackReplyHeaderV4(0, 0, HGFS_OP_NOTIFY_V4, session->sessionId, 0, header);
5872
 
   reply = (HgfsRequestNotifyV4 *)((char *)header + header->headerSize);
5873
 
   size = HgfsPackChangeNotifyRequestV4(subscriber, flags, mask, shareName, fileName,
5874
 
                                        *bufferSize - header->headerSize, reply);
5875
 
   if (0 != size) {
5876
 
      header->packetSize = header->headerSize + size;
 
5870
   notifyRequest = (HgfsRequestNotifyV4 *)((char *)header + sizeof *header);
 
5871
   notifyRequestSize = HgfsPackChangeNotifyRequestV4(subscriber,
 
5872
                                                     flags,
 
5873
                                                     mask,
 
5874
                                                     shareName,
 
5875
                                                     fileName,
 
5876
                                                     *bufferSize - sizeof *header,
 
5877
                                                     notifyRequest);
 
5878
   if (0 != notifyRequestSize) {
 
5879
      HgfsPackReplyHeaderV4(0, notifyRequestSize, HGFS_OP_NOTIFY_V4, session->sessionId, 0, header);
5877
5880
      result = TRUE;
5878
5881
   } else {
5879
5882
      result = FALSE;