| Index: ppapi/proxy/nacl_message_scanner.cc
|
| diff --git a/ppapi/proxy/nacl_message_scanner.cc b/ppapi/proxy/nacl_message_scanner.cc
|
| index 3c2b45f8f0cd3f0a7fe92a10978836f75beb1904..44324c3a63623146242e806b1dcd6d277e68a083 100644
|
| --- a/ppapi/proxy/nacl_message_scanner.cc
|
| +++ b/ppapi/proxy/nacl_message_scanner.cc
|
| @@ -381,9 +381,9 @@ void NaClMessageScanner::ScanUntrustedMessage(
|
| return;
|
| // Audit FileIO Close messages to make sure the plugin reports an
|
| // accurate file size.
|
| - int64_t max_written_offset = 0;
|
| + FileGrowth file_growth;
|
| if (!UnpackMessage<PpapiHostMsg_FileIO_Close>(
|
| - nested_msg, &max_written_offset))
|
| + nested_msg, &file_growth))
|
| return;
|
|
|
| int64_t trusted_max_written_offset = it->second->max_written_offset();
|
| @@ -391,11 +391,12 @@ void NaClMessageScanner::ScanUntrustedMessage(
|
| files_.erase(it);
|
| // If the plugin is under-reporting, rewrite the message with the
|
| // trusted value.
|
| - if (trusted_max_written_offset > max_written_offset) {
|
| + if (trusted_max_written_offset > file_growth.max_written_offset) {
|
| new_msg_ptr->reset(
|
| new PpapiHostMsg_ResourceCall(
|
| params,
|
| - PpapiHostMsg_FileIO_Close(trusted_max_written_offset)));
|
| + PpapiHostMsg_FileIO_Close(
|
| + FileGrowth(trusted_max_written_offset, 0))));
|
| }
|
| }
|
| case PpapiHostMsg_FileIO_SetLength::ID: {
|
| @@ -429,22 +430,26 @@ void NaClMessageScanner::ScanUntrustedMessage(
|
| // Audit FileSystem ReserveQuota messages to make sure the plugin
|
| // reports accurate file sizes.
|
| int64_t amount = 0;
|
| - FileOffsetMap max_written_offsets;
|
| + FileGrowthMap file_growths;
|
| if (!UnpackMessage<PpapiHostMsg_FileSystem_ReserveQuota>(
|
| - nested_msg, &amount, &max_written_offsets))
|
| + nested_msg, &amount, &file_growths))
|
| return;
|
|
|
| bool audit_failed = false;
|
| - for (FileOffsetMap::iterator it = max_written_offsets.begin();
|
| - it != max_written_offsets.end(); ++it) {
|
| + for (FileGrowthMap::iterator it = file_growths.begin();
|
| + it != file_growths.end(); ++it) {
|
| FileIOMap::iterator file_it = files_.find(it->first);
|
| if (file_it == files_.end())
|
| continue;
|
| int64_t trusted_max_written_offset =
|
| file_it->second->max_written_offset();
|
| - if (trusted_max_written_offset > it->second) {
|
| + if (trusted_max_written_offset > it->second.max_written_offset) {
|
| audit_failed = true;
|
| - it->second = trusted_max_written_offset;
|
| + it->second.max_written_offset = trusted_max_written_offset;
|
| + }
|
| + if (it->second.append_mode_write_amount < 0) {
|
| + audit_failed = true;
|
| + it->second.append_mode_write_amount = 0;
|
| }
|
| }
|
| if (audit_failed) {
|
| @@ -452,7 +457,7 @@ void NaClMessageScanner::ScanUntrustedMessage(
|
| new PpapiHostMsg_ResourceCall(
|
| params,
|
| PpapiHostMsg_FileSystem_ReserveQuota(
|
| - amount, max_written_offsets)));
|
| + amount, file_growths)));
|
| }
|
| break;
|
| }
|
| @@ -518,15 +523,15 @@ void NaClMessageScanner::AuditNestedMessage(PP_Resource resource,
|
| case PpapiPluginMsg_FileSystem_ReserveQuotaReply::ID: {
|
| // The amount of reserved quota for a FileSystem was refreshed.
|
| int64_t amount = 0;
|
| - FileOffsetMap max_written_offsets;
|
| + FileSizeMap file_sizes;
|
| if (ppapi::UnpackMessage<PpapiPluginMsg_FileSystem_ReserveQuotaReply>(
|
| - msg, &amount, &max_written_offsets)) {
|
| + msg, &amount, &file_sizes)) {
|
| FileSystemMap::iterator it = file_systems_.find(resource);
|
| DCHECK(it != file_systems_.end());
|
| it->second->UpdateReservedQuota(amount);
|
|
|
| - FileOffsetMap::const_iterator offset_it = max_written_offsets.begin();
|
| - for (; offset_it != max_written_offsets.end(); ++offset_it) {
|
| + FileSizeMap::const_iterator offset_it = file_sizes.begin();
|
| + for (; offset_it != file_sizes.end(); ++offset_it) {
|
| FileIOMap::iterator fio_it = files_.find(offset_it->first);
|
| DCHECK(fio_it != files_.end());
|
| if (fio_it != files_.end())
|
|
|