[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#683721: marked as done (unblock: libreoffice/1:3.5.4-7)



Your message dated Fri, 3 Aug 2012 11:06:34 +0200
with message-id <20120803090634.GV17223@radis.cristau.org>
and subject line Re: Bug#683721: unblock: libreoffice/1:3.5.4-7
has caused the Debian Bug report #683721,
regarding unblock: libreoffice/1:3.5.4-7
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
683721: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683721
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package libreoffice

unblock libreoffice/1:3.5.4-7

- Fixes CVE-2012-2665. Yes, that one's big[1] but it's the official
  commits from upstream. The binfilter part is not strictly needed but
  done for consistency (as we did it for stable-security/DSA 2520-1, too)
- Minor "fix" of #682462 to make the transitional package ttf-opensymbol
  apt-get autoremove'able

Full diff attached, due to debian/patches etc. this is not exactly much helpful, though..

Regards,

Rene

-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.2.0-3-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

[1]
rene@frodo:~/Debian/Pakete/LibreOffice/libreoffice-3.5.4/debian/patches$ cat CVE-2012-2665* | diffstat
 b/binfilter/bf_xmloff/source/core/xmloff_xmluconv.cxx                     |  175 ----
 b/filter/Library_placeware.mk                                             |    2
 b/filter/source/placeware/Base64Codec.cxx                                 |  206 -----
 b/filter/source/placeware/Base64Codec.hxx                                 |   50 -
 b/filter/source/placeware/exporter.cxx                                    |    4
 b/package/Library_package2.mk                                             |    2
 b/package/inc/PackageConstants.hxx                                        |   24
 b/package/prj/build.lst                                                   |    2
 b/package/source/manifest/Base64Codec.cxx                                 |  204 -----
 b/package/source/manifest/Base64Codec.hxx                                 |   48 -
 b/package/source/manifest/ManifestExport.cxx                              |    8
 b/package/source/manifest/ManifestImport.cxx                              |  379 +++++-----
 b/package/source/manifest/ManifestImport.hxx                              |   12
 b/package/source/zipapi/ZipFile.cxx                                       |   10
 binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingExportHelper.cxx    |    5
 binfilter/bf_sc/source/filter/xml/sc_XMLTrackedChangesContext.cxx         |    5
 binfilter/bf_sc/source/filter/xml/sc_xmlbodyi.cxx                         |    5
 binfilter/bf_sc/source/filter/xml/sc_xmlexprt.cxx                         |    5
 binfilter/bf_sc/source/filter/xml/sc_xmlsubti.cxx                         |    4
 binfilter/bf_sc/util/makefile.mk                                          |    1
 binfilter/bf_xmloff/source/core/xmloff_DocumentSettingsContext.cxx        |    6
 binfilter/bf_xmloff/source/core/xmloff_SettingsExportHelper.cxx           |    3
 binfilter/bf_xmloff/source/core/xmloff_XMLBase64Export.cxx                |    4
 binfilter/bf_xmloff/source/core/xmloff_XMLBase64ImportContext.cxx         |    5
 binfilter/bf_xmloff/source/text/xmloff_XMLRedlineExport.cxx               |    3
 binfilter/bf_xmloff/source/text/xmloff_XMLSectionExport.cxx               |    4
 binfilter/bf_xmloff/source/text/xmloff_XMLSectionImportContext.cxx        |    4
 binfilter/bf_xmloff/source/text/xmloff_XMLTextFrameContext.cxx            |    4
 binfilter/bf_xmloff/source/text/xmloff_XMLTrackedChangesImportContext.cxx |    3
 binfilter/bf_xmloff/util/makefile.mk                                      |    1
 binfilter/inc/bf_xmloff/xmluconv.hxx                                      |   11
 31 files changed, 300 insertions(+), 899 deletions(-)

diff -Nru libreoffice-3.5.4/debian/changelog libreoffice-3.5.4/debian/changelog
--- libreoffice-3.5.4/debian/changelog	2012-07-20 00:21:57.000000000 +0200
+++ libreoffice-3.5.4/debian/changelog	2012-08-01 11:51:00.000000000 +0200
@@ -1,3 +1,14 @@
+libreoffice (1:3.5.4-7) unstable; urgency=high
+
+  * debian/patches/CVE-2012-2665*.diff: fix CVE-2012-2665
+    ("Multiple heap-based buffer overflows in the XML manifest
+     encryption handling code")
+
+  * debian/control.in: drop "| ttf-opensymbol" from -core and -math depends
+    (closes: #682462)
+
+ -- Rene Engelhard <rene@debian.org>  Wed, 01 Aug 2012 10:41:17 +0200
+
 libreoffice (1:3.5.4-6) unstable; urgency=medium
 
   * debian/patches/CVE-2012-2334-clip-max-entries.diff: add additional
diff -Nru libreoffice-3.5.4/debian/control libreoffice-3.5.4/debian/control
--- libreoffice-3.5.4/debian/control	2012-07-20 09:41:23.000000000 +0200
+++ libreoffice-3.5.4/debian/control	2012-08-01 11:51:24.000000000 +0200
@@ -89,7 +89,7 @@
 
 Package: libreoffice-core
 Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc powerpcspe ppc64 s390 s390x sparc kfreebsd-amd64 kfreebsd-i386
-Depends: libreoffice-common (>> ${base-version}), fonts-opensymbol | ttf-opensymbol (>= 1:3.0), ${shlibs:Depends}, fontconfig, ${misc:Depends}
+Depends: libreoffice-common (>> ${base-version}), fonts-opensymbol, ${shlibs:Depends}, fontconfig, ${misc:Depends}
 Pre-Depends: ure (>= 1.5.1+OOo3.1.1-15)
 Conflicts: libreoffice-calc (<< ${binary:Version}), libreoffice-writer (<< ${binary:Version}), libreoffice-impress (<< ${binary:Version}), libreoffice-draw (<< ${binary:Version}), libreoffice-base (<< ${binary:Version}), libreoffice-gtk (<< ${binary:Version}), libreoffice-gnome (<< ${binary:Version}), libreoffice-kde (<< ${binary:Version}), libreoffice-evolution (<< ${binary:Version}), libreoffice-filter-so52 (<< ${binary:Version}), libreoffice-officebean (<< ${binary:Version}), libreoffice-dev (<< ${binary:Version}), libreoffice-style-crystal (<< 1:3.3.0-1), libreoffice-style-oxygen (<< 1:3.3.0-1), libreoffice-style-tango (<< 1:3.3.0-1), libreoffice-style-hicontrast (<< 1:3.3.0-1), libreoffice-style-galaxy (<< 1:3.3.0-1), libreoffice-style-andromeda (<< 1:3.3.0-1), libcairo2 (= 1.4.8-1), libicu38 (= 3.8~d01-1), cli-uno-bridge (<< 1:3.0.0~dev300m22), cacao-oj6-jre, mozilla-plugin-vlc (<< 1.0)
 Breaks: myspell-ru (<< 0.99g5-8.1), myspell-lv (<< 0.7.3-3.1), myspell-et (<< 1:20030606-12.1), myspell-fi (<< 0.7-17.2), myspell-cs-cz (<< 20040229-4.1), myspell-el-gr (<< 0.3-1.1), myspell-nn (<< 2.0.10-3.1), myspell-nb (<< 2.0.10-3.1), hunspell-ar (<< 0.0.0+20080110-1.1), myspell-hu (<< 0.99.4-1.2), hunspell-gl-es (<< 2.2a-6), myspell-gv (<< 0.50-8), myspell-en-au (<< 2.1-5), myspell-fa (<< 0.20070816-2), hunspell-uz (<< 0.6-3.1), hunspell-ko (<< 0.3.3-1), hunspell-se (<< 1.0~beta6.20081222-1.1), hunspell-de-med (<< 20090825-1), hunspell-en-us (<< 20070829-3), myspell-sv-se (<< 1.3.8-6-2.2), myspell-sk (<< 0.5.5a-2.1), myspell-fo (<< 0.2.36-3), myspell-nl (<< 1:1.10-3), myspell-pt-br (<< 2009.03.30-1.1), myspell-pl (<< 20090830-1), myspell-pt-pt (<< 20090309-1.1), myspell-ga (<< 2.0-19), myspell-gd (<< 0.50-7), myspell-ku (<< 0.20.0-1.1), myspell-hr (<< 20060617-2), myspell-fr-gut (<< 1:1.0-26.1), myspell-eo (<< 2.1.2000.02.25-41), myspell-de-de-oldspell (<< 1:2-25.1), myspell-da (<< 1.6.18-1.1), myspell-es (<< 1.10-7), myspell-de-at (<< 20071211-2), myspell-de-ch (<< 20071211-2), myspell-de-de (<< 20071211-2), hunspell-de-at (<< 20071211-2), hunspell-de-ch (<< 20071211-2), hunspell-de-de (<< 20071211-2), myspell-ca (<< 0.6-8), myspell-tl (<< 0.4-0-5), myspell-ne (<< 1.0-4.1), myspell-fr (<< 1.4-25), myspell-hy (<< 0.10.1-1.1), myspell-en-us (<< 1:3.1.0-3), myspell-en-gb (<< 1:3.1.0-3), myspell-en-za (<< 1:3.1.0-3), myspell-af (<< 1:3.1.0-3), myspell-it (<< 1:3.1.0-3), myspell-sw (<< 1:3.1.0-3), myspell-th (<< 1:3.1.0-3), hunspell-en-ca (<< 1:3.1.0-3), hunspell-ne (<< 1:3.1.0-3), hunspell-da (<< 1:3.1.0-3), hunspell-fr (<< 1:3.1.0-3), hunspell-vi (<< 1:3.1.0-3), hunspell-hu (<< 1:3.1.0-3), hunspell-sr (<< 1:3.1.0-3), hunspell-sh (<< 1:3.1.0-3), myspell-lv (<< 0.7.3-3.1), myspell-et (<< 1:20030606-12.1), myspell-nn (<< 2.0.10-3.1), myspell-nb (<< 2.0.10-3.1), libreoffice-filter-binfilter (<< 1:3.4.1~), libreoffice-evolution (<< 1:3.4.1~), libreoffice-kab (<< 1:3.4.1~), libreoffice-sdbc-postgresql (<< 0.8.1~), mozilla-libreoffice (<< 1:3.5.0~beta~)
@@ -183,7 +183,7 @@
 
 Package: libreoffice-math
 Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc powerpcspe ppc64 s390 s390x sparc kfreebsd-amd64 kfreebsd-i386
-Depends: libreoffice-core (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, fonts-opensymbol | ttf-opensymbol (>= 2:2.4.3~)
+Depends: libreoffice-core (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, fonts-opensymbol
 Description: office productivity suite -- equation editor
  LibreOffice is a full-featured office productivity suite that provides
  a near drop-in replacement for Microsoft(R) Office.
diff -Nru libreoffice-3.5.4/debian/control.in libreoffice-3.5.4/debian/control.in
--- libreoffice-3.5.4/debian/control.in	2012-07-01 22:03:22.000000000 +0200
+++ libreoffice-3.5.4/debian/control.in	2012-08-01 11:50:39.000000000 +0200
@@ -157,7 +157,7 @@
 Package: libreofficeVER-core
 Architecture: %OOO_ARCHS%
 Depends: libreofficeVER-common (>> ${base-version}), 
- fonts-opensymbol | ttf-opensymbol (>= 1:3.0),
+ fonts-opensymbol,
  ${shlibs:Depends},
  fontconfig,
  ${misc:Depends}
@@ -303,7 +303,7 @@
 Depends: libreofficeVER-core (= ${binary:Version}),
  ${shlibs:Depends},
  ${misc:Depends},
- fonts-opensymbol | ttf-opensymbol (>= 2:2.4.3~)
+ fonts-opensymbol
 Description: office productivity suite -- equation editor
  LibreOffice is a full-featured office productivity suite that provides
  a near drop-in replacement for Microsoft(R) Office.
diff -Nru libreoffice-3.5.4/debian/libreoffice-gcj.postinst.debhelper libreoffice-3.5.4/debian/libreoffice-gcj.postinst.debhelper
--- libreoffice-3.5.4/debian/libreoffice-gcj.postinst.debhelper	2012-06-26 17:55:15.000000000 +0200
+++ libreoffice-3.5.4/debian/libreoffice-gcj.postinst.debhelper	1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-# Automatically added by dh_nativejava
-if which rebuild-gcj-db >/dev/null 2>&1; then
-	rebuild-gcj-db
-fi
-# End automatically added section
diff -Nru libreoffice-3.5.4/debian/libreoffice-gcj.postrm.debhelper libreoffice-3.5.4/debian/libreoffice-gcj.postrm.debhelper
--- libreoffice-3.5.4/debian/libreoffice-gcj.postrm.debhelper	2012-06-26 17:55:15.000000000 +0200
+++ libreoffice-3.5.4/debian/libreoffice-gcj.postrm.debhelper	1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-# Automatically added by dh_nativejava
-if which rebuild-gcj-db >/dev/null 2>&1; then
-	rebuild-gcj-db
-fi
-# End automatically added section
diff -Nru libreoffice-3.5.4/debian/libreoffice-gcj.substvars libreoffice-3.5.4/debian/libreoffice-gcj.substvars
--- libreoffice-3.5.4/debian/libreoffice-gcj.substvars	2012-06-26 18:06:35.000000000 +0200
+++ libreoffice-3.5.4/debian/libreoffice-gcj.substvars	1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-misc:Depends=libgcj-common (>> 1:4.1.1-13)
-shlibs:Depends=libc6 (>= 2.2.5), libgcc1 (>= 1:4.1.1), libgcj-bc (>= 4.6.3-1~), zlib1g (>= 1:1.1.4)
-java:Depends=
-java:Recommends=
diff -Nru libreoffice-3.5.4/debian/patches/CVE-2012-2665-binfilter.diff libreoffice-3.5.4/debian/patches/CVE-2012-2665-binfilter.diff
--- libreoffice-3.5.4/debian/patches/CVE-2012-2665-binfilter.diff	1970-01-01 01:00:00.000000000 +0100
+++ libreoffice-3.5.4/debian/patches/CVE-2012-2665-binfilter.diff	2012-08-01 10:40:14.000000000 +0200
@@ -0,0 +1,538 @@
+From 5b278ca5fd540592951ad460d8950a931ab755a8 Mon Sep 17 00:00:00 2001
+From: Caolán McNamara <caolanm@redhat.com>
+Date: Wed, 30 May 2012 14:09:18 +0000
+Subject: use sax::Converter:: base64 code instead
+
+Change-Id: I92fd4459bed7c38ff2063899b20d24d781ac45b
+
+From b9f83fca37a3544b825de9d2f295090257d3477b Mon Sep 17 00:00:00 2001
+From: Caolán McNamara <caolanm@redhat.com>
+Date: Sat, 02 Jun 2012 22:14:45 +0000
+Subject: ThreeByteToFourByte and friends are no longer in use
+
+Change-Id: I9a2aaebfc5cc6b8b6327d61270043611283a6975
+
+--- a/binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingExportHelper.cxx
++++ b/binfilter/bf_sc/source/filter/xml/sc_XMLChangeTrackingExportHelper.cxx
+@@ -39,6 +39,9 @@
+ #include <bf_xmloff/xmluconv.hxx>
+ 
+ #include <bf_svtools/zforlist.hxx>
++
++#include <sax/tools/converter.hxx>
++
+ namespace binfilter {
+ 
+ #define SC_CHANGE_ID_PREFIX "ct"
+@@ -758,7 +761,7 @@ void ScChangeTrackingExportHelper::CollectAndWriteChanges()
+         if (pChangeTrack->IsProtected())
+         {
+             ::rtl::OUStringBuffer aBuffer;
+-            SvXMLUnitConverter::encodeBase64(aBuffer, pChangeTrack->GetProtection());
++            ::sax::Converter::encodeBase64(aBuffer, pChangeTrack->GetProtection());
+             if (aBuffer.getLength())
+                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY, aBuffer.makeStringAndClear());
+         }
+--- a/binfilter/bf_sc/source/filter/xml/sc_XMLTrackedChangesContext.cxx
++++ b/binfilter/bf_sc/source/filter/xml/sc_XMLTrackedChangesContext.cxx
+@@ -47,6 +47,9 @@
+ #include <bf_svtools/zforlist.hxx>
+ 
+ #include <com/sun/star/text/ControlCharacter.hpp>
++
++#include <sax/tools/converter.hxx>
++
+ namespace binfilter {
+ 
+ using namespace ::com::sun::star;
+@@ -562,7 +565,7 @@ ScXMLTrackedChangesContext::ScXMLTrackedChangesContext( ScXMLImport& rInImport,
+                 if (sValue.getLength())
+                 {
+                     uno::Sequence<sal_Int8> aPass;
+-                    SvXMLUnitConverter::decodeBase64(aPass, sValue);
++                    ::sax::Converter::decodeBase64(aPass, sValue);
+                     pChangeTrackingImportHelper->SetProtection(aPass);
+                 }
+             }
+--- a/binfilter/bf_sc/source/filter/xml/sc_xmlbodyi.cxx
++++ b/binfilter/bf_sc/source/filter/xml/sc_xmlbodyi.cxx
+@@ -56,6 +56,9 @@
+ #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
+ 
+ #include <sal/types.h>
++
++#include <sax/tools/converter.hxx>
++
+ namespace binfilter {
+ 
+ using namespace ::com::sun::star;
+@@ -193,7 +196,7 @@ void ScXMLBodyContext::EndElement()
+         {
+             uno::Sequence<sal_Int8> aPass;
+             if (sPassword.getLength())
+-                SvXMLUnitConverter::decodeBase64(aPass, sPassword);
++                ::sax::Converter::decodeBase64(aPass, sPassword);
+             pDoc->SetDocProtection(bProtected, aPass);
+         }
+         uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( GetScImport().GetModel(), uno::UNO_QUERY );
+--- a/binfilter/bf_sc/source/filter/xml/sc_xmlexprt.cxx
++++ b/binfilter/bf_sc/source/filter/xml/sc_xmlexprt.cxx
+@@ -86,6 +86,7 @@
+ #include <com/sun/star/sheet/NamedRangeFlag.hpp>
+ #include <com/sun/star/form/XFormsSupplier.hpp>
+ #include <legacysmgr/legacy_binfilters_smgr.hxx>
++#include <sax/tools/converter.hxx>
+ namespace binfilter {
+ //! not found in unonames.hxx
+ #define SC_STANDARDFORMAT "StandardFormat"
+@@ -1213,7 +1214,7 @@ void ScXMLExport::SetBodyAttributes()
+     {
+         AddAttribute(XML_NAMESPACE_TABLE, XML_STRUCTURE_PROTECTED, XML_TRUE);
+         ::rtl::OUStringBuffer aBuffer;
+-        SvXMLUnitConverter::encodeBase64(aBuffer, pDoc->GetDocPassword());
++        ::sax::Converter::encodeBase64(aBuffer, pDoc->GetDocPassword());
+         if (aBuffer.getLength())
+             AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY, aBuffer.makeStringAndClear());
+     }
+@@ -1285,7 +1286,7 @@ void ScXMLExport::_ExportContent()
+                                     AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTED, XML_TRUE);
+                                     ::rtl::OUStringBuffer aBuffer;
+                                     if (pDoc)
+-                                        SvXMLUnitConverter::encodeBase64(aBuffer, pDoc->GetTabPassword(nTable));
++                                        ::sax::Converter::encodeBase64(aBuffer, pDoc->GetTabPassword(nTable));
+                                     if (aBuffer.getLength())
+                                         AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY, aBuffer.makeStringAndClear());
+                                 }
+--- a/binfilter/bf_sc/source/filter/xml/sc_xmlsubti.cxx
++++ b/binfilter/bf_sc/source/filter/xml/sc_xmlsubti.cxx
+@@ -45,6 +45,8 @@
+ #include <com/sun/star/sheet/XCellRangeAddressable.hpp>
+ #include <com/sun/star/sheet/XCellRangeMovement.hpp>
+ #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
++
++#include <sax/tools/converter.hxx>
+ namespace binfilter {
+ 
+ //------------------------------------------------------------------
+@@ -593,7 +595,7 @@ void ScMyTables::DeleteTable()
+     if (rImport.GetDocument() && bProtection)
+     {
+         uno::Sequence<sal_Int8> aPass;
+-        SvXMLUnitConverter::decodeBase64(aPass, sPassword);
++        ::sax::Converter::decodeBase64SomeChars(aPass, sPassword);
+         rImport.GetDocument()->SetTabProtection(nCurrentSheet, bProtection, aPass);
+         /*uno::Reference <util::XProtectable> xProtectable(xCurrentSheet, uno::UNO_QUERY);
+         if (xProtectable.is())
+--- a/binfilter/bf_sc/util/makefile.mk
++++ b/binfilter/bf_sc/util/makefile.mk
+@@ -71,6 +71,7 @@ SHL1STDLIBS+=       \
+     $(BFSVXLIB)		\
+     $(BFOFALIB)		\
+     $(VCLLIB)		\
++    $(SAXLIB)		\
+     $(CPPULIB)		\
+     $(CPPUHELPERLIB)	\
+     $(COMPHELPERLIB)	\
+--- a/binfilter/bf_xmloff/source/core/xmloff_DocumentSettingsContext.cxx
++++ b/binfilter/bf_xmloff/source/core/xmloff_DocumentSettingsContext.cxx
+@@ -37,9 +37,7 @@
+ #include "xmluconv.hxx"
+ #include <tools/debug.hxx>
+ 
+-#ifndef __SGI_STL_LIST
+ #include <list>
+-#endif
+ 
+ #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
+ #include <com/sun/star/container/XIndexContainer.hpp>
+@@ -48,6 +46,7 @@
+ #include <com/sun/star/util/DateTime.hpp>
+ #include <com/sun/star/document/XViewDataSupplier.hpp>
+ #include <com/sun/star/document/PrinterIndependentLayout.hpp>
++#include <sax/tools/converter.hxx>
+ #include <xmlenums.hxx>
+ namespace binfilter {
+ 
+@@ -516,8 +515,7 @@ void XMLConfigItemContext::Characters( const ::rtl::OUString& rChars )
+             }
+             uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 );
+             sal_Int32 nCharsDecoded =
+-                GetImport().GetMM100UnitConverter().
+-                    decodeBase64SomeChars( aBuffer, sChars );
++                ::sax::Converter::decodeBase64SomeChars(aBuffer, sChars);
+             sal_uInt32 nStartPos(aDecoded.getLength());
+             sal_uInt32 nCount(aBuffer.getLength());
+             aDecoded.realloc(nStartPos + nCount);
+--- a/binfilter/bf_xmloff/source/core/xmloff_SettingsExportHelper.cxx
++++ b/binfilter/bf_xmloff/source/core/xmloff_SettingsExportHelper.cxx
+@@ -39,6 +39,7 @@
+ #include <com/sun/star/util/DateTime.hpp>
+ #include <com/sun/star/container/XIndexContainer.hpp>
+ #include <com/sun/star/document/PrinterIndependentLayout.hpp>
++#include <sax/tools/converter.hxx>
+ #include <xmlenums.hxx>
+ namespace binfilter {
+ 
+@@ -355,7 +356,7 @@ void XMLSettingsExportHelper::exportbase64Binary(
+     if(nLength)
+     {
+         ::rtl::OUStringBuffer sBuffer;
+-        SvXMLUnitConverter::encodeBase64(sBuffer, aProps);
++        ::sax::Converter::encodeBase64(sBuffer, aProps);
+         rExport.GetDocHandler()->characters(sBuffer.makeStringAndClear());
+     }
+ }
+--- a/binfilter/bf_xmloff/source/core/xmloff_XMLBase64Export.cxx
++++ b/binfilter/bf_xmloff/source/core/xmloff_XMLBase64Export.cxx
+@@ -28,6 +28,7 @@
+ 
+ 
+ #include <com/sun/star/io/XInputStream.hpp>
++#include <sax/tools/converter.hxx>
+ 
+ #include "xmluconv.hxx"
+ #include "xmlexp.hxx"
+@@ -62,8 +63,7 @@ sal_Bool XMLBase64Export::exportXML( const Reference < XInputStream> & rIn )
+             nRead = rIn->readBytes( aInBuff, INPUT_BUFFER_SIZE );
+             if( nRead > 0 )
+             {
+-                GetExport().GetMM100UnitConverter().encodeBase64( aOutBuff,
+-                                                                  aInBuff );
++                ::sax::Converter::encodeBase64(aOutBuff, aInBuff);
+                 GetExport().Characters( aOutBuff.makeStringAndClear() );
+                 if( nRead == INPUT_BUFFER_SIZE )
+                     GetExport().IgnorableWhitespace();
+--- a/binfilter/bf_xmloff/source/core/xmloff_XMLBase64ImportContext.cxx
++++ b/binfilter/bf_xmloff/source/core/xmloff_XMLBase64ImportContext.cxx
+@@ -31,6 +31,8 @@
+ 
+ #include <com/sun/star/io/XOutputStream.hpp>
+ 
++#include <sax/tools/converter.hxx>
++
+ #include "XMLBase64ImportContext.hxx"
+ namespace binfilter {
+ 
+@@ -82,8 +84,7 @@ void XMLBase64ImportContext::Characters( const ::rtl::OUString& rChars )
+         }
+         Sequence< sal_Int8 > aBuffer( (sChars.getLength() / 4) * 3 );
+         sal_Int32 nCharsDecoded =
+-            GetImport().GetMM100UnitConverter().
+-                decodeBase64SomeChars( aBuffer, sChars );
++            ::sax::Converter::decodeBase64SomeChars(aBuffer, sChars);
+         xOut->writeBytes( aBuffer );
+         if( nCharsDecoded != sChars.getLength() )
+             sBase64CharsLeft = sChars.copy( nCharsDecoded );
+diff -u b/binfilter/bf_xmloff/source/core/xmloff_xmluconv.cxx b/binfilter/bf_xmloff/source/core/xmloff_xmluconv.cxx
+--- b/binfilter/bf_xmloff/source/core/xmloff_xmluconv.cxx
++++ b/binfilter/bf_xmloff/source/core/xmloff_xmluconv.cxx
+@@ -1454,181 +1454,6 @@
+     rBuffer.append(sal_Unicode(')'));
+ }
+ 
+-const
+-  sal_Char aBase64EncodeTable[] =
+-    { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+-      'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+-      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+-      'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+-      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
+-
+-const
+-  sal_uInt8 aBase64DecodeTable[]  =
+-    {                                            62,255,255,255, 63, // 43-47
+-//                                                +               /
+-
+-     52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255,  0,255,255, // 48-63
+-//    0   1   2   3   4   5   6   7   8   9               =
+-
+-    255,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, // 64-79
+-//        A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
+-
+-     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, // 80-95
+-//    P   Q   R   S   T   U   V   W   X   Y   Z
+-
+-      0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111
+-//        a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
+-
+-     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 }; // 112-123
+-//    p   q   r   s   t   u   v   w   x   y   z
+-
+-
+-
+-void ThreeByteToFourByte (const sal_Int8* pBuffer, const sal_Int32 nStart, const sal_Int32 nFullLen, ::rtl::OUStringBuffer& sBuffer)
+-{
+-    sal_Int32 nLen(nFullLen - nStart);
+-    if (nLen > 3)
+-        nLen = 3;
+-    if (nLen == 0)
+-    {
+-        return;
+-    }
+-
+-    sal_Int32 nBinaer;
+-    switch (nLen)
+-    {
+-        case 1:
+-        {
+-            nBinaer = ((sal_uInt8)pBuffer[nStart + 0]) << 16;
+-        }
+-        break;
+-        case 2:
+-        {
+-            nBinaer = (((sal_uInt8)pBuffer[nStart + 0]) << 16) +
+-                    (((sal_uInt8)pBuffer[nStart + 1]) <<  8);
+-        }
+-        break;
+-        default:
+-        {
+-            nBinaer = (((sal_uInt8)pBuffer[nStart + 0]) << 16) +
+-                    (((sal_uInt8)pBuffer[nStart + 1]) <<  8) +
+-                    ((sal_uInt8)pBuffer[nStart + 2]);
+-        }
+-        break;
+-    }
+-
+-    sal_Unicode buf[4] = { '=', '=', '=', '=' };
+-
+-    sal_uInt8 nIndex ((nBinaer & 0xFC0000) >> 18);
+-    buf[0] = aBase64EncodeTable [nIndex];
+-
+-    nIndex = (nBinaer & 0x3F000) >> 12;
+-    buf[1] = aBase64EncodeTable [nIndex];
+-    if (nLen > 1)
+-    {
+-        nIndex = (nBinaer & 0xFC0) >> 6;
+-        buf[2] = aBase64EncodeTable [nIndex];
+-        if (nLen > 2)
+-        {
+-            nIndex = (nBinaer & 0x3F);
+-            buf[3] = aBase64EncodeTable [nIndex];
+-        }
+-    }
+-    sBuffer.append(buf, SAL_N_ELEMENTS(buf));
+-}
+-
+-void SvXMLUnitConverter::encodeBase64( ::rtl::OUStringBuffer& aStrBuffer, const uno::Sequence<sal_Int8>& aPass)
+-{
+-    sal_Int32 i(0);
+-    sal_Int32 nBufferLength(aPass.getLength());
+-    const sal_Int8* pBuffer = aPass.getConstArray();
+-    while (i < nBufferLength)
+-    {
+-        ThreeByteToFourByte (pBuffer, i, nBufferLength, aStrBuffer);
+-        i += 3;
+-    }
+-}
+-
+-void SvXMLUnitConverter::decodeBase64(uno::Sequence<sal_Int8>& aBuffer, const ::rtl::OUString& sBuffer)
+-{
+-#if OSL_DEBUG_LEVEL > 0
+-    sal_Int32 nCharsDecoded =
+-#endif
+-        decodeBase64SomeChars( aBuffer, sBuffer );
+-    OSL_ENSURE( nCharsDecoded == sBuffer.getLength(),
+-                "some bytes left in base64 decoding!" );
+-}
+-
+-sal_Int32 SvXMLUnitConverter::decodeBase64SomeChars(
+-        uno::Sequence<sal_Int8>& rOutBuffer,
+-        const ::rtl::OUString& rInBuffer)
+-{
+-    sal_Int32 nInBufferLen = rInBuffer.getLength();
+-    sal_Int32 nMinOutBufferLen = (nInBufferLen / 4) * 3;
+-    if( rOutBuffer.getLength() < nMinOutBufferLen )
+-        rOutBuffer.realloc( nMinOutBufferLen );
+-
+-    const sal_Unicode *pInBuffer = rInBuffer.getStr();
+-    sal_Int8 *pOutBuffer = rOutBuffer.getArray();
+-    sal_Int8 *pOutBufferStart = pOutBuffer;
+-    sal_Int32 nCharsDecoded = 0;
+-
+-    sal_uInt8 aDecodeBuffer[4];
+-    sal_Int32 nBytesToDecode = 0;
+-    sal_Int32 nBytesGotFromDecoding = 3;
+-    sal_Int32 nInBufferPos= 0;
+-    while( nInBufferPos < nInBufferLen )
+-    {
+-        sal_Unicode cChar = *pInBuffer;
+-        if( cChar >= '+' && cChar <= 'z' )
+-        {
+-            sal_uInt8 nByte = aBase64DecodeTable[cChar-'+'];
+-            if( nByte != 255 )
+-            {
+-                // We have found a valid character!
+-                aDecodeBuffer[nBytesToDecode++] = nByte;
+-
+-                // One '=' character at the end means 2 out bytes
+-                // Two '=' characters at the end mean 1 out bytes
+-                if( '=' == cChar && nBytesToDecode > 2 )
+-                    nBytesGotFromDecoding--;
+-                if( 4 == nBytesToDecode )
+-                {
+-                    // Four characters found, so we may convert now!
+-                    sal_uInt32 nOut = (aDecodeBuffer[0] << 18) +
+-                                      (aDecodeBuffer[1] << 12) +
+-                                      (aDecodeBuffer[2] << 6) +
+-                                       aDecodeBuffer[3];
+-
+-                    *pOutBuffer++  = (sal_Int8)((nOut & 0xff0000) >> 16);
+-                    if( nBytesGotFromDecoding > 1 )
+-                        *pOutBuffer++  = (sal_Int8)((nOut & 0xff00) >> 8);
+-                    if( nBytesGotFromDecoding > 2 )
+-                        *pOutBuffer++  = (sal_Int8)(nOut & 0xff);
+-                    nCharsDecoded = nInBufferPos + 1;
+-                    nBytesToDecode = 0;
+-                    nBytesGotFromDecoding = 3;
+-                }
+-            }
+-            else
+-            {
+-                nCharsDecoded++;
+-            }
+-        }
+-        else
+-        {
+-            nCharsDecoded++;
+-        }
+-
+-        nInBufferPos++;
+-        pInBuffer++;
+-    }
+-    if( (pOutBuffer - pOutBufferStart) != rOutBuffer.getLength() )
+-        rOutBuffer.realloc( pOutBuffer - pOutBufferStart );
+-
+-    return nCharsDecoded;
+-}
+-
+ sal_Bool SvXMLUnitConverter::convertNumFormat(
+         sal_Int16& rType,
+         const OUString& rNumFmt,
+--- a/binfilter/bf_xmloff/source/text/xmloff_XMLRedlineExport.cxx
++++ b/binfilter/bf_xmloff/source/text/xmloff_XMLRedlineExport.cxx
+@@ -45,6 +45,7 @@
+ 
+ #include <com/sun/star/util/DateTime.hpp>
+ 
++#include <sax/tools/converter.hxx>
+ 
+ #include "xmlnmspe.hxx"
+ 
+@@ -238,7 +239,7 @@ void XMLRedlineExport::ExportChangesListElements()
+         if ( aKey.getLength() > 0 )
+         {
+             OUStringBuffer aBuffer;
+-            SvXMLUnitConverter::encodeBase64( aBuffer, aKey );
++            ::sax::Converter::encodeBase64(aBuffer, aKey);
+             rExport.AddAttribute( XML_NAMESPACE_TEXT, XML_PROTECTION_KEY,
+                                   aBuffer.makeStringAndClear() );
+         }
+--- a/binfilter/bf_xmloff/source/text/xmloff_XMLSectionExport.cxx
++++ b/binfilter/bf_xmloff/source/text/xmloff_XMLSectionExport.cxx
+@@ -39,6 +39,8 @@
+ #include <com/sun/star/text/XTextFieldsSupplier.hpp>
+ #include <com/sun/star/text/XChapterNumberingSupplier.hpp>
+ 
++#include <sax/tools/converter.hxx>
++
+ #include "xmlkywd.hxx"
+ #include "xmluconv.hxx"
+ #include "xmlexp.hxx"
+@@ -452,7 +454,7 @@ void XMLSectionExport::ExportRegularSectionStart(
+     if (aPassword.getLength() > 0)
+     {
+         OUStringBuffer aBuffer;
+-        SvXMLUnitConverter::encodeBase64(aBuffer, aPassword);
++        ::sax::Converter::encodeBase64(aBuffer, aPassword);
+         GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_PROTECTION_KEY,
+                                  aBuffer.makeStringAndClear());
+     }
+--- a/binfilter/bf_xmloff/source/text/xmloff_XMLSectionImportContext.cxx
++++ b/binfilter/bf_xmloff/source/text/xmloff_XMLSectionImportContext.cxx
+@@ -40,6 +40,8 @@
+ #include <com/sun/star/text/XTextContent.hpp>
+ #include <com/sun/star/text/ControlCharacter.hpp>
+ 
++#include <sax/tools/converter.hxx>
++
+ namespace binfilter {
+ 
+ 
+@@ -308,7 +310,7 @@ void XMLSectionImportContext::ProcessAttributes(
+                 }
+                 break;
+             case XML_TOK_SECTION_PROTECTION_KEY:
+-                SvXMLUnitConverter::decodeBase64(aSequence, sAttr);
++                ::sax::Converter::decodeBase64(aSequence, sAttr);
+                 bSequenceOK = sal_True;
+                 break;
+             case XML_TOK_SECTION_PROTECT:
+--- a/binfilter/bf_xmloff/source/text/xmloff_XMLTextFrameContext.cxx
++++ b/binfilter/bf_xmloff/source/text/xmloff_XMLTextFrameContext.cxx
+@@ -35,6 +35,7 @@
+ #include <com/sun/star/io/XOutputStream.hpp>
+ #include <com/sun/star/text/HoriOrientation.hpp>
+ #include <com/sun/star/text/VertOrientation.hpp>
++#include <sax/tools/converter.hxx>
+ #include "xmlimp.hxx"
+ #include "xmlnmspe.hxx"
+ #include "xmlkywd.hxx"
+@@ -1111,8 +1112,7 @@ void XMLTextFrameContext::Characters( const OUString& rChars )
+                 }
+                 Sequence< sal_Int8 > aBuffer( (sChars.getLength() / 4) * 3 );
+                 sal_Int32 nCharsDecoded =
+-                    GetImport().GetMM100UnitConverter().
+-                        decodeBase64SomeChars( aBuffer, sChars );
++                    ::sax::Converter::decodeBase64SomeChars(aBuffer, sChars);
+                 xBase64Stream->writeBytes( aBuffer );
+                 if( nCharsDecoded != sChars.getLength() )
+                     sBase64CharsLeft = sChars.copy( nCharsDecoded );
+--- a/binfilter/bf_xmloff/source/text/xmloff_XMLTrackedChangesImportContext.cxx
++++ b/binfilter/bf_xmloff/source/text/xmloff_XMLTrackedChangesImportContext.cxx
+@@ -30,6 +30,7 @@
+ #include "XMLChangedRegionImportContext.hxx"
+ #include <com/sun/star/uno/Reference.h>
+ #include <com/sun/star/uno/Sequence.h>
++#include <sax/tools/converter.hxx>
+ #include "xmlimp.hxx"
+ #include "xmlnmspe.hxx"
+ #include "nmspmap.hxx"
+@@ -84,7 +85,7 @@ void XMLTrackedChangesImportContext::StartElement(
+             }
+             else if ( IsXMLToken( sLocalName, XML_PROTECTION_KEY ) )            {
+                 Sequence<sal_Int8> aSequence;
+-                SvXMLUnitConverter::decodeBase64(
++                ::sax::Converter::decodeBase64(
+                     aSequence, xAttrList->getValueByIndex(i));
+                 if ( aSequence.getLength() > 0 )
+                 {
+--- a/binfilter/bf_xmloff/util/makefile.mk
++++ b/binfilter/bf_xmloff/util/makefile.mk
+@@ -69,6 +69,7 @@ SHL1IMPLIB= _ibf_xo
+ 
+ SHL1STDLIBS= \
+         $(BFSVTOOLLIB)	\
++        $(SAXLIB)		\
+         $(TOOLSLIB)		\
+         $(I18NISOLANGLIB) \
+         $(CPPULIB)		\
+--- a/binfilter/inc/bf_xmloff/xmluconv.hxx
++++ b/binfilter/inc/bf_xmloff/xmluconv.hxx
+@@ -309,17 +309,6 @@ public:
+     static sal_Int32 indexOfComma( const ::rtl::OUString& rStr,
+                                    sal_Int32 nPos );
+ 
+-    static void encodeBase64( ::rtl::OUStringBuffer& aStrBuffer, const ::com::sun::star::uno::Sequence<sal_Int8>& aPass);
+-
+-    // Decode a base 64 encoded string into a sequence of bytes. The first
+-    // version can be used for attribute values only, bacause it does not
+-    // return any chars left from conversion.
+-    // For text submitted throgh the SAX characters call, the later method
+-    // must be used!
+-    static void decodeBase64( ::com::sun::star::uno::Sequence<sal_Int8>& aPass, const ::rtl::OUString& sBuffer);
+-
+-    static sal_Int32 decodeBase64SomeChars( ::com::sun::star::uno::Sequence<sal_Int8>& aPass, const ::rtl::OUString& sBuffer);
+-
+     /** convert num-forat and num-letter-sync values to NumberingType */
+     sal_Bool convertNumFormat( sal_Int16& rType,
+                                 const ::rtl::OUString& rNumFormat,
diff -Nru libreoffice-3.5.4/debian/patches/CVE-2012-2665.diff libreoffice-3.5.4/debian/patches/CVE-2012-2665.diff
--- libreoffice-3.5.4/debian/patches/CVE-2012-2665.diff	1970-01-01 01:00:00.000000000 +0100
+++ libreoffice-3.5.4/debian/patches/CVE-2012-2665.diff	2012-08-01 10:40:43.000000000 +0200
@@ -0,0 +1,1487 @@
+Date: Fri, 08 Jun 2012 10:23:44 +0100                                           
+From: Caolán McNamara <caolanm@redhat.com>                                      
+To: Petr Mladek <pmladek@suse.cz>                                               
+Cc: tdf-security@lists.documentfoundation.org                                   
+Subject: [REVIEW 3-5] Re: Is CVE-2012-2665 fixed in LO?                         
+                                                                                
+On Thu, 2012-06-07 at 18:23 +0200, Petr Mladek wrote:                           
+> Hi Caolan,                                                                    
+>                                                                               
+> I am a bit confused by all the security problems. Is CVE-2012-2665 fixed      
+> in LO-3.5?                                                                    
+                                                                                
+Not yet. I wanted to wait to propose any more backports until the               
+backlog was cleared to try and avoid confusion :-)                              
+                                                                                
+So, I'm now requesting the following three additional commits to be             
+cherry-picked to 3-5                                                            
+                                                                                
+78f614e5fff70d4874322255cca739f430865f0a key-size                               
+acc613a3236c61c8272bde1eadca5d8bf25f98f1 tag-hierarchy                          
+4a7164429b727bd8fd6f183950e85e6225869364 count-and-order                        
+                                                                                
+to address CVE-2012-2665                                                        
+                                                                                
+I'd like to consider those three + the already cherry-picked                    
+4036ee4db7b43cac9f892c2b9a2c545f0f838747 as our canonical solution to           
+CVE-2012-2665 (78f614e5fff70d4874322255cca739f430865f0a is technically          
+not really relevant but I reckon its easiest to bundle it into any              
+backports while we're at it to keep things simple)                              
+
+C.
+
+From 4036ee4db7b43cac9f892c2b9a2c545f0f838747 Mon Sep 17 00:00:00 2001
+From: Caolán McNamara <caolanm@redhat.com>
+Date: Wed, 30 May 2012 14:10:25 +0000
+Subject: merge three base64 encoders/decoders together
+
+Conflicts:
+
+	filter/source/placeware/Base64Codec.cxx
+	package/source/manifest/Base64Codec.cxx
+
+Change-Id: Ic123c081fcf6ddcf5d61c5d5a3eab01db470014c
+Signed-off-by: Miklos Vajna <vmiklos@suse.cz>
+---
+diff --git a/filter/Library_placeware.mk b/filter/Library_placeware.mk
+index d0af3c1..0471cd2 100644
+--- a/filter/Library_placeware.mk
++++ b/filter/Library_placeware.mk
+@@ -34,11 +34,11 @@ $(eval $(call gb_Library_add_linked_libs,placeware,\
+ 	cppuhelper \
+ 	cppu \
+ 	sal \
++	sax \
+ 	$(gb_STDLIBS) \
+ ))
+ 
+ $(eval $(call gb_Library_add_exception_objects,placeware,\
+-	filter/source/placeware/Base64Codec \
+ 	filter/source/placeware/exporter \
+ 	filter/source/placeware/filter \
+ 	filter/source/placeware/tempfile \
+diff --git a/filter/source/placeware/Base64Codec.cxx b/filter/source/placeware/Base64Codec.cxx
+deleted file mode 100644
+index 49cfcc0..0000000
+--- a/filter/source/placeware/Base64Codec.cxx
++++ b/dev/null
+@@ -1,206 +0,0 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+-/*************************************************************************
+- *
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * Copyright 2000, 2010 Oracle and/or its affiliates.
+- *
+- * OpenOffice.org - a multi-platform office productivity suite
+- *
+- * This file is part of OpenOffice.org.
+- *
+- * OpenOffice.org is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU Lesser General Public License version 3
+- * only, as published by the Free Software Foundation.
+- *
+- * OpenOffice.org is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU Lesser General Public License version 3 for more details
+- * (a copy is included in the LICENSE file that accompanied this code).
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * version 3 along with OpenOffice.org.  If not, see
+- * <http://www.openoffice.org/license.html>
+- * for a copy of the LGPLv3 License.
+- *
+- ************************************************************************/
+-
+-#include "Base64Codec.hxx"
+-#include <rtl/ustrbuf.hxx>
+-#include <osl/diagnose.h>
+-using namespace osl;
+-using namespace com::sun::star;
+-using ::rtl::OUString;
+-using ::rtl::OUStringBuffer;
+-const
+-  sal_Char aBase64EncodeTable[] =
+-    { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+-      'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+-      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+-      'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+-      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
+-
+-const
+-  sal_uInt8 aBase64DecodeTable[]  =
+-    { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, // 0-15
+-
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, // 16-31
+-
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0, 63, // 32-47
+-//                                                +               /
+-
+-     52, 53, 54, 55, 56, 57, 58, 59, 60, 61,  0,  0,  0,  0,  0,  0, // 48-63
+-//    0   1   2   3   4   5   6   7   8   9               =
+-
+-      0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, // 64-79
+-//        A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
+-
+-     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,  0,  0,  0,  0,  0, // 80-95
+-//    P   Q   R   S   T   U   V   W   X   Y   Z
+-
+-      0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111
+-//        a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
+-
+-     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,  0,  0,  0,  0,  0, // 112-127
+-//    p   q   r   s   t   u   v   w   x   y   z
+-
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+-
+-
+-void ThreeByteToFourByte (const sal_uInt8* pBuffer, const sal_Int32 nStart, const sal_Int32 nFullLen, rtl::OUStringBuffer& sBuffer)
+-{
+-    sal_Int32 nLen(nFullLen - nStart);
+-    if (nLen > 3)
+-        nLen = 3;
+-    if (nLen == 0)
+-    {
+-        return;
+-    }
+-
+-    sal_Int32 nBinaer;
+-    switch (nLen)
+-    {
+-        case 1:
+-        {
+-            nBinaer = ((sal_uInt8)pBuffer[nStart + 0]) << 16;
+-        }
+-        break;
+-        case 2:
+-        {
+-            nBinaer = (((sal_uInt8)pBuffer[nStart + 0]) << 16) +
+-                    (((sal_uInt8)pBuffer[nStart + 1]) <<  8);
+-        }
+-        break;
+-        default:
+-        {
+-            nBinaer = (((sal_uInt8)pBuffer[nStart + 0]) << 16) +
+-                    (((sal_uInt8)pBuffer[nStart + 1]) <<  8) +
+-                    ((sal_uInt8)pBuffer[nStart + 2]);
+-        }
+-        break;
+-    }
+-
+-    sal_Unicode buf[] = { '=', '=', '=', '=' };
+-
+-    sal_uInt8 nIndex = static_cast< sal_uInt8 >((nBinaer & 0xFC0000) >> 18);
+-    buf[0] = aBase64EncodeTable [nIndex];
+-
+-    nIndex = static_cast< sal_uInt8 >((nBinaer & 0x3F000) >> 12);
+-    buf[1] = aBase64EncodeTable [nIndex];
+-    if (nLen > 1)
+-    {
+-        nIndex = static_cast< sal_uInt8 >((nBinaer & 0xFC0) >> 6);
+-        buf[2] = aBase64EncodeTable [nIndex];
+-        if (nLen > 2)
+-        {
+-            nIndex = static_cast< sal_uInt8 >((nBinaer & 0x3F));
+-            buf[3] = aBase64EncodeTable [nIndex];
+-        }
+-    }
+-    sBuffer.append(buf, SAL_N_ELEMENTS(buf));
+-}
+-
+-void Base64Codec::encodeBase64(rtl::OUStringBuffer& aStrBuffer, const uno::Sequence < sal_Int8 >& aPass)
+-{
+-    sal_Int32 i(0);
+-    sal_Int32 nBufferLength(aPass.getLength());
+-    const sal_Int8* pBuffer = aPass.getConstArray();
+-    while (i < nBufferLength)
+-    {
+-        ThreeByteToFourByte ((const sal_uInt8*)pBuffer, i, nBufferLength, aStrBuffer);
+-        i += 3;
+-    }
+-}
+-
+-const rtl::OUString s2equal(RTL_CONSTASCII_USTRINGPARAM("=="));
+-const rtl::OUString s1equal(RTL_CONSTASCII_USTRINGPARAM("="));
+-#if 0
+-void FourByteToThreeByte (sal_uInt8* pBuffer, sal_Int32& nLength, const sal_Int32 nStart, const rtl::OUString& sString)
+-{
+-    nLength = 0;
+-    sal_Int32 nLen (sString.getLength());
+-
+-    if (nLen != 4)
+-    {
+-        return;
+-    }
+-
+-
+-    if (sString.indexOf(s2equal) == 2)
+-        nLength = 1;
+-    else if (sString.indexOf(s1equal) == 3)
+-        nLength = 2;
+-    else
+-        nLength = 3;
+-
+-    sal_Int32 nBinaer ((aBase64DecodeTable [sString [0]] << 18) +
+-            (aBase64DecodeTable [sString [1]] << 12) +
+-            (aBase64DecodeTable [sString [2]] <<  6) +
+-            (aBase64DecodeTable [sString [3]]));
+-
+-    sal_uInt8 OneByte = static_cast< sal_uInt8 >((nBinaer & 0xFF0000) >> 16);
+-    pBuffer[nStart + 0] = (sal_uInt8)OneByte;
+-
+-    if (nLength == 1)
+-        return;
+-
+-    OneByte = static_cast< sal_uInt8 >((nBinaer & 0xFF00) >> 8);
+-    pBuffer[nStart + 1] = (sal_uInt8)OneByte;
+-
+-    if (nLength == 2)
+-        return;
+-
+-    OneByte = static_cast< sal_uInt8 >(nBinaer & 0xFF);
+-    pBuffer[nStart + 2] = (sal_uInt8)OneByte;
+-}
+-
+-void Base64Codec::decodeBase64(uno::Sequence< sal_uInt8 >& aBuffer, const rtl::OUString& sBuffer)
+-{
+-    sal_Int32 nFirstLength((sBuffer.getLength() / 4) * 3);
+-    sal_uInt8* pBuffer = new sal_uInt8[nFirstLength];
+-    sal_Int32 nSecondLength(0);
+-    sal_Int32 nLength(0);
+-    sal_Int32 i = 0;
+-    sal_Int32 k = 0;
+-    while (i < sBuffer.getLength())
+-    {
+-        FourByteToThreeByte (pBuffer, nLength, k, sBuffer.copy(i, 4));
+-        nSecondLength += nLength;
+-        nLength = 0;
+-        i += 4;
+-        k += 3;
+-    }
+-    aBuffer = uno::Sequence<sal_uInt8>(pBuffer, nSecondLength);
+-    delete[] pBuffer;
+-}
+-#endif
+-
+-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/filter/source/placeware/Base64Codec.hxx b/filter/source/placeware/Base64Codec.hxx
+deleted file mode 100644
+index b635b1e..0000000
+--- a/filter/source/placeware/Base64Codec.hxx
++++ b/dev/null
+@@ -1,50 +0,0 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+-/*************************************************************************
+- *
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * Copyright 2000, 2010 Oracle and/or its affiliates.
+- *
+- * OpenOffice.org - a multi-platform office productivity suite
+- *
+- * This file is part of OpenOffice.org.
+- *
+- * OpenOffice.org is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU Lesser General Public License version 3
+- * only, as published by the Free Software Foundation.
+- *
+- * OpenOffice.org is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU Lesser General Public License version 3 for more details
+- * (a copy is included in the LICENSE file that accompanied this code).
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * version 3 along with OpenOffice.org.  If not, see
+- * <http://www.openoffice.org/license.html>
+- * for a copy of the LGPLv3 License.
+- *
+- ************************************************************************/
+-
+-#ifndef _BASE64_CODEC_HXX
+-#define _BASE64_CODEC_HXX
+-
+-#include <com/sun/star/uno/Sequence.hxx>
+-
+-namespace rtl
+-{
+-class OUString;
+-class OUStringBuffer;
+-}
+-
+-class Base64Codec
+-{
+-public:
+-    static void encodeBase64(rtl::OUStringBuffer& aStrBuffer, const com::sun::star::uno::Sequence<sal_Int8>& aPass);
+-#if 0
+-    static void decodeBase64(com::sun::star::uno::Sequence<sal_uInt8>& aPass, const rtl::OUString& sBuffer);
+-#endif
+-};
+-#endif
+-
+-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/filter/source/placeware/exporter.cxx b/filter/source/placeware/exporter.cxx
+index b925b65..a89e915 100644
+--- a/filter/source/placeware/exporter.cxx
++++ b/filter/source/placeware/exporter.cxx
+@@ -39,12 +39,12 @@
+ #include <com/sun/star/task/XStatusIndicatorFactory.hpp>
+ #include <rtl/ustrbuf.hxx>
+ #include <rtl/string.hxx>
++#include <sax/tools/converter.hxx>
+ #include <osl/diagnose.h>
+ 
+ #include <vector>
+ 
+ #include "exporter.hxx"
+-#include "Base64Codec.hxx"
+ #include "zip.hxx"
+ #include "tempfile.hxx"
+ 
+@@ -161,7 +161,7 @@ static void encodeFile( osl::File& rSourceFile, Reference< XOutputStream >& xOut
+             nLen -= nRead;
+ 
+             rtl::OUStringBuffer aStrBuffer;
+-            Base64Codec::encodeBase64( aStrBuffer, aInBuffer );
++            ::sax::Converter::encodeBase64(aStrBuffer, aInBuffer);
+ 
+             sal_Int32 nCount = aStrBuffer.getLength();
+ 
+diff --git a/package/Library_package2.mk b/package/Library_package2.mk
+index 306887e..dfce64b 100644
+--- a/package/Library_package2.mk
++++ b/package/Library_package2.mk
+@@ -51,6 +51,7 @@ $(eval $(call gb_Library_add_linked_libs,package2,\
+ 	cppu \
+ 	cppuhelper \
+ 	sal \
++	sax \
+ 	ucbhelper \
+ 	$(gb_STDLIBS) \
+ ))
+@@ -60,7 +61,6 @@ $(eval $(call gb_Library_use_externals,package2,\
+ ))
+ 
+ $(eval $(call gb_Library_add_exception_objects,package2,\
+-	package/source/manifest/Base64Codec \
+ 	package/source/manifest/ManifestExport \
+ 	package/source/manifest/ManifestImport \
+ 	package/source/manifest/ManifestReader \
+diff --git a/package/prj/build.lst b/package/prj/build.lst
+index e1a2c11..35b408d 100644
+--- a/package/prj/build.lst
++++ b/package/prj/build.lst
+@@ -1,2 +1,2 @@
+-pk	package	:	cppu cppuhelper comphelper ucbhelper sal ZLIB:zlib LIBXSLT:libxslt NULL
++pk	package	:	cppu cppuhelper comphelper ucbhelper sal ZLIB:zlib LIBXSLT:libxslt sax NULL
+ pk	package\prj					nmake	-	all	pk_prj NULL
+diff --git a/package/source/manifest/Base64Codec.cxx b/package/source/manifest/Base64Codec.cxx
+deleted file mode 100644
+index 66a7f18..0000000
+--- a/package/source/manifest/Base64Codec.cxx
++++ b/dev/null
+@@ -1,204 +0,0 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+-/*************************************************************************
+- *
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * Copyright 2000, 2010 Oracle and/or its affiliates.
+- *
+- * OpenOffice.org - a multi-platform office productivity suite
+- *
+- * This file is part of OpenOffice.org.
+- *
+- * OpenOffice.org is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU Lesser General Public License version 3
+- * only, as published by the Free Software Foundation.
+- *
+- * OpenOffice.org is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU Lesser General Public License version 3 for more details
+- * (a copy is included in the LICENSE file that accompanied this code).
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * version 3 along with OpenOffice.org.  If not, see
+- * <http://www.openoffice.org/license.html>
+- * for a copy of the LGPLv3 License.
+- *
+- ************************************************************************/
+-
+-#include "Base64Codec.hxx"
+-#include <rtl/ustrbuf.hxx>
+-#include <osl/diagnose.h>
+-using namespace osl;
+-using namespace com::sun::star;
+-
+-using ::rtl::OUStringBuffer;
+-
+-const
+-  sal_Char aBase64EncodeTable[] =
+-    { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+-      'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+-      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+-      'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+-      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
+-
+-const
+-  sal_uInt8 aBase64DecodeTable[]  =
+-    { 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, // 0-15
+-
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, // 16-31
+-
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0, 63, // 32-47
+-//                                                +               /
+-
+-     52, 53, 54, 55, 56, 57, 58, 59, 60, 61,  0,  0,  0,  0,  0,  0, // 48-63
+-//    0   1   2   3   4   5   6   7   8   9               =
+-
+-      0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, // 64-79
+-//        A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
+-
+-     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,  0,  0,  0,  0,  0, // 80-95
+-//    P   Q   R   S   T   U   V   W   X   Y   Z
+-
+-      0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111
+-//        a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
+-
+-     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,  0,  0,  0,  0,  0, // 112-127
+-//    p   q   r   s   t   u   v   w   x   y   z
+-
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+-      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+-
+-
+-void ThreeByteToFourByte (const sal_uInt8* pBuffer, const sal_Int32 nStart, const sal_Int32 nFullLen, rtl::OUStringBuffer& sBuffer)
+-{
+-    sal_Int32 nLen(nFullLen - nStart);
+-    if (nLen > 3)
+-        nLen = 3;
+-    if (nLen == 0)
+-    {
+-        return;
+-    }
+-
+-    sal_Int32 nBinaer;
+-    switch (nLen)
+-    {
+-        case 1:
+-        {
+-            nBinaer = ((sal_uInt8)pBuffer[nStart + 0]) << 16;
+-        }
+-        break;
+-        case 2:
+-        {
+-            nBinaer = (((sal_uInt8)pBuffer[nStart + 0]) << 16) +
+-                    (((sal_uInt8)pBuffer[nStart + 1]) <<  8);
+-        }
+-        break;
+-        default:
+-        {
+-            nBinaer = (((sal_uInt8)pBuffer[nStart + 0]) << 16) +
+-                    (((sal_uInt8)pBuffer[nStart + 1]) <<  8) +
+-                    ((sal_uInt8)pBuffer[nStart + 2]);
+-        }
+-        break;
+-    }
+-
+-    sal_Unicode buf[] = { '=', '=', '=', '=' };
+-
+-    sal_uInt8 nIndex = static_cast< sal_uInt8 >((nBinaer & 0xFC0000) >> 18);
+-    buf[0] = aBase64EncodeTable [nIndex];
+-
+-    nIndex = static_cast< sal_uInt8 >((nBinaer & 0x3F000) >> 12);
+-    buf[1] = aBase64EncodeTable [nIndex];
+-    if (nLen > 1)
+-    {
+-        nIndex = static_cast< sal_uInt8 >((nBinaer & 0xFC0) >> 6);
+-        buf[2] = aBase64EncodeTable [nIndex];
+-        if (nLen > 2)
+-        {
+-            nIndex = static_cast< sal_uInt8 >(nBinaer & 0x3F);
+-            buf[3] = aBase64EncodeTable [nIndex];
+-        }
+-    }
+-    sBuffer.append(buf, SAL_N_ELEMENTS(buf));
+-}
+-
+-void Base64Codec::encodeBase64(rtl::OUStringBuffer& aStrBuffer, const uno::Sequence < sal_Int8 >& aPass)
+-{
+-    sal_Int32 i(0);
+-    sal_Int32 nBufferLength(aPass.getLength());
+-    const sal_uInt8* pBuffer = reinterpret_cast< const sal_uInt8* >( aPass.getConstArray() );
+-    while (i < nBufferLength)
+-    {
+-        ThreeByteToFourByte (pBuffer, i, nBufferLength, aStrBuffer);
+-        i += 3;
+-    }
+-}
+-
+-const rtl::OUString s2equal(RTL_CONSTASCII_USTRINGPARAM("=="));
+-const rtl::OUString s1equal(RTL_CONSTASCII_USTRINGPARAM("="));
+-
+-void FourByteToThreeByte (sal_uInt8* pBuffer, sal_Int32& nLength, const sal_Int32 nStart, const rtl::OUString& sString)
+-{
+-    nLength = 0;
+-    sal_Int32 nLen (sString.getLength());
+-
+-    OSL_ASSERT( nLen == 4 );
+-    if (nLen != 4)
+-        return;
+-
+-    if (sString.indexOf(s2equal) == 2)
+-        nLength = 1;
+-    else if (sString.indexOf(s1equal) == 3)
+-        nLength = 2;
+-    else
+-        nLength = 3;
+-
+-    sal_Int32 nBinaer ((aBase64DecodeTable [sString [0]] << 18) +
+-            (aBase64DecodeTable [sString [1]] << 12) +
+-            (aBase64DecodeTable [sString [2]] <<  6) +
+-            (aBase64DecodeTable [sString [3]]));
+-
+-    sal_uInt8 OneByte = static_cast< sal_uInt8 >((nBinaer & 0xFF0000) >> 16);
+-    pBuffer[nStart + 0] = (sal_uInt8)OneByte;
+-
+-    if (nLength == 1)
+-        return;
+-
+-    OneByte = static_cast< sal_uInt8 >((nBinaer & 0xFF00) >> 8);
+-    pBuffer[nStart + 1] = OneByte;
+-
+-    if (nLength == 2)
+-        return;
+-
+-    OneByte = static_cast< sal_uInt8 >(nBinaer & 0xFF);
+-    pBuffer[nStart + 2] = OneByte;
+-}
+-
+-void Base64Codec::decodeBase64(uno::Sequence< sal_Int8 >& aBuffer, const rtl::OUString& sBuffer)
+-{
+-    sal_Int32 nFirstLength((sBuffer.getLength() / 4) * 3);
+-    sal_uInt8* pBuffer = new sal_uInt8[nFirstLength];
+-    sal_Int32 nSecondLength(0);
+-    sal_Int32 nLength(0);
+-    sal_Int32 i = 0;
+-    sal_Int32 k = 0;
+-    while (i < sBuffer.getLength())
+-    {
+-        FourByteToThreeByte (pBuffer, nLength, k, sBuffer.copy(i, 4));
+-        nSecondLength += nLength;
+-        nLength = 0;
+-        i += 4;
+-        k += 3;
+-    }
+-    aBuffer = uno::Sequence<sal_Int8>( reinterpret_cast< sal_Int8* >( pBuffer ), nSecondLength );
+-    delete[] pBuffer;
+-}
+-
+-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/package/source/manifest/Base64Codec.hxx b/package/source/manifest/Base64Codec.hxx
+deleted file mode 100644
+index 60bd018..0000000
+--- a/package/source/manifest/Base64Codec.hxx
++++ b/dev/null
+@@ -1,48 +0,0 @@
+-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+-/*************************************************************************
+- *
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * Copyright 2000, 2010 Oracle and/or its affiliates.
+- *
+- * OpenOffice.org - a multi-platform office productivity suite
+- *
+- * This file is part of OpenOffice.org.
+- *
+- * OpenOffice.org is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU Lesser General Public License version 3
+- * only, as published by the Free Software Foundation.
+- *
+- * OpenOffice.org is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU Lesser General Public License version 3 for more details
+- * (a copy is included in the LICENSE file that accompanied this code).
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * version 3 along with OpenOffice.org.  If not, see
+- * <http://www.openoffice.org/license.html>
+- * for a copy of the LGPLv3 License.
+- *
+- ************************************************************************/
+-
+-#ifndef _BASE64_CODEC_HXX
+-#define _BASE64_CODEC_HXX
+-
+-#include <com/sun/star/uno/Sequence.hxx>
+-
+-namespace rtl
+-{
+-class OUString;
+-class OUStringBuffer;
+-}
+-
+-class Base64Codec
+-{
+-public:
+-    static void encodeBase64(rtl::OUStringBuffer& aStrBuffer, const com::sun::star::uno::Sequence<sal_Int8>& aPass);
+-    static void decodeBase64(com::sun::star::uno::Sequence<sal_Int8>& aPass, const rtl::OUString& sBuffer);
+-};
+-#endif
+-
+-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/package/source/manifest/ManifestExport.cxx b/package/source/manifest/ManifestExport.cxx
+index a9e9f45..94e5234 100644
+--- a/package/source/manifest/ManifestExport.cxx
++++ b/package/source/manifest/ManifestExport.cxx
+@@ -37,7 +37,7 @@
+ 
+ #include <ManifestDefines.hxx>
+ #include <ManifestExport.hxx>
+-#include <Base64Codec.hxx>
++#include <sax/tools/converter.hxx>
+ 
+ #include <rtl/ustrbuf.hxx>
+ #include <comphelper/documentconstants.hxx>
+@@ -275,7 +275,7 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > xHa
+ 
+             pNewAttrList->AddAttribute ( sChecksumTypeAttribute, sCdataAttribute, sChecksumType );
+             *pDigest >>= aSequence;
+-            Base64Codec::encodeBase64( aBuffer, aSequence );
++            ::sax::Converter::encodeBase64(aBuffer, aSequence);
+             pNewAttrList->AddAttribute ( sChecksumAttribute, sCdataAttribute, aBuffer.makeStringAndClear() );
+ 
+             xHandler->startElement( sEncryptionDataElement , xNewAttrList);
+@@ -308,7 +308,7 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > xHa
+             pNewAttrList->AddAttribute ( sAlgorithmNameAttribute, sCdataAttribute, sEncAlgName );
+ 
+             *pVector >>= aSequence;
+-            Base64Codec::encodeBase64 ( aBuffer, aSequence );
++            ::sax::Converter::encodeBase64(aBuffer, aSequence);
+             pNewAttrList->AddAttribute ( sInitialisationVectorAttribute, sCdataAttribute, aBuffer.makeStringAndClear() );
+ 
+             xHandler->ignorableWhitespace ( sWhiteSpace );
+@@ -334,7 +334,7 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > xHa
+             pNewAttrList->AddAttribute ( sIterationCountAttribute, sCdataAttribute, aBuffer.makeStringAndClear() );
+ 
+             *pSalt >>= aSequence;
+-            Base64Codec::encodeBase64 ( aBuffer, aSequence );
++            ::sax::Converter::encodeBase64(aBuffer, aSequence);
+             pNewAttrList->AddAttribute ( sSaltAttribute, sCdataAttribute, aBuffer.makeStringAndClear() );
+ 
+             xHandler->ignorableWhitespace ( sWhiteSpace );
+diff --git a/package/source/manifest/ManifestImport.cxx b/package/source/manifest/ManifestImport.cxx
+index 01cf6a5..8756081 100644
+--- a/package/source/manifest/ManifestImport.cxx
++++ b/package/source/manifest/ManifestImport.cxx
+@@ -29,7 +29,7 @@
+ // MARKER( update_precomp.py ): autogen include statement, do not remove
+ #include <ManifestImport.hxx>
+ #include <ManifestDefines.hxx>
+-#include <Base64Codec.hxx>
++#include <sax/tools/converter.hxx>
+ #include <com/sun/star/xml/sax/XAttributeList.hpp>
+ #include <com/sun/star/xml/crypto/DigestID.hpp>
+ #include <com/sun/star/xml/crypto/CipherID.hpp>
+@@ -188,7 +188,7 @@ void SAL_CALL ManifestImport::startElement( const OUString& aName, const uno::Re
+                     {
+                         aString = aConvertedAttribs[sChecksumAttribute];
+                         uno::Sequence < sal_Int8 > aDecodeBuffer;
+-                        Base64Codec::decodeBase64( aDecodeBuffer, aString );
++                        ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+                         aSequence[nNumProperty].Name = sDigestProperty;
+                         aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+                     }
+@@ -235,7 +235,7 @@ void SAL_CALL ManifestImport::startElement( const OUString& aName, const uno::Re
+                     {
+                         aString = aConvertedAttribs[sInitialisationVectorAttribute];
+                         uno::Sequence < sal_Int8 > aDecodeBuffer;
+-                        Base64Codec::decodeBase64 ( aDecodeBuffer, aString );
++                        ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+                         aSequence[nNumProperty].Name = sInitialisationVectorProperty;
+                         aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+                     }
+@@ -250,7 +250,7 @@ void SAL_CALL ManifestImport::startElement( const OUString& aName, const uno::Re
+                     {
+                         aString = aConvertedAttribs[sSaltAttribute];
+                         uno::Sequence < sal_Int8 > aDecodeBuffer;
+-                        Base64Codec::decodeBase64 ( aDecodeBuffer, aString );
++                        ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+                         aSequence[nNumProperty].Name = sSaltProperty;
+                         aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+ 
+--
+cgit v0.9.0.2-2-gbebe
+
+From 78f614e5fff70d4874322255cca739f430865f0a Mon Sep 17 00:00:00 2001
+From: Caolán McNamara <caolanm@redhat.com>
+Date: Mon, 28 May 2012 09:33:40 +0000
+Subject: check key size
+
+Change-Id: Ia909b0abb3ef84a9f0a14d42379f693ae9e70812
+---
+diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx
+index 16d5a00..f154dfe 100644
+--- a/package/source/zipapi/ZipFile.cxx
++++ b/package/source/zipapi/ZipFile.cxx
+@@ -157,6 +157,12 @@ uno::Reference< xml::crypto::XCipherContext > ZipFile::StaticGetCipher( const un
+ 
+     try
+     {
++        if (xEncryptionData->m_nDerivedKeySize < 0)
++        {
++            throw ZipIOException( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid derived key length!") ),
++                                  uno::Reference< XInterface >() );
++        }
++
+         uno::Sequence< sal_Int8 > aDerivedKey( xEncryptionData->m_nDerivedKeySize );
+         if ( rtl_Digest_E_None != rtl_digest_PBKDF2( reinterpret_cast< sal_uInt8* >( aDerivedKey.getArray() ),
+                             aDerivedKey.getLength(),
+@@ -192,7 +198,7 @@ uno::Reference< xml::crypto::XCipherContext > ZipFile::StaticGetCipher( const un
+                                   uno::Reference< XInterface >() );
+         }
+     }
+-    catch( uno::Exception& )
++    catch( ... )
+     {
+         OSL_ENSURE( sal_False, "Can not create cipher context!" );
+     }
+@@ -699,7 +705,7 @@ sal_Bool ZipFile::readLOC( ZipEntry &rEntry )
+                         || rEntry.nPathLen != nPathLen
+                         || !rEntry.sPath.equals( sLOCPath );
+     }
+-    catch(::std::bad_alloc &)
++    catch(...)
+     {
+         bBroken = sal_True;
+     }
+--
+cgit v0.9.0.2-2-gbebe
+
+From acc613a3236c61c8272bde1eadca5d8bf25f98f1 Mon Sep 17 00:00:00 2001
+From: Caolán McNamara <caolanm@redhat.com>
+Date: Mon, 28 May 2012 09:35:31 +0000
+Subject: unwind manifest xml parser and follow tag hierarchy model
+
+so we validate that each tag is inside the right parent
+
+Change-Id: Ibc82aeaf6b409ef2fed7de0cd8f15c164da65e53
+---
+diff --git a/package/source/manifest/ManifestImport.cxx b/package/source/manifest/ManifestImport.cxx
+index 5e9a310..f8590fe 100644
+--- a/package/source/manifest/ManifestImport.cxx
++++ b/package/source/manifest/ManifestImport.cxx
+@@ -123,177 +123,229 @@ void SAL_CALL ManifestImport::endDocument(  )
+ {
+ }
+ 
+-// ---------------------------------------------------
+-void SAL_CALL ManifestImport::startElement( const OUString& aName, const uno::Reference< xml::sax::XAttributeList >& xAttribs )
+-        throw( xml::sax::SAXException, uno::RuntimeException )
++void ManifestImport::doFileEntry(StringHashMap &rConvertedAttribs)
++        throw( uno::RuntimeException )
+ {
+-    StringHashMap aConvertedAttribs;
+-    ::rtl::OUString aConvertedName = PushNameAndNamespaces( aName, xAttribs, aConvertedAttribs );
++    aSequence.realloc ( PKG_SIZE_ENCR_MNFST );
+ 
+-    if ( aConvertedName == sFileEntryElement )
++    // Put full-path property first for MBA
++    aSequence[nNumProperty].Name = sFullPathProperty;
++    aSequence[nNumProperty++].Value <<= rConvertedAttribs[sFullPathAttribute];
++    aSequence[nNumProperty].Name = sMediaTypeProperty;
++    aSequence[nNumProperty++].Value <<= rConvertedAttribs[sMediaTypeAttribute];
++
++    OUString sVersion = rConvertedAttribs[sVersionAttribute];
++    if ( sVersion.getLength() )
+     {
+-        aSequence.realloc ( PKG_SIZE_ENCR_MNFST );
++        aSequence[nNumProperty].Name = sVersionProperty;
++        aSequence[nNumProperty++].Value <<= sVersion;
++    }
+ 
+-        // Put full-path property first for MBA
+-        aSequence[nNumProperty].Name = sFullPathProperty;
+-        aSequence[nNumProperty++].Value <<= aConvertedAttribs[sFullPathAttribute];
+-        aSequence[nNumProperty].Name = sMediaTypeProperty;
+-        aSequence[nNumProperty++].Value <<= aConvertedAttribs[sMediaTypeAttribute];
++    OUString sSize = rConvertedAttribs[sSizeAttribute];
++    if ( sSize.getLength() )
++    {
++        sal_Int32 nSize;
++        nSize = sSize.toInt32();
++        aSequence[nNumProperty].Name = sSizeProperty;
++        aSequence[nNumProperty++].Value <<= nSize;
++    }
++}
+ 
+-        OUString sVersion = aConvertedAttribs[sVersionAttribute];
+-        if ( sVersion.getLength() )
++void ManifestImport::doEncryptionData(StringHashMap &rConvertedAttribs)
++        throw( uno::RuntimeException )
++{
++    // If this element exists, then this stream is encrypted and we need
++    // to import the initialisation vector, salt and iteration count used
++    nDerivedKeySize = 0;
++    OUString aString = rConvertedAttribs[sChecksumTypeAttribute];
++    if ( !bIgnoreEncryptData )
++    {
++        if ( aString.equals( sSHA1_1k_Name ) || aString.equals( sSHA1_1k_URL ) )
++        {
++            aSequence[nNumProperty].Name = sDigestAlgProperty;
++            aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA1_1K;
++        }
++        else if ( aString.equals( sSHA256_1k_URL ) )
+         {
+-            aSequence[nNumProperty].Name = sVersionProperty;
+-            aSequence[nNumProperty++].Value <<= sVersion;
++            aSequence[nNumProperty].Name = sDigestAlgProperty;
++            aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA256_1K;
+         }
++        else
++            bIgnoreEncryptData = sal_True;
+ 
+-        OUString sSize = aConvertedAttribs[sSizeAttribute];
+-        if ( sSize.getLength() )
++        if ( !bIgnoreEncryptData )
+         {
+-            sal_Int32 nSize;
+-            nSize = sSize.toInt32();
+-            aSequence[nNumProperty].Name = sSizeProperty;
+-            aSequence[nNumProperty++].Value <<= nSize;
++            aString = rConvertedAttribs[sChecksumAttribute];
++            uno::Sequence < sal_Int8 > aDecodeBuffer;
++            ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
++            aSequence[nNumProperty].Name = sDigestProperty;
++            aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+         }
+     }
+-    else if ( aStack.size() > 1 )
++}
++
++void ManifestImport::doAlgorithm(StringHashMap &rConvertedAttribs)
++        throw( uno::RuntimeException )
++{
++    if ( !bIgnoreEncryptData )
+     {
+-        ManifestStack::reverse_iterator aIter = aStack.rbegin();
+-        ++aIter;
++        OUString aString = rConvertedAttribs[sAlgorithmNameAttribute];
++        if ( aString.equals( sBlowfish_Name ) || aString.equals( sBlowfish_URL ) )
++        {
++            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
++            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8;
++        }
++        else if ( aString.equals( sAES256_URL ) )
++        {
++            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
++            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
++            OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 32, "Unexpected derived key length!" );
++            nDerivedKeySize = 32;
++        }
++        else if ( aString.equals( sAES192_URL ) )
++        {
++            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
++            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
++            OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 24, "Unexpected derived key length!" );
++            nDerivedKeySize = 24;
++        }
++        else if ( aString.equals( sAES128_URL ) )
++        {
++            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
++            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
++            OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 16, "Unexpected derived key length!" );
++            nDerivedKeySize = 16;
++        }
++        else
++            bIgnoreEncryptData = sal_True;
+ 
+-        if ( aIter->m_aConvertedName.equals( sFileEntryElement ) )
++        if ( !bIgnoreEncryptData )
+         {
+-            if ( aConvertedName.equals( sEncryptionDataElement ) )
+-            {
+-                // If this element exists, then this stream is encrypted and we need
+-                // to import the initialisation vector, salt and iteration count used
+-                nDerivedKeySize = 0;
+-                OUString aString = aConvertedAttribs[sChecksumTypeAttribute];
+-                if ( !bIgnoreEncryptData )
+-                {
+-                    if ( aString.equals( sSHA1_1k_Name ) || aString.equals( sSHA1_1k_URL ) )
+-                    {
+-                        aSequence[nNumProperty].Name = sDigestAlgProperty;
+-                        aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA1_1K;
+-                    }
+-                    else if ( aString.equals( sSHA256_1k_URL ) )
+-                    {
+-                        aSequence[nNumProperty].Name = sDigestAlgProperty;
+-                        aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA256_1K;
+-                    }
+-                    else
+-                        bIgnoreEncryptData = sal_True;
+-
+-                    if ( !bIgnoreEncryptData )
+-                    {
+-                        aString = aConvertedAttribs[sChecksumAttribute];
+-                        uno::Sequence < sal_Int8 > aDecodeBuffer;
+-                        ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+-                        aSequence[nNumProperty].Name = sDigestProperty;
+-                        aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+-                    }
+-                }
+-            }
++            aString = rConvertedAttribs[sInitialisationVectorAttribute];
++            uno::Sequence < sal_Int8 > aDecodeBuffer;
++            ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
++            aSequence[nNumProperty].Name = sInitialisationVectorProperty;
++            aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+         }
+-        else if ( aIter->m_aConvertedName.equals( sEncryptionDataElement ) )
++    }
++}
++
++void ManifestImport::doKeyDerivation(StringHashMap &rConvertedAttribs)
++        throw( uno::RuntimeException )
++{
++    if ( !bIgnoreEncryptData )
++    {
++        OUString aString = rConvertedAttribs[sKeyDerivationNameAttribute];
++        if ( aString.equals( sPBKDF2_Name ) || aString.equals( sPBKDF2_URL ) )
+         {
+-            if ( aConvertedName == sAlgorithmElement )
+-            {
+-                if ( !bIgnoreEncryptData )
+-                {
+-                    OUString aString = aConvertedAttribs[sAlgorithmNameAttribute];
+-                    if ( aString.equals( sBlowfish_Name ) || aString.equals( sBlowfish_URL ) )
+-                    {
+-                        aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-                        aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8;
+-                    }
+-                    else if ( aString.equals( sAES256_URL ) )
+-                    {
+-                        aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-                        aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+-                        OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 32, "Unexpected derived key length!" );
+-                        nDerivedKeySize = 32;
+-                    }
+-                    else if ( aString.equals( sAES192_URL ) )
+-                    {
+-                        aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-                        aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+-                        OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 24, "Unexpected derived key length!" );
+-                        nDerivedKeySize = 24;
+-                    }
+-                    else if ( aString.equals( sAES128_URL ) )
+-                    {
+-                        aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-                        aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+-                        OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 16, "Unexpected derived key length!" );
+-                        nDerivedKeySize = 16;
+-                    }
+-                    else
+-                        bIgnoreEncryptData = sal_True;
+-
+-                    if ( !bIgnoreEncryptData )
+-                    {
+-                        aString = aConvertedAttribs[sInitialisationVectorAttribute];
+-                        uno::Sequence < sal_Int8 > aDecodeBuffer;
+-                        ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+-                        aSequence[nNumProperty].Name = sInitialisationVectorProperty;
+-                        aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+-                    }
+-                }
+-            }
+-            else if ( aConvertedName == sKeyDerivationElement )
++            aString = rConvertedAttribs[sSaltAttribute];
++            uno::Sequence < sal_Int8 > aDecodeBuffer;
++            ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
++            aSequence[nNumProperty].Name = sSaltProperty;
++            aSequence[nNumProperty++].Value <<= aDecodeBuffer;
++
++            aString = rConvertedAttribs[sIterationCountAttribute];
++            aSequence[nNumProperty].Name = sIterationCountProperty;
++            aSequence[nNumProperty++].Value <<= aString.toInt32();
++
++            aString = rConvertedAttribs[sKeySizeAttribute];
++            if ( aString.getLength() )
+             {
+-                if ( !bIgnoreEncryptData )
+-                {
+-                    OUString aString = aConvertedAttribs[sKeyDerivationNameAttribute];
+-                    if ( aString.equals( sPBKDF2_Name ) || aString.equals( sPBKDF2_URL ) )
+-                    {
+-                        aString = aConvertedAttribs[sSaltAttribute];
+-                        uno::Sequence < sal_Int8 > aDecodeBuffer;
+-                        ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+-                        aSequence[nNumProperty].Name = sSaltProperty;
+-                        aSequence[nNumProperty++].Value <<= aDecodeBuffer;
+-
+-                        aString = aConvertedAttribs[sIterationCountAttribute];
+-                        aSequence[nNumProperty].Name = sIterationCountProperty;
+-                        aSequence[nNumProperty++].Value <<= aString.toInt32();
+-
+-                        aString = aConvertedAttribs[sKeySizeAttribute];
+-                        if ( aString.getLength() )
+-                        {
+-                            sal_Int32 nKey = aString.toInt32();
+-                            OSL_ENSURE( !nDerivedKeySize || nKey == nDerivedKeySize , "Provided derived key length differs from the expected one!" );
+-                            nDerivedKeySize = nKey;
+-                        }
+-                        else if ( !nDerivedKeySize )
+-                            nDerivedKeySize = 16;
+-                        else if ( nDerivedKeySize != 16 )
+-                            OSL_ENSURE( sal_False, "Default derived key length differs from the expected one!" );
+-
+-                        aSequence[nNumProperty].Name = sDerivedKeySizeProperty;
+-                        aSequence[nNumProperty++].Value <<= nDerivedKeySize;
+-                    }
+-                    else
+-                        bIgnoreEncryptData = sal_True;
+-                }
+-            }
+-            else if ( aConvertedName == sStartKeyAlgElement )
+-            {
+-                OUString aString = aConvertedAttribs[sStartKeyAlgNameAttribute];
+-                if ( aString.equals( sSHA256_URL ) )
+-                {
+-                    aSequence[nNumProperty].Name = sStartKeyAlgProperty;
+-                    aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA256;
+-                }
+-                else if ( aString.equals( sSHA1_Name ) || aString.equals( sSHA1_URL ) )
+-                {
+-                    aSequence[nNumProperty].Name = sStartKeyAlgProperty;
+-                    aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA1;
+-                }
+-                else
+-                    bIgnoreEncryptData = sal_True;
++                sal_Int32 nKey = aString.toInt32();
++                OSL_ENSURE( !nDerivedKeySize || nKey == nDerivedKeySize , "Provided derived key length differs from the expected one!" );
++                nDerivedKeySize = nKey;
+             }
++            else if ( !nDerivedKeySize )
++                nDerivedKeySize = 16;
++            else if ( nDerivedKeySize != 16 )
++                OSL_ENSURE( sal_False, "Default derived key length differs from the expected one!" );
++
++            aSequence[nNumProperty].Name = sDerivedKeySizeProperty;
++            aSequence[nNumProperty++].Value <<= nDerivedKeySize;
++        }
++        else
++            bIgnoreEncryptData = sal_True;
++    }
++}
++
++void ManifestImport::doStartKeyAlg(StringHashMap &rConvertedAttribs)
++        throw( uno::RuntimeException )
++{
++    OUString aString = rConvertedAttribs[sStartKeyAlgNameAttribute];
++    if ( aString.equals( sSHA256_URL ) )
++    {
++        aSequence[nNumProperty].Name = sStartKeyAlgProperty;
++        aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA256;
++    }
++    else if ( aString.equals( sSHA1_Name ) || aString.equals( sSHA1_URL ) )
++    {
++        aSequence[nNumProperty].Name = sStartKeyAlgProperty;
++        aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA1;
++    }
++    else
++        bIgnoreEncryptData = sal_True;
++}
++
++// ---------------------------------------------------
++void SAL_CALL ManifestImport::startElement( const OUString& aName, const uno::Reference< xml::sax::XAttributeList >& xAttribs )
++        throw( xml::sax::SAXException, uno::RuntimeException )
++{
++    StringHashMap aConvertedAttribs;
++    ::rtl::OUString aConvertedName = PushNameAndNamespaces( aName, xAttribs, aConvertedAttribs );
++
++    size_t nLevel = aStack.size();
++
++    assert(nLevel >= 1);
++
++    switch (nLevel)
++    {
++        case 1:
++        {
++            if (!aConvertedName.equalsAscii(ELEMENT_MANIFEST)) //manifest:manifest
++                aStack.back().m_bValid = false;
++            break;
++        }
++        case 2:
++        {
++            if (aConvertedName == sFileEntryElement) //manifest:file-entry
++                doFileEntry(aConvertedAttribs);
++            else
++                aStack.back().m_bValid = false;
++            break;
++        }
++        case 3:
++        {
++            ManifestStack::reverse_iterator aIter = aStack.rbegin();
++            ++aIter;
++
++            if (!aIter->m_bValid)
++                aStack.back().m_bValid = false;
++            else if (aConvertedName.equals(sEncryptionDataElement))   //manifest:encryption-data
++                doEncryptionData(aConvertedAttribs);
++            else
++                aStack.back().m_bValid = false;
++            break;
++        }
++        case 4:
++        {
++            ManifestStack::reverse_iterator aIter = aStack.rbegin();
++            ++aIter;
++
++            if (!aIter->m_bValid)
++                aStack.back().m_bValid = false;
++            else if (aConvertedName.equals(sAlgorithmElement))   //manifest:algorithm,
++                doAlgorithm(aConvertedAttribs);
++            else if (aConvertedName.equals(sKeyDerivationElement)) //manifest:key-derivation,
++                doKeyDerivation(aConvertedAttribs);
++            else if (aConvertedName.equals(sStartKeyAlgElement))   //manifest:start-key-generation
++                doStartKeyAlg(aConvertedAttribs);
++            else
++                aStack.back().m_bValid = false;
++            break;
+         }
++        default:
++            aStack.back().m_bValid = false;
++            break;
+     }
+ }
+ 
+diff --git a/package/source/manifest/ManifestImport.hxx b/package/source/manifest/ManifestImport.hxx
+index 1c646a7..5681f45 100644
+--- a/package/source/manifest/ManifestImport.hxx
++++ b/package/source/manifest/ManifestImport.hxx
+@@ -46,10 +46,12 @@ struct ManifestScopeEntry
+ {
+     ::rtl::OUString m_aConvertedName;
+     StringHashMap   m_aNamespaces;
++    bool            m_bValid;
+ 
+     ManifestScopeEntry( const ::rtl::OUString& aConvertedName, const StringHashMap& aNamespaces )
+     : m_aConvertedName( aConvertedName )
+     , m_aNamespaces( aNamespaces )
++    , m_bValid( true )
+     {}
+ 
+     ~ManifestScopeEntry()
+@@ -148,6 +150,12 @@ public:
+         throw(::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
+     virtual void SAL_CALL setDocumentLocator( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >& xLocator )
+         throw(::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException);
++private:
++    void doFileEntry(StringHashMap &rConvertedAttribs) throw(::com::sun::star::uno::RuntimeException);
++    void doEncryptionData(StringHashMap &rConvertedAttribs) throw(::com::sun::star::uno::RuntimeException);
++    void doAlgorithm(StringHashMap &rConvertedAttribs) throw(::com::sun::star::uno::RuntimeException);
++    void doKeyDerivation(StringHashMap &rConvertedAttribs) throw(::com::sun::star::uno::RuntimeException);
++    void doStartKeyAlg(StringHashMap &rConvertedAttribs) throw(::com::sun::star::uno::RuntimeException);
+ };
+ #endif
+ 
+--
+cgit v0.9.0.2-2-gbebe
+
+From 4a7164429b727bd8fd6f183950e85e6225869364 Mon Sep 17 00:00:00 2001
+From: Caolán McNamara <caolanm@redhat.com>
+Date: Mon, 28 May 2012 10:43:09 +0000
+Subject: count and order of receipt of properties doesn't matter
+
+so stick imported properties into assigned slots and throw out empty ones when
+finished. Reuse existing ids for this between import and export. Shuffle
+FULLPATH to 0 as per import comment
+
+Change-Id: I516116c5327498ad043f6e2fb9bd257599ade2a2
+---
+diff --git a/package/inc/PackageConstants.hxx b/package/inc/PackageConstants.hxx
+index be82010..7590acd 100644
+--- a/package/inc/PackageConstants.hxx
++++ b/package/inc/PackageConstants.hxx
+@@ -40,19 +40,19 @@ const sal_Int32 n_ConstDigestLength = 1024;
+ const sal_Int32 n_ConstDigestDecrypt = 1056; // 1024 + 32
+ 
+ // the constants related to the manifest.xml entries
+-#define PKG_MNFST_MEDIATYPE   0
+-#define PKG_MNFST_VERSION     1
+-#define PKG_MNFST_FULLPATH    2
++#define PKG_MNFST_FULLPATH    0 //FullPath (Put full-path property first for MBA)
++#define PKG_MNFST_VERSION     1 //Version
++#define PKG_MNFST_MEDIATYPE   2 //MediaType
+ 
+-#define PKG_MNFST_INIVECTOR   3
+-#define PKG_MNFST_SALT        4
+-#define PKG_MNFST_ITERATION   5
+-#define PKG_MNFST_UCOMPSIZE   6
+-#define PKG_MNFST_DIGEST      7
+-#define PKG_MNFST_ENCALG      8
+-#define PKG_MNFST_STARTALG    9
+-#define PKG_MNFST_DIGESTALG  10
+-#define PKG_MNFST_DERKEYSIZE 11
++#define PKG_MNFST_INIVECTOR   3 //InitialisationVector
++#define PKG_MNFST_SALT        4 //Salt
++#define PKG_MNFST_ITERATION   5 //IterationCount
++#define PKG_MNFST_UCOMPSIZE   6 //Size
++#define PKG_MNFST_DIGEST      7 //Digest
++#define PKG_MNFST_ENCALG      8 //EncryptionAlgorithm
++#define PKG_MNFST_STARTALG    9 //StartKeyAlgorithm
++#define PKG_MNFST_DIGESTALG  10 //DigestAlgorithm
++#define PKG_MNFST_DERKEYSIZE 11 //DerivedKeySize
+ 
+ #define PKG_SIZE_NOENCR_MNFST 3
+ #define PKG_SIZE_ENCR_MNFST   12
+diff --git a/package/source/manifest/ManifestImport.cxx b/package/source/manifest/ManifestImport.cxx
+index f8590fe..ac6c3ef 100644
+--- a/package/source/manifest/ManifestImport.cxx
++++ b/package/source/manifest/ManifestImport.cxx
+@@ -44,8 +44,7 @@ using ::rtl::OUString;
+ 
+ // ---------------------------------------------------
+ ManifestImport::ManifestImport( vector < Sequence < PropertyValue > > & rNewManVector )
+-: nNumProperty ( 0 )
+-, bIgnoreEncryptData    ( sal_False )
++: bIgnoreEncryptData    ( sal_False )
+ , nDerivedKeySize( 0 )
+ , rManVector ( rNewManVector )
+ 
+@@ -126,28 +125,26 @@ void SAL_CALL ManifestImport::endDocument(  )
+ void ManifestImport::doFileEntry(StringHashMap &rConvertedAttribs)
+         throw( uno::RuntimeException )
+ {
+-    aSequence.realloc ( PKG_SIZE_ENCR_MNFST );
++    aSequence.resize(PKG_SIZE_ENCR_MNFST);
+ 
+-    // Put full-path property first for MBA
+-    aSequence[nNumProperty].Name = sFullPathProperty;
+-    aSequence[nNumProperty++].Value <<= rConvertedAttribs[sFullPathAttribute];
+-    aSequence[nNumProperty].Name = sMediaTypeProperty;
+-    aSequence[nNumProperty++].Value <<= rConvertedAttribs[sMediaTypeAttribute];
++    aSequence[PKG_MNFST_FULLPATH].Name = sFullPathProperty;
++    aSequence[PKG_MNFST_FULLPATH].Value <<= rConvertedAttribs[sFullPathAttribute];
++    aSequence[PKG_MNFST_MEDIATYPE].Name = sMediaTypeProperty;
++    aSequence[PKG_MNFST_MEDIATYPE].Value <<= rConvertedAttribs[sMediaTypeAttribute];
+ 
+     OUString sVersion = rConvertedAttribs[sVersionAttribute];
+     if ( sVersion.getLength() )
+     {
+-        aSequence[nNumProperty].Name = sVersionProperty;
+-        aSequence[nNumProperty++].Value <<= sVersion;
++        aSequence[PKG_MNFST_VERSION].Name = sVersionProperty;
++        aSequence[PKG_MNFST_VERSION].Value <<= sVersion;
+     }
+ 
+     OUString sSize = rConvertedAttribs[sSizeAttribute];
+     if ( sSize.getLength() )
+     {
+-        sal_Int32 nSize;
+-        nSize = sSize.toInt32();
+-        aSequence[nNumProperty].Name = sSizeProperty;
+-        aSequence[nNumProperty++].Value <<= nSize;
++        sal_Int32 nSize = sSize.toInt32();
++        aSequence[PKG_MNFST_UCOMPSIZE].Name = sSizeProperty;
++        aSequence[PKG_MNFST_UCOMPSIZE].Value <<= nSize;
+     }
+ }
+ 
+@@ -162,13 +159,13 @@ void ManifestImport::doEncryptionData(StringHashMap &rConvertedAttribs)
+     {
+         if ( aString.equals( sSHA1_1k_Name ) || aString.equals( sSHA1_1k_URL ) )
+         {
+-            aSequence[nNumProperty].Name = sDigestAlgProperty;
+-            aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA1_1K;
++            aSequence[PKG_MNFST_DIGESTALG].Name = sDigestAlgProperty;
++            aSequence[PKG_MNFST_DIGESTALG].Value <<= xml::crypto::DigestID::SHA1_1K;
+         }
+         else if ( aString.equals( sSHA256_1k_URL ) )
+         {
+-            aSequence[nNumProperty].Name = sDigestAlgProperty;
+-            aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA256_1K;
++            aSequence[PKG_MNFST_DIGESTALG].Name = sDigestAlgProperty;
++            aSequence[PKG_MNFST_DIGESTALG].Value <<= xml::crypto::DigestID::SHA256_1K;
+         }
+         else
+             bIgnoreEncryptData = sal_True;
+@@ -178,8 +175,8 @@ void ManifestImport::doEncryptionData(StringHashMap &rConvertedAttribs)
+             aString = rConvertedAttribs[sChecksumAttribute];
+             uno::Sequence < sal_Int8 > aDecodeBuffer;
+             ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+-            aSequence[nNumProperty].Name = sDigestProperty;
+-            aSequence[nNumProperty++].Value <<= aDecodeBuffer;
++            aSequence[PKG_MNFST_DIGEST].Name = sDigestProperty;
++            aSequence[PKG_MNFST_DIGEST].Value <<= aDecodeBuffer;
+         }
+     }
+ }
+@@ -192,27 +189,27 @@ void ManifestImport::doAlgorithm(StringHashMap &rConvertedAttribs)
+         OUString aString = rConvertedAttribs[sAlgorithmNameAttribute];
+         if ( aString.equals( sBlowfish_Name ) || aString.equals( sBlowfish_URL ) )
+         {
+-            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8;
++            aSequence[PKG_MNFST_ENCALG].Name = sEncryptionAlgProperty;
++            aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::BLOWFISH_CFB_8;
+         }
+         else if ( aString.equals( sAES256_URL ) )
+         {
+-            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
++            aSequence[PKG_MNFST_ENCALG].Name = sEncryptionAlgProperty;
++            aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+             OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 32, "Unexpected derived key length!" );
+             nDerivedKeySize = 32;
+         }
+         else if ( aString.equals( sAES192_URL ) )
+         {
+-            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
++            aSequence[PKG_MNFST_ENCALG].Name = sEncryptionAlgProperty;
++            aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+             OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 24, "Unexpected derived key length!" );
+             nDerivedKeySize = 24;
+         }
+         else if ( aString.equals( sAES128_URL ) )
+         {
+-            aSequence[nNumProperty].Name = sEncryptionAlgProperty;
+-            aSequence[nNumProperty++].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
++            aSequence[PKG_MNFST_ENCALG].Name = sEncryptionAlgProperty;
++            aSequence[PKG_MNFST_ENCALG].Value <<= xml::crypto::CipherID::AES_CBC_W3C_PADDING;
+             OSL_ENSURE( !nDerivedKeySize || nDerivedKeySize == 16, "Unexpected derived key length!" );
+             nDerivedKeySize = 16;
+         }
+@@ -224,8 +221,8 @@ void ManifestImport::doAlgorithm(StringHashMap &rConvertedAttribs)
+             aString = rConvertedAttribs[sInitialisationVectorAttribute];
+             uno::Sequence < sal_Int8 > aDecodeBuffer;
+             ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+-            aSequence[nNumProperty].Name = sInitialisationVectorProperty;
+-            aSequence[nNumProperty++].Value <<= aDecodeBuffer;
++            aSequence[PKG_MNFST_INIVECTOR].Name = sInitialisationVectorProperty;
++            aSequence[PKG_MNFST_INIVECTOR].Value <<= aDecodeBuffer;
+         }
+     }
+ }
+@@ -241,12 +238,12 @@ void ManifestImport::doKeyDerivation(StringHashMap &rConvertedAttribs)
+             aString = rConvertedAttribs[sSaltAttribute];
+             uno::Sequence < sal_Int8 > aDecodeBuffer;
+             ::sax::Converter::decodeBase64(aDecodeBuffer, aString);
+-            aSequence[nNumProperty].Name = sSaltProperty;
+-            aSequence[nNumProperty++].Value <<= aDecodeBuffer;
++            aSequence[PKG_MNFST_SALT].Name = sSaltProperty;
++            aSequence[PKG_MNFST_SALT].Value <<= aDecodeBuffer;
+ 
+             aString = rConvertedAttribs[sIterationCountAttribute];
+-            aSequence[nNumProperty].Name = sIterationCountProperty;
+-            aSequence[nNumProperty++].Value <<= aString.toInt32();
++            aSequence[PKG_MNFST_ITERATION].Name = sIterationCountProperty;
++            aSequence[PKG_MNFST_ITERATION].Value <<= aString.toInt32();
+ 
+             aString = rConvertedAttribs[sKeySizeAttribute];
+             if ( aString.getLength() )
+@@ -260,8 +257,8 @@ void ManifestImport::doKeyDerivation(StringHashMap &rConvertedAttribs)
+             else if ( nDerivedKeySize != 16 )
+                 OSL_ENSURE( sal_False, "Default derived key length differs from the expected one!" );
+ 
+-            aSequence[nNumProperty].Name = sDerivedKeySizeProperty;
+-            aSequence[nNumProperty++].Value <<= nDerivedKeySize;
++            aSequence[PKG_MNFST_DERKEYSIZE].Name = sDerivedKeySizeProperty;
++            aSequence[PKG_MNFST_DERKEYSIZE].Value <<= nDerivedKeySize;
+         }
+         else
+             bIgnoreEncryptData = sal_True;
+@@ -274,13 +271,13 @@ void ManifestImport::doStartKeyAlg(StringHashMap &rConvertedAttribs)
+     OUString aString = rConvertedAttribs[sStartKeyAlgNameAttribute];
+     if ( aString.equals( sSHA256_URL ) )
+     {
+-        aSequence[nNumProperty].Name = sStartKeyAlgProperty;
+-        aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA256;
++        aSequence[PKG_MNFST_STARTALG].Name = sStartKeyAlgProperty;
++        aSequence[PKG_MNFST_STARTALG].Value <<= xml::crypto::DigestID::SHA256;
+     }
+     else if ( aString.equals( sSHA1_Name ) || aString.equals( sSHA1_URL ) )
+     {
+-        aSequence[nNumProperty].Name = sStartKeyAlgProperty;
+-        aSequence[nNumProperty++].Value <<= xml::crypto::DigestID::SHA1;
++        aSequence[PKG_MNFST_STARTALG].Name = sStartKeyAlgProperty;
++        aSequence[PKG_MNFST_STARTALG].Value <<= xml::crypto::DigestID::SHA1;
+     }
+     else
+         bIgnoreEncryptData = sal_True;
+@@ -349,6 +346,14 @@ void SAL_CALL ManifestImport::startElement( const OUString& aName, const uno::Re
+     }
+ }
+ 
++namespace
++{
++    bool isEmpty(const com::sun::star::beans::PropertyValue &rProp)
++    {
++        return rProp.Name.isEmpty();
++    }
++}
++
+ // ---------------------------------------------------
+ void SAL_CALL ManifestImport::endElement( const OUString& aName )
+     throw( xml::sax::SAXException, uno::RuntimeException )
+@@ -356,12 +361,16 @@ void SAL_CALL ManifestImport::endElement( const OUString& aName )
+     ::rtl::OUString aConvertedName = ConvertName( aName );
+     if ( !aStack.empty() && aStack.rbegin()->m_aConvertedName.equals( aConvertedName ) )
+     {
+-        if ( aConvertedName.equals( sFileEntryElement ) )
++        if ( aConvertedName.equals( sFileEntryElement ) && aStack.back().m_bValid )
+         {
+-            aSequence.realloc ( nNumProperty );
++            com::sun::star::beans::PropertyValue aEmpty;
++            aSequence.erase(std::remove_if(aSequence.begin(), aSequence.end(),
++                isEmpty), aSequence.end());
++
+             bIgnoreEncryptData = sal_False;
+-            rManVector.push_back ( aSequence );
+-            nNumProperty = 0;
++            rManVector.push_back ( aSequence.getAsConstList() );
++
++            aSequence.clear();
+         }
+ 
+         aStack.pop_back();
+diff --git a/package/source/manifest/ManifestImport.hxx b/package/source/manifest/ManifestImport.hxx
+index 5681f45..68afefd 100644
+--- a/package/source/manifest/ManifestImport.hxx
++++ b/package/source/manifest/ManifestImport.hxx
+@@ -31,6 +31,7 @@
+ 
+ #include <cppuhelper/implbase1.hxx> // helper for implementations
+ #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
++#include <comphelper/sequenceasvector.hxx>
+ #include <vector>
+ 
+ #include <HashMaps.hxx>
+@@ -63,8 +64,7 @@ typedef ::std::vector< ManifestScopeEntry > ManifestStack;
+ class ManifestImport : public cppu::WeakImplHelper1 < com::sun::star::xml::sax::XDocumentHandler >
+ {
+ protected:
+-    com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue > aSequence;
+-    sal_Int16       nNumProperty;
++    comphelper::SequenceAsVector< com::sun::star::beans::PropertyValue > aSequence;
+     ManifestStack aStack;
+     sal_Bool bIgnoreEncryptData;
+     sal_Int32 nDerivedKeySize;
+--
+cgit v0.9.0.2-2-gbebe
diff -Nru libreoffice-3.5.4/debian/patches/series libreoffice-3.5.4/debian/patches/series
--- libreoffice-3.5.4/debian/patches/series	2012-07-19 11:09:22.000000000 +0200
+++ libreoffice-3.5.4/debian/patches/series	2012-08-01 10:40:59.000000000 +0200
@@ -42,3 +42,5 @@
 fix-legacy-report-opening.diff
 evolution-3.4.diff
 CVE-2012-2334-clip-max-entries.diff
+CVE-2012-2665.diff
+CVE-2012-2665-binfilter.diff

--- End Message ---
--- Begin Message ---
On Fri, Aug  3, 2012 at 10:51:32 +0200, Rene Engelhard wrote:

> Package: release.debian.org
> Severity: normal
> User: release.debian.org@packages.debian.org
> Usertags: unblock
> 
> Please unblock package libreoffice
> 
> unblock libreoffice/1:3.5.4-7
> 
Unblocked, thanks.

Cheers,
Julien

Attachment: signature.asc
Description: Digital signature


--- End Message ---

Reply to: