if (flags & CB_CAN_LOCK_CLIPDATA)
WLog_INFO(TAG, "\tCB_CAN_LOCK_CLIPDATA");
+ if (flags & CB_HUGE_FILE_SUPPORT_ENABLED)
+ WLog_INFO(TAG, "\tCB_HUGE_FILE_SUPPORT_ENABLED");
+
WLog_INFO(TAG, "}");
}
#endif
cliprdr->streamFileClipEnabled = (generalFlags & CB_STREAM_FILECLIP_ENABLED);
cliprdr->fileClipNoFilePaths = (generalFlags & CB_FILECLIP_NO_FILE_PATHS);
cliprdr->canLockClipData = (generalFlags & CB_CAN_LOCK_CLIPDATA);
+ cliprdr->hasHugeFileSupport = (generalFlags & CB_HUGE_FILE_SUPPORT_ENABLED);
cliprdr->capabilitiesReceived = TRUE;
if (!context->custom)
flags &= ~CB_FILECLIP_NO_FILE_PATHS;
if (!cliprdr->canLockClipData)
flags &= CB_CAN_LOCK_CLIPDATA;
+ if (!cliprdr->hasHugeFileSupport)
+ flags &= CB_HUGE_FILE_SUPPORT_ENABLED;
cliprdr->useLongFormatNames = flags & CB_USE_LONG_FORMAT_NAMES;
cliprdr->streamFileClipEnabled = flags & CB_STREAM_FILECLIP_ENABLED;
cliprdr->fileClipNoFilePaths = flags & CB_FILECLIP_NO_FILE_PATHS;
cliprdr->canLockClipData = flags & CB_CAN_LOCK_CLIPDATA;
+ cliprdr->hasHugeFileSupport = flags & CB_HUGE_FILE_SUPPORT_ENABLED;
Stream_Write_UINT32(s, flags); /* generalFlags */
WLog_Print(cliprdr->log, WLOG_DEBUG, "ClientCapabilities");
wStream* s;
cliprdrPlugin* cliprdr = (cliprdrPlugin*)context->handle;
+ if (!cliprdr)
+ return ERROR_INTERNAL_ERROR;
+
+ if (!cliprdr->hasHugeFileSupport)
+ {
+ if (((UINT64)fileContentsRequest->cbRequested + fileContentsRequest->nPositionLow) >
+ UINT32_MAX)
+ return ERROR_INVALID_PARAMETER;
+ if (fileContentsRequest->nPositionHigh != 0)
+ return ERROR_INVALID_PARAMETER;
+ }
+
s = cliprdr_packet_file_contents_request_new(fileContentsRequest);
if (!s)
BOOL streamFileClipEnabled;
BOOL fileClipNoFilePaths;
BOOL canLockClipData;
+ BOOL hasHugeFileSupport;
};
typedef struct cliprdr_plugin cliprdrPlugin;
if (context->canLockClipData)
context->canLockClipData = (cap_set->generalFlags & CB_CAN_LOCK_CLIPDATA) ? TRUE : FALSE;
+ if (context->hasHugeFileSupport)
+ context->hasHugeFileSupport =
+ (cap_set->generalFlags & CB_HUGE_FILE_SUPPORT_ENABLED) ? TRUE : FALSE;
+
return CHANNEL_RC_OK;
}
if ((error = cliprdr_read_file_contents_request(s, &request)))
return error;
+ if (!context->hasHugeFileSupport)
+ {
+ if (request.nPositionHigh > 0)
+ return ERROR_INVALID_DATA;
+ if ((UINT64)request.nPositionLow + request.cbRequested > UINT32_MAX)
+ return ERROR_INVALID_DATA;
+ }
IFCALLRET(context->ClientFileContentsRequest, error, context, &request);
if (error)
if (context->canLockClipData)
generalFlags |= CB_CAN_LOCK_CLIPDATA;
+ if (context->hasHugeFileSupport)
+ generalFlags |= CB_HUGE_FILE_SUPPORT_ENABLED;
+
capabilities.msgType = CB_CLIP_CAPS;
capabilities.msgFlags = 0;
capabilities.dataLen = 4 + CB_CAPSTYPE_GENERAL_LEN;
generalCapabilitySet.generalFlags = CB_USE_LONG_FORMAT_NAMES;
if (clipboard->streams_supported && clipboard->file_formats_registered)
- generalCapabilitySet.generalFlags |= CB_STREAM_FILECLIP_ENABLED | CB_FILECLIP_NO_FILE_PATHS;
+ generalCapabilitySet.generalFlags |=
+ CB_STREAM_FILECLIP_ENABLED | CB_FILECLIP_NO_FILE_PATHS | CB_HUGE_FILE_SUPPORT_ENABLED;
return clipboard->context->ClientCapabilities(clipboard->context, &capabilities);
}
generalCapabilitySet.generalFlags = CB_USE_LONG_FORMAT_NAMES;
if (clipboard->streams_supported && clipboard->file_formats_registered)
- generalCapabilitySet.generalFlags |= CB_STREAM_FILECLIP_ENABLED | CB_FILECLIP_NO_FILE_PATHS;
+ generalCapabilitySet.generalFlags |=
+ CB_STREAM_FILECLIP_ENABLED | CB_FILECLIP_NO_FILE_PATHS | CB_HUGE_FILE_SUPPORT_ENABLED;
return clipboard->context->ClientCapabilities(clipboard->context, &capabilities);
}
#define CB_STREAM_FILECLIP_ENABLED 0x00000004
#define CB_FILECLIP_NO_FILE_PATHS 0x00000008
#define CB_CAN_LOCK_CLIPDATA 0x00000010
+#define CB_HUGE_FILE_SUPPORT_ENABLED 0x00000020
/* File Contents Request Flags */
#define FILECONTENTS_SIZE 0x00000001
BOOL streamFileClipEnabled;
BOOL fileClipNoFilePaths;
BOOL canLockClipData;
+ BOOL hasHugeFileSupport;
psCliprdrOpen Open;
psCliprdrClose Close;
cliprdr->streamFileClipEnabled = TRUE;
cliprdr->fileClipNoFilePaths = TRUE;
cliprdr->canLockClipData = TRUE;
+ cliprdr->hasHugeFileSupport = TRUE;
/* disable initialization sequence, for caps sync */
cliprdr->autoInitializationSequence = FALSE;