sc/inc/tabprotection.hxx | 8 +++++++- sc/source/core/data/tabprotection.cxx | 6 +++--- sc/source/filter/excel/excimp8.cxx | 7 ++++--- sc/source/filter/xcl97/xcl97rec.cxx | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-)
New commits: commit d114939dabaf5cb0c14b619ef851be17c28e69e5 Author: Eike Rathke <[email protected]> Date: Tue Apr 8 11:51:19 2014 +0200 resize vector in advance Obtaining front() from an empty vector is disallowed, even if size was reserved. So resize it. Change-Id: Iae2aafd6b7b725ea36bf9c3fb0a2370c7037777f diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx index fd8e221..24adc64 100644 --- a/sc/source/filter/excel/excimp8.cxx +++ b/sc/source/filter/excel/excimp8.cxx @@ -375,9 +375,10 @@ void ImportExcel8::Feat( void ) { sal_uInt32 nCbSD = aIn.ReaduInt32(); // TODO: could here be some sanity check applied to not allocate 4GB? - aProt.maSecurityDescriptor.reserve( nCbSD); + aProt.maSecurityDescriptor.resize( nCbSD); sal_Size nRead = aIn.Read( &aProt.maSecurityDescriptor.front(), nCbSD); - aProt.maSecurityDescriptor.resize( nRead); + if (nRead < nCbSD) + aProt.maSecurityDescriptor.resize( nRead); } GetSheetProtectBuffer().AppendEnhancedProtection( aProt, GetCurrScTab() ); commit 5bce64e4759ee3bd98d34b70d02f9b54550a53ed Author: Eike Rathke <[email protected]> Date: Tue Apr 8 11:34:49 2014 +0200 bit 0 is bit 0 They say they use big-endian bit diagrams, but just to confuse you. Change-Id: I7fd6bb58c721f1dca2f6ecbaae90d516746762f0 diff --git a/sc/source/filter/excel/excimp8.cxx b/sc/source/filter/excel/excimp8.cxx index 8209a86..fd8e221 100644 --- a/sc/source/filter/excel/excimp8.cxx +++ b/sc/source/filter/excel/excimp8.cxx @@ -371,7 +371,7 @@ void ImportExcel8::Feat( void ) aProt.mnAreserved = aIn.ReaduInt32(); aProt.mnPasswordVerifier = aIn.ReaduInt32(); aProt.maTitle = aIn.ReadUniString(); - if ((aProt.mnAreserved & 0x80000000) == 0x80000000) + if ((aProt.mnAreserved & 0x00000001) == 0x00000001) { sal_uInt32 nCbSD = aIn.ReaduInt32(); // TODO: could here be some sanity check applied to not allocate 4GB? diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx index d6c39ce..285fc62 100644 --- a/sc/source/filter/xcl97/xcl97rec.cxx +++ b/sc/source/filter/xcl97/xcl97rec.cxx @@ -1492,7 +1492,7 @@ void XclExpSheetEnhancedProtection::WriteBody( XclExpStream& rStrm ) rStrm << maEnhancedProtection.mnAreserved; // 1 bit A and 31 bits reserved rStrm << maEnhancedProtection.mnPasswordVerifier; // wPassword rStrm << XclExpString( maEnhancedProtection.maTitle); // stTitle - bool bSDContainer = ((maEnhancedProtection.mnAreserved & 0x80000000) == 0x80000000); + bool bSDContainer = ((maEnhancedProtection.mnAreserved & 0x00000001) == 0x00000001); sal_uInt32 nCbSD = maEnhancedProtection.maSecurityDescriptor.size(); SAL_WARN_IF( bSDContainer && nCbSD < 20, "sc.filter", "XclExpSheetEnhancedProtection A flag indicates container but cbSD < 20"); commit a65e9fd24d905d03cd77551f2d6c9b2efa18fff6 Author: Eike Rathke <[email protected]> Date: Tue Apr 8 11:08:30 2014 +0200 hold security descriptors read from OOXML independently If anyone knows how to interpret that stuff and convert between BIFF/OOXML feel free to implement.. According to ISO/IEC 29000 the securityDescriptor is application defined, but recommends that username@domain be used, which is addr-spec of RFC 822. Well, what Excel2013 writes is something like this 'O:WDG:WDD:(A;;CC;;;S-1-5-21-2328606873-448790680-2149751550-1003)' Change-Id: I138fa116b019f200c211272abf69831bc49127ab diff --git a/sc/inc/tabprotection.hxx b/sc/inc/tabprotection.hxx index a224dc8..2dc798c 100644 --- a/sc/inc/tabprotection.hxx +++ b/sc/inc/tabprotection.hxx @@ -119,9 +119,15 @@ struct ScEnhancedProtection sal_uInt32 mnAreserved; sal_uInt32 mnPasswordVerifier; OUString maTitle; - ::std::vector< sal_uInt8 > maSecurityDescriptor; // raw data + ::std::vector< sal_uInt8 > maSecurityDescriptor; // imported as raw BIFF data + OUString maSecurityDescriptorXML; // imported from OOXML ScEnhancedProtection() : mnAreserved(0), mnPasswordVerifier(0) {} + + bool hasSecurityDescriptor() const + { + return !maSecurityDescriptor.empty() || !maSecurityDescriptorXML.isEmpty(); + } }; /** sheet protection state container diff --git a/sc/source/core/data/tabprotection.cxx b/sc/source/core/data/tabprotection.cxx index f8a6a12..a9bfd8f 100644 --- a/sc/source/core/data/tabprotection.cxx +++ b/sc/source/core/data/tabprotection.cxx @@ -396,7 +396,7 @@ bool ScTableProtectionImpl::isBlockEditable( const ScRange& rRange ) const for (::std::vector<ScEnhancedProtection>::const_iterator it(maEnhancedProtection.begin()), itEnd(maEnhancedProtection.end()); it != itEnd; ++it) { - if ((*it).maSecurityDescriptor.empty() && (*it).maRangeList.Is()) + if (!(*it).hasSecurityDescriptor() && (*it).maRangeList.Is()) { if ((*it).maRangeList->In( rRange)) { @@ -416,7 +416,7 @@ bool ScTableProtectionImpl::isBlockEditable( const ScRange& rRange ) const for (::std::vector<ScEnhancedProtection>::const_iterator it(maEnhancedProtection.begin()), itEnd(maEnhancedProtection.end()); it != itEnd; ++it) { - if ((*it).maSecurityDescriptor.empty() && (*it).maRangeList.Is()) + if (!(*it).hasSecurityDescriptor() && (*it).maRangeList.Is()) { ScRangeList aList( (*it).maRangeList->GetIntersectedRange( rRange)); if (aList.size() == 1 && *aList[0] == rRange) @@ -437,7 +437,7 @@ bool ScTableProtectionImpl::isBlockEditable( const ScRange& rRange ) const for (::std::vector<ScEnhancedProtection>::const_iterator it(maEnhancedProtection.begin()), itEnd(maEnhancedProtection.end()); it != itEnd; ++it) { - if ((*it).maSecurityDescriptor.empty() && (*it).maRangeList.Is()) + if (!(*it).hasSecurityDescriptor() && (*it).maRangeList.Is()) { // Ranges are editable if no password is assigned. if (!(*it).mnPasswordVerifier) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
