From ee4d0349f360a4e32028a1d0bc5ed85145f71aed Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 29 Apr 2018 11:13:12 +0200 Subject: [PATCH] Increase common metadata size limit (cherry picked from commit be052610b0be19327d2d56d39765353d56e6dd36) --- fileservplugin/FileMetadataPipe.cpp | 32 ++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/fileservplugin/FileMetadataPipe.cpp b/fileservplugin/FileMetadataPipe.cpp index 47e4edd1..a7134f72 100644 --- a/fileservplugin/FileMetadataPipe.cpp +++ b/fileservplugin/FileMetadataPipe.cpp @@ -201,24 +201,28 @@ bool FileMetadataPipe::readStdoutIntoBuffer( char* buf, size_t buf_avail, size_t meta_data.addString(""); } - if(meta_data.getDataSize()+2*sizeof(unsigned int)(meta_data.getDataSize())); - memcpy(metadata_buffer.data(), &data_size, sizeof(data_size)); - memcpy(metadata_buffer.data()+sizeof(unsigned int), meta_data.getDataPtr(), meta_data.getDataSize()); - metadata_buffer_size = meta_data.getDataSize()+sizeof(unsigned int); - curr_checksum = urb_adler32(curr_checksum, metadata_buffer.data(), static_cast<_u32>(metadata_buffer_size)); - unsigned int endian_curr_checksum = little_endian(curr_checksum); - memcpy(metadata_buffer.data()+metadata_buffer_size, &endian_curr_checksum, sizeof(endian_curr_checksum)); - metadata_buffer_size+=sizeof(endian_curr_checksum); - } - else + size_t meta_size = meta_data.getDataSize() + 2 * sizeof(unsigned int); + + if(meta_size>20*1024*1024) { - Server->Log("File metadata of "+local_fn+" too large ("+convert((size_t)meta_data.getDataSize())+")", LL_ERROR); + Server->Log("File metadata of " + local_fn + " too large (" + convert((size_t)meta_data.getDataSize()) + ")", LL_ERROR); return false; } - + else if (meta_size > metadata_buffer.size()) + { + metadata_buffer.resize(meta_size); + } + + unsigned int data_size = little_endian(static_cast(meta_data.getDataSize())); + memcpy(metadata_buffer.data(), &data_size, sizeof(data_size)); + memcpy(metadata_buffer.data()+sizeof(unsigned int), meta_data.getDataPtr(), meta_data.getDataSize()); + metadata_buffer_size = meta_data.getDataSize()+sizeof(unsigned int); + + curr_checksum = urb_adler32(curr_checksum, metadata_buffer.data(), static_cast<_u32>(metadata_buffer_size)); + unsigned int endian_curr_checksum = little_endian(curr_checksum); + memcpy(metadata_buffer.data()+metadata_buffer_size, &endian_curr_checksum, sizeof(endian_curr_checksum)); + metadata_buffer_size+=sizeof(endian_curr_checksum); } if (metadata_buffer_size - metadata_buffer_off>0)