diff options
Diffstat (limited to 'external/mdds')
-rw-r--r-- | external/mdds/Makefile | 7 | ||||
-rw-r--r-- | external/mdds/Module_mdds.mk | 16 | ||||
-rw-r--r-- | external/mdds/README | 4 | ||||
-rw-r--r-- | external/mdds/UnpackedTarball_mdds.mk | 21 | ||||
-rw-r--r-- | external/mdds/gcc-12-silence-use-after-free.patch.1 | 42 | ||||
-rw-r--r-- | external/mdds/use-after-free.patch | 12 |
6 files changed, 102 insertions, 0 deletions
diff --git a/external/mdds/Makefile b/external/mdds/Makefile new file mode 100644 index 0000000000..e4968cf85f --- /dev/null +++ b/external/mdds/Makefile @@ -0,0 +1,7 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- + +module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) + +include $(module_directory)/../../solenv/gbuild/partial_build.mk + +# vim: set noet sw=4 ts=4: diff --git a/external/mdds/Module_mdds.mk b/external/mdds/Module_mdds.mk new file mode 100644 index 0000000000..47745940bf --- /dev/null +++ b/external/mdds/Module_mdds.mk @@ -0,0 +1,16 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Module_Module,mdds)) + +$(eval $(call gb_Module_add_targets,mdds,\ + UnpackedTarball_mdds \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/external/mdds/README b/external/mdds/README new file mode 100644 index 0000000000..140f07baca --- /dev/null +++ b/external/mdds/README @@ -0,0 +1,4 @@ +Multi-dimensional data structure (mdds) library, available from [https://gitlab.com/mdds/mdds]. + +mdds primarily provides data structures that are used by the calc +core. diff --git a/external/mdds/UnpackedTarball_mdds.mk b/external/mdds/UnpackedTarball_mdds.mk new file mode 100644 index 0000000000..5745da0b11 --- /dev/null +++ b/external/mdds/UnpackedTarball_mdds.mk @@ -0,0 +1,21 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_UnpackedTarball_UnpackedTarball,mdds)) + +$(eval $(call gb_UnpackedTarball_set_tarball,mdds,$(MDDS_TARBALL))) + +$(eval $(call gb_UnpackedTarball_set_patchlevel,mdds,0)) + +$(eval $(call gb_UnpackedTarball_add_patches,mdds,\ + external/mdds/use-after-free.patch \ + external/mdds/gcc-12-silence-use-after-free.patch.1 \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/external/mdds/gcc-12-silence-use-after-free.patch.1 b/external/mdds/gcc-12-silence-use-after-free.patch.1 new file mode 100644 index 0000000000..3f8dd0afe0 --- /dev/null +++ b/external/mdds/gcc-12-silence-use-after-free.patch.1 @@ -0,0 +1,42 @@ +Workaround for gcc-toolset-12 on almalinux8 on a release/optimized build: +[build CXX] sc/source/core/data/column2.cxx +In file included from /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/mdds/include/mdds/flat_segment_tree.hpp:37, + from /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/sc/inc/columnspanset.hxx:16, + from /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/sc/inc/column.hxx:25, + from /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/sc/source/core/data/column2.cxx:20: +In function ‘void mdds::__st::intrusive_ptr_release(node<T>*) [with T = mdds::flat_segment_tree<int, bool>]’, + inlined from ‘boost::intrusive_ptr<T>::~intrusive_ptr() [with T = mdds::__st::node<mdds::flat_segment_tree<int, bool> >]’ at /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/boost/boost/smart_ptr/intrusive_ptr.hpp:100:44, + inlined from ‘std::pair<mdds::flat_segment_tree<Key, Value>::const_iterator, bool> mdds::flat_segment_tree<Key, Value>::insert_segment_impl(key_type, key_type, value_type, bool) [with Key = int; Value = bool]’ at /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/mdds/include/mdds/flat_segment_tree_def.inl:225:1: +/home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/mdds/include/mdds/node.hpp:247:10: error: pointer used after ‘void operator delete(void*, std::size_t)’ [-Werror=use-after-free] + 247 | --p->refcount; + | ~~~^~~~~~~~ +In function ‘void mdds::__st::intrusive_ptr_release(node<T>*) [with T = mdds::flat_segment_tree<int, bool>]’, + inlined from ‘void mdds::__st::intrusive_ptr_release(node<T>*) [with T = mdds::flat_segment_tree<int, bool>]’ at /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/mdds/include/mdds/node.hpp:245:13, + inlined from ‘boost::intrusive_ptr<T>::~intrusive_ptr() [with T = mdds::__st::node<mdds::flat_segment_tree<int, bool> >]’ at /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/boost/boost/smart_ptr/intrusive_ptr.hpp:100:44, + inlined from ‘std::pair<mdds::flat_segment_tree<Key, Value>::const_iterator, bool> mdds::flat_segment_tree<Key, Value>::insert_segment_impl(key_type, key_type, value_type, bool) [with Key = int; Value = bool]’ at /home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/mdds/include/mdds/flat_segment_tree_def.inl:224:93: +/home/tdf/lode/jenkins/workspace/lo_gerrit/Config/linux_gcc_release_64/workdir/UnpackedTarball/mdds/include/mdds/node.hpp:249:9: note: call to ‘void operator delete(void*, std::size_t)’ here + 249 | delete p; + | ^~~~~~~~ +cc1plus: all warnings being treated as errors + +diff -ur mdds.org/include/mdds/node.hpp mdds/include/mdds/node.hpp +--- mdds.org/include/mdds/node.hpp 2023-07-24 18:27:14.427139325 +0000 ++++ mdds/include/mdds/node.hpp 2023-07-24 18:26:54.554461294 +0000 +@@ -244,9 +244,15 @@ + template<typename T> + inline void intrusive_ptr_release(node<T>* p) + { +- --p->refcount; +- if (!p->refcount) ++#if defined __GNUC__ && __GNUC__ == 12 && __GNUC_MINOR__ < 3 && !defined __clang__ ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wuse-after-free" ++#endif ++ if(--p->refcount == 0) + delete p; ++#if defined __GNUC__ && __GNUC__ == 12 && __GNUC_MINOR__ < 3 && !defined __clang__ ++#pragma GCC diagnostic pop ++#endif + } + + template<typename T> diff --git a/external/mdds/use-after-free.patch b/external/mdds/use-after-free.patch new file mode 100644 index 0000000000..981c945821 --- /dev/null +++ b/external/mdds/use-after-free.patch @@ -0,0 +1,12 @@ +--- include/mdds/flat_segment_tree_def.inl ++++ include/mdds/flat_segment_tree_def.inl +@@ -84,8 +84,8 @@ + // Move on to the next destination node, and have the next node point + // back to the previous node. + node_ptr old_node = dest_node; ++ dest_node->next->prev = old_node; + dest_node = dest_node->next; +- dest_node->prev = old_node; + + if (src_node == r.m_right_leaf.get()) + { |