summaryrefslogtreecommitdiff
path: root/unotools
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-09-12 11:51:37 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-09-12 17:40:23 +0200
commitcdf7352136f987f44e480777d302dfce9cbe3759 (patch)
treeff97d352407b876e163949c47f92a74518ccfb96 /unotools
parent96ce5bdf72fbcd4ca2907fc4ad71a038a11e2e22 (diff)
ofz: workaround memory sanitizer failure by skipping boost::locale
which seems to have started since... https://github.com/google/oss-fuzz/commit/a2be91d3f10c54f20ae651375683ae4605543a63 e.g. ==3509==WARNING: MemorySanitizer: use-of-uninitialized-value #0 0xa990506 in ~basic_string /usr/local/bin/../include/c++/v1/string:2267:9 #1 0xa990506 in ~pair /usr/local/bin/../include/c++/v1/__utility/pair.h:39:29 #2 0xa990506 in std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, boost::shared_ptr<boost::locale::localization_backend> > >::destroy(std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, boost::shared_ptr<boost::locale::localization_backend> >*) /usr/local/bin/../include/c++/v1/__memory/allocator.h:156:15 #3 0xa9899a5 in destroy<std::__1::pair<std::__1::string, boost::shared_ptr<boost::locale::localization_backend> >, void> /usr/local/bin/../include/c++/v1/__memory/allocator_traits.h:309:13 #4 0xa9899a5 in __destruct_at_end /usr/local/bin/../include/c++/v1/vector:450:9 #5 0xa9899a5 in clear /usr/local/bin/../include/c++/v1/vector:374:29 #6 0xa9899a5 in ~__vector_base /usr/local/bin/../include/c++/v1/vector:487:9 #7 0xa9899a5 in ~vector /usr/local/bin/../include/c++/v1/vector:579:5 #8 0xa9899a5 in ~impl workdir/UnpackedTarball/boost/libs/locale/src/shared/localization_backend.cpp:34:45 #9 0xa9899a5 in ~hold_ptr workdir/UnpackedTarball/boost/boost/locale/hold_ptr.hpp:36:13 #10 0xa9899a5 in boost::locale::localization_backend_manager::~localization_backend_manager() workdir/UnpackedTarball/boost/libs/locale/src/shared/localization_backend.cpp:168:9 #11 0x579edc in init workdir/UnpackedTarball/boost/libs/locale/src/shared/localization_backend.cpp:263:17 #12 0x579edc in __cxx_global_var_init workdir/UnpackedTarball/boost/libs/locale/src/shared/localization_backend.cpp:264:15 #13 0x579edc in _GLOBAL__sub_I_localization_backend.cpp workdir/UnpackedTarball/boost/libs/locale/src/shared/localization_backend.cpp #14 0xbe861ac in __libc_csu_init (/tmp/not-out/psdfuzzer+0xbe861ac) #15 0x7f1bcadc003f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2703f) #16 0x57c40d in _start (/tmp/not-out/psdfuzzer+0x57c40d) Change-Id: I14010df7c009b4c44943b0fd56688ed05569c1b4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121999 Tested-by: Caolán McNamara <caolanm@redhat.com> Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'unotools')
-rw-r--r--unotools/source/i18n/resmgr.cxx15
1 files changed, 15 insertions, 0 deletions
diff --git a/unotools/source/i18n/resmgr.cxx b/unotools/source/i18n/resmgr.cxx
index 62991153f01c..0d0a62d64b76 100644
--- a/unotools/source/i18n/resmgr.cxx
+++ b/unotools/source/i18n/resmgr.cxx
@@ -125,6 +125,11 @@ namespace Translate
auto aFind = aCache.find(sUnique);
if (aFind != aCache.end())
return aFind->second;
+#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
+ std::locale aRet(sIdentifier.getStr());
+ aCache[sUnique] = aRet;
+ return aRet;
+#else
boost::locale::generator gen;
gen.characters(boost::locale::char_facet);
gen.categories(boost::locale::message_facet | boost::locale::information_facet);
@@ -196,10 +201,14 @@ namespace Translate
aCache[sUnique] = aRet;
return aRet;
+#endif
}
OUString get(TranslateId sContextAndId, const std::locale &loc)
{
+#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
+ return createFromUtf8(sContextAndId.mpId, strlen(sContextAndId.mpId));
+#else
assert(!strchr(sContextAndId.mpId, '\004') && "should be using nget, not get");
//if it's a key id locale, generate it here
@@ -221,10 +230,15 @@ namespace Translate
result = result.replaceAll(OUString::fromUtf8("\xC3\x9F"), "ss");
}
return result;
+#endif
}
OUString nget(TranslateNId aContextSingularPlural, int n, const std::locale &loc)
{
+#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
+ const char* pForm = n == 0 ? aContextSingularPlural.mpSingular : aContextSingularPlural.mpPlural;
+ return createFromUtf8(pForm, strlen(pForm));
+#else
//if it's a key id locale, generate it here
if (std::use_facet<boost::locale::info>(loc).language() == "qtz")
{
@@ -244,6 +258,7 @@ namespace Translate
result = result.replaceAll(OUString::fromUtf8("\xC3\x9F"), "ss");
}
return result;
+#endif
}
static ResHookProc pImplResHookProc = nullptr;