...
 
Commits (26)
  • Michael Meeks's avatar
    Avoid taking address over the end of a vector if reading 0 bytes. · 2812cefd
    Michael Meeks authored
    Happens with some close frames eg.
    
    [ docbroker_001 ] TRC  #21: Incoming WebSocket data of 6 bytes: 88 80 4a 2c 44 f9  | ..J,D.|
    
        fin = true
        OpCode is Close (= 0x8)
        hasMask = true
        payloadLen = 0
        headerLen = 2 -> 6 after hasMask is taken into account.
    
    Change-Id: I0e212e4589c3cc63db16f7065dc90cd0bd539ada
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/86282Reviewed-by: default avatarAndras Timar <andras.timar@collabora.com>
    Tested-by: default avatarAndras Timar <andras.timar@collabora.com>
    2812cefd
  • Ashod Nakashian's avatar
    test: thread-safe common shared test data · 538c83ec
    Ashod Nakashian authored
    This protects against memory corruptions,
    and a cascade of issues, such as the following:
    
     Attaching to process 56245
     [New LWP 56246]
     [New LWP 56252]
     [New LWP 56253]
     [New LWP 56254]
     [New LWP 56362]
     [New LWP 56364]
     [Thread debugging using libthread_db enabled]
     Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
     0x00007fda228f7d2d in __GI___pthread_timedjoin_ex (threadid=140574279595776, thread_return=0x0, abstime=0x0, block=<optimized out>) at pthread_join_common.c:89
     89	pthread_join_common.c: No such file or directory.
    
     Thread 7 (Thread 0x7fda197fa700 (LWP 56364)):
     #0  __lll_lock_wait () at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
     #1  0x00007fda228f9023 in __GI___pthread_mutex_lock (mutex=0x55e9937567e0 <SigHandlerTrap>) at ../nptl/pthread_mutex_lock.c:78
     #2  0x000055e9934cd4fe in __gthread_mutex_lock (__mutex=0x55e9937567e0 <SigHandlerTrap>) at /usr/include/x86_64-linux-gnu/c++/7/bits/gthr-default.h:748
     #3  std::mutex::lock (this=0x55e9937567e0 <SigHandlerTrap>) at /usr/include/c++/7/bits/std_mutex.h:103
     #4  std::unique_lock<std::mutex>::lock (this=<synthetic pointer>) at /usr/include/c++/7/bits/std_mutex.h:267
     #5  std::unique_lock<std::mutex>::unique_lock (__m=..., this=<synthetic pointer>) at /usr/include/c++/7/bits/std_mutex.h:197
     #6  SigUtil::handleFatalSignal (signal=11) at common/SigUtil.cpp:214
     #7  <signal handler called>
     #8  std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_capacity (this=<optimized out>, __capacity=0) at /usr/include/c++/7/bits/basic_string.h:200
     #9  std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (__str=..., this=<optimized out>) at /usr/include/c++/7/bits/basic_string.h:542
     #10 std::_Construct<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (
         __p=<optimized out>) at /usr/include/c++/7/bits/stl_construct.h:75
     #11 std::__uninitialized_copy<false>::__uninit_copy<std::move_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*> (__result=0x7fd9f40017b0, __last=..., __first=...) at /usr/include/c++/7/bits/stl_uninitialized.h:83
     #12 std::uninitialized_copy<std::move_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*> (__result=<optimized out>, __last=..., __first=...) at /usr/include/c++/7/bits/stl_uninitialized.h:134
     #13 std::__uninitialized_copy_a<std::move_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > (__result=<optimized out>, __last=..., __first=...)
         at /usr/include/c++/7/bits/stl_uninitialized.h:289
     #14 std::__uninitialized_move_if_noexcept_a<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > (__alloc=..., __result=<optimized out>, __last=0x55e995662850,
         __first=<optimized out>) at /usr/include/c++/7/bits/stl_uninitialized.h:312
     #15 std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_realloc_insert<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> (
         this=this@entry=0x55e9937566f0 <FileUtil::getTempFilePath(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::fileDeleter>,
         __position=<error: Cannot access memory at address 0x3735003238323a>, __args#0="/tmp/loadTorture_viewcursor.odp_725a6013_viewcursor.odp") at /usr/include/c++/7/bits/vector.tcc:424
     #16 0x000055e9934aa829 in std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::push_back (__x="/tmp/loadTorture_viewcursor.odp_725a6013_viewcursor.odp",
         this=0x55e9937566f0 <FileUtil::getTempFilePath(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::fileDeleter>) at /usr/include/c++/7/bits/stl_vector.h:948
     #17 (anonymous namespace)::FileDeleter::registerForDeletion (file="/tmp/loadTorture_viewcursor.odp_725a6013_viewcursor.odp",
         this=0x55e9937566f0 <FileUtil::getTempFilePath(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::fileDeleter>) at common/FileUtil.cpp:69
     #18 FileUtil::getTempFilePath (srcDir=..., srcFilename=..., dstFilenamePrefix=...) at common/FileUtil.cpp:97
     #19 0x00007fda216b51c9 in helpers::getDocumentPathAndURL (docFilename="viewcursor.odp", documentPath="", documentURL="", prefix="loadTorture_viewcursor.odp_") at ./helpers.hpp:151
     #20 0x00007fda216ad007 in UnitLoadTorture::loadTorture (this=<optimized out>, testname="loadTorture_viewcursor.odp ", docName="viewcursor.odp", thread_count=thread_count@entry=3,
         max_jitter_ms=<optimized out>, max_jitter_ms@entry=75) at UnitLoadTorture.cpp:41
     #21 0x00007fda216ad7dd in UnitLoadTorture::<lambda()>::operator() (__closure=0x55e994dbc758) at UnitLoadTorture.cpp:186
     #22 std::__invoke_impl<void, UnitLoadTorture::testLoadTorture()::<lambda()> > (__f=...) at /usr/include/c++/7/bits/invoke.h:60
     #23 std::__invoke<UnitLoadTorture::testLoadTorture()::<lambda()> > (__fn=...) at /usr/include/c++/7/bits/invoke.h:95
     #24 std::thread::_Invoker<std::tuple<UnitLoadTorture::testLoadTorture()::<lambda()> > >::_M_invoke<0> (this=0x55e994dbc758) at /usr/include/c++/7/thread:234
     #25 std::thread::_Invoker<std::tuple<UnitLoadTorture::testLoadTorture()::<lambda()> > >::operator() (this=0x55e994dbc758) at /usr/include/c++/7/thread:243
     #26 std::thread::_State_impl<std::thread::_Invoker<std::tuple<UnitLoadTorture::testLoadTorture()::<lambda()> > > >::_M_run(void) (this=0x55e994dbc750) at /usr/include/c++/7/thread:186
     #27 0x00007fda22de366f in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
     #28 0x00007fda228f66db in start_thread (arg=0x7fda197fa700) at pthread_create.c:463
     #29 0x00007fda2261f88f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
    
     Thread 6 (Thread 0x7fd9fffff700 (LWP 56362)):
      #0  __lll_lock_wait_private () at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
     #1  0x00007fda225952db in __GI___libc_malloc (bytes=bytes@entry=3635) at malloc.c:3063
     #2  0x00007fda2262f364 in __backtrace_symbols (array=array@entry=0x7fd9ffffc540, size=size@entry=26) at backtracesyms.c:69
     #3  0x000055e9934cc439 in SigUtil::dumpBacktrace () at common/SigUtil.cpp:253
     #4  0x000055e9934cd5ae in SigUtil::handleFatalSignal (signal=6) at common/SigUtil.cpp:236
     #5  <signal handler called>
     #6  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
     #7  0x00007fda2253e801 in __GI_abort () at abort.c:79
     #8  0x00007fda22587897 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7fda226b4b9a "%s
    ") at ../sysdeps/posix/libc_fatal.c:181
     #9  0x00007fda2258e90a in malloc_printerr (str=str@entry=0x7fda226b2e0e "malloc(): memory corruption") at malloc.c:5350
     #10 0x00007fda22592994 in _int_malloc (av=av@entry=0x7fda00000020, bytes=bytes@entry=32) at malloc.c:3738
     #11 0x00007fda225952ed in __GI___libc_malloc (bytes=32) at malloc.c:3065
     #12 0x00007fda22db9258 in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
     #13 0x00007fda244adaae in __gnu_cxx::new_allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::allocate (this=0x7fd9ffffe740, __n=1)
         at /usr/include/c++/5/ext/new_allocator.h:104
     #14 0x00007fda244ad300 in __gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::allocate (__a=..., __n=1)
         at /usr/include/c++/5/ext/alloc_traits.h:182
     #15 0x00007fda244ac858 in std::_Vector_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_allocate (this=0x7fd9ffffe740, __n=1) at /usr/include/c++/5/bits/stl_vector.h:170
     #16 0x00007fda244ab7c7 in std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_insert_aux (this=0x7fd9ffffe740, __position=non-dereferenceable iterator for std::vector, __x="home") at /usr/include/c++/5/bits/vector.tcc:353
     #17 0x00007fda244aada2 in std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::push_back (this=0x7fd9ffffe740, __x="home") at /usr/include/c++/5/bits/stl_vector.h:925
     #18 0x00007fda2350ddcb in Poco::Path::pushDirectory (this=0x7fd9ffffe6c0, dir="home") at src/Path.cpp:471
     #19 0x00007fda2350ea27 in Poco::Path::parseUnix (this=0x7fd9ffffe6c0, path="/home/ash/prj/lo/online/test/") at src/Path.cpp:671
     #20 0x00007fda2350cd6b in Poco::Path::assign (this=0x7fd9ffffe6c0, path="/home/ash/prj/lo/online/test/") at src/Path.cpp:182
     #21 0x00007fda2350c1be in Poco::Path::Path (this=0x7fd9ffffe6c0, path="/home/ash/prj/lo/online/test/") at src/Path.cpp:54
     #22 0x00007fda2350d33a in Poco::Path::makeAbsolute (this=0x7fd9ffffe8f0) at src/Path.cpp:318
     #23 0x00007fda216b52ca in helpers::getDocumentPathAndURL (docFilename="setclientpart.ods", documentPath="/tmp/loadTorture_setclientpart.ods_ae70d2e_setclientpart.ods", documentURL="",
         prefix="loadTorture_setclientpart.ods_") at ./helpers.hpp:153
     #24 0x00007fda216ad007 in UnitLoadTorture::loadTorture (this=<optimized out>, testname="loadTorture_setclientpart.ods ", docName="setclientpart.ods", thread_count=thread_count@entry=3,
         max_jitter_ms=<optimized out>, max_jitter_ms@entry=75) at UnitLoadTorture.cpp:41
     #25 0x00007fda216ad7dd in UnitLoadTorture::<lambda()>::operator() (__closure=0x55e994cffe18) at UnitLoadTorture.cpp:186
     #26 std::__invoke_impl<void, UnitLoadTorture::testLoadTorture()::<lambda()> > (__f=...) at /usr/include/c++/7/bits/invoke.h:60
     #27 std::__invoke<UnitLoadTorture::testLoadTorture()::<lambda()> > (__fn=...) at /usr/include/c++/7/bits/invoke.h:95
     #28 std::thread::_Invoker<std::tuple<UnitLoadTorture::testLoadTorture()::<lambda()> > >::_M_invoke<0> (this=0x55e994cffe18) at /usr/include/c++/7/thread:234
     #29 std::thread::_Invoker<std::tuple<UnitLoadTorture::testLoadTorture()::<lambda()> > >::operator() (this=0x55e994cffe18) at /usr/include/c++/7/thread:243
     #30 std::thread::_State_impl<std::thread::_Invoker<std::tuple<UnitLoadTorture::testLoadTorture()::<lambda()> > > >::_M_run(void) (this=0x55e994cffe10) at /usr/include/c++/7/thread:186
     #31 0x00007fda22de366f in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
     #32 0x00007fda228f66db in start_thread (arg=0x7fd9fffff700) at pthread_create.c:463
     #33 0x00007fda2261f88f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
    
    Change-Id: Ib60954e49e692082e686cb3fdc5fc9d5cfbc83c9
    Reviewed-on: https://gerrit.libreoffice.org/83047Reviewed-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    Tested-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    538c83ec
  • Ashod Nakashian's avatar
    wsd: SIGTERM signals clean shutdown now · 8f97c20f
    Ashod Nakashian authored
    Change-Id: I8d5bf7232036bb103cd7433cd5b1c7b5021e06d4
    Reviewed-on: https://gerrit.libreoffice.org/83052Reviewed-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    Tested-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    8f97c20f
  • Ashod Nakashian's avatar
    wsd: notify clients of WOPI CONFLICT response · 787c4c39
    Ashod Nakashian authored
    Change-Id: I7ad7d88066af7f2bba7fd3307c688ab85ba561eb
    Reviewed-on: https://gerrit.libreoffice.org/83216Reviewed-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    Tested-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    787c4c39
  • Ashod Nakashian's avatar
    wsd: replace mutex in signal handler · 2de47046
    Ashod Nakashian authored
    There are a few things acceptable/safe in a
    signal handler, and taking locks is not one of them.
    
    This replaces the logic with a simple counter that
    serves the purpose just as well.
    
    If we get a double signal, we log and ignore.
    
    Change-Id: If589c18492468c120d00c213805467bcbba05d27
    Reviewed-on: https://gerrit.libreoffice.org/83150Reviewed-by: default avatarAshod Nakashian <ashnakash@gmail.com>
    Tested-by: default avatarAshod Nakashian <ashnakash@gmail.com>
    2de47046
  • Ashod Nakashian's avatar
    wsd: avoid malloc in signal handler · 7a32c676
    Ashod Nakashian authored
    malloc is not signal safe, and must not be called
    from signal-safe functions. If malloc itself signals,
    calling it in the signal handler can deadlock.
    
    Luckily, we only needed malloc for getting the
    backtrace strings. Now we just write directly to
    stderr, which is faster, cleaner, and safer.
    
    Change-Id: I54093f45e05f2a0fd3c5cde0cc2104ffe6d81d2a
    Reviewed-on: https://gerrit.libreoffice.org/83151Reviewed-by: default avatarAshod Nakashian <ashnakash@gmail.com>
    Tested-by: default avatarAshod Nakashian <ashnakash@gmail.com>
    7a32c676
  • Lionel Elie Mamane's avatar
    modernise TLS setup · 6b69b627
    Lionel Elie Mamane authored
    Some machines (e.g. Debian 10) by default will refuse DH groups
    shorter than 2048 bits.
    
    Change-Id: I3505bc392775d7c92069a8f705f574338666a8e7
    Reviewed-on: https://gerrit.libreoffice.org/83300Reviewed-by: default avatarAndras Timar <andras.timar@collabora.com>
    Tested-by: default avatarAndras Timar <andras.timar@collabora.com>
    6b69b627
  • Ashod Nakashian's avatar
    wsd: kill with SIGABRT now that SIGTERM cleanly shutsdown · 5001d0c9
    Ashod Nakashian authored
    Change-Id: I198795be0cc399703f3207456ef0bfd1e3c3c844
    Reviewed-on: https://gerrit.libreoffice.org/83359Reviewed-by: default avatarMiklos Vajna <vmiklos@collabora.com>
    Tested-by: default avatarMiklos Vajna <vmiklos@collabora.com>
    5001d0c9
  • mert's avatar
    Fix watermarks overflow the document area · a0c9e146
    mert authored
    Change-Id: Ia767d0b4f935bc28e0fb0ed0f8c2ddcfb8093734
    Reviewed-on: https://gerrit.libreoffice.org/83441Reviewed-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    Tested-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    a0c9e146
  • Ashod Nakashian's avatar
    wsd: use SIGKILL to kill a child · 09d8cee1
    Ashod Nakashian authored
    This is the cleanest way to achieve the goal
    of immediately exiting a child. This is used
    for cleaning up kit instances when closing
    docs, as well as in unit-tests.
    
    Change-Id: I76870234b130a508044044b102419646abe81ac8
    Reviewed-on: https://gerrit.libreoffice.org/83699Reviewed-by: default avatarAshod Nakashian <ashnakash@gmail.com>
    Tested-by: default avatarAshod Nakashian <ashnakash@gmail.com>
    09d8cee1
  • Michael Meeks's avatar
    sighandler: break infinite loop with corrupted heap · 70c612e5
    Michael Meeks authored
    ignoring the segv can lead to not making progress, while churning debug.
    
    Change-Id: I97af266cec3feefe2dcbd9adb8dbf4b13a4d69bd
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/87002Tested-by: default avatarJenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
    Reviewed-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    70c612e5
  • Michael Meeks's avatar
    Cleanup JWTAuth token before shutdown. · cb11d751
    Michael Meeks authored
    valgrind had some exciting double-free action on unclean shutdown.
    
    Change-Id: Id7dd3d8ff60387ae51521bd2c74e4d6bcc30ff2e
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/87025Tested-by: default avatarJenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
    Reviewed-by: default avatarMichael Meeks <michael.meeks@collabora.com>
    cb11d751
  • Andras Timar's avatar
    With switch to Weblate, downloadpootle.sh script became obsolete · d429a4c5
    Andras Timar authored
    Change-Id: I85447800a2547d2e9142b59ce60ee3c242e7234d
    d429a4c5
  • Andras Timar's avatar
    Use special Mac key names on Mac clients · 5691468b
    Andras Timar authored
    Change-Id: I6f1431cce44dd95c716cee6a3e01e71c491ac74b
    5691468b
  • Andras Timar's avatar
    enable l10n of 'Default Style' string here · aa047126
    Andras Timar authored
    Change-Id: Ia3253d5c54f117028807aeb1c6db01fbac7a474e
    aa047126
  • Andras Timar's avatar
    scripts/unocommands.py expects ascii input · f2506b6a
    Andras Timar authored
    Change-Id: Ie7b46537528f7096c09890e1525b7fbb0d9ea425
    f2506b6a
  • Andras Timar's avatar
    Use special Mac key names on Mac clients with localized keyboards, too · 759f46c4
    Andras Timar authored
    According to vcl/unx/generic/app/keysymnames.cxx and actual translations
    in online, there are only a few exceptions, that can be hardcoded.
    
    Change-Id: Ibaa9399ecb2657e0286327da53a69d3c23cde836
    759f46c4
  • Andras Timar's avatar
    These units are not really localisable · 8c4ffd0c
    Andras Timar authored
    Change-Id: I4eebe11bf4dc1dfc3944ea60b00887d49aad24e4
    8c4ffd0c
  • Andras Timar's avatar
    remove screenshot dimensions from help in order to avoid distorsions with updated/translated images · 0a25e192
    Andras Timar authored
    Change-Id: I9aae794531b6e89ef463723c5c1b3202b37678d4
    0a25e192
  • Andras Timar's avatar
    Fixed a typo in Online Help · 17d30f6c
    Andras Timar authored
    Change-Id: Ibd88edd48db16e4bd96ec60d545f50905ea06d25
    17d30f6c
  • Andras Timar's avatar
    Update UNO command translations · 285cf8d2
    Andras Timar authored
    Change-Id: I8339c73056d7bedd63ca2f4d57c0d37fdf88052b
    285cf8d2
  • Andras Timar's avatar
    Update translations from LO core · c71c08ec
    Andras Timar authored
    Change-Id: Ibf87cff28f1d1831d4f4d6a7f6c2e1e5afb0176d
    c71c08ec
  • Andras Timar's avatar
    Update translations from Weblate · ba1468a2
    Andras Timar authored
    Change-Id: I803ba9f193f726ddbdf822e5056d49b513f3dc6c
    ba1468a2
  • Andras Timar's avatar
    sync bundled LOKit headers from core · f5fdacd3
    Andras Timar authored
    Change-Id: Ie44b8ae634a5d039495f8a017da3d9d99dd52702
    f5fdacd3
  • Andras Timar's avatar
    Bump package version to 6.4.0.2 (RC2) · 97e56d30
    Andras Timar authored
    Change-Id: I37a44399db9dba79cc3f938c965216772fd75345
    97e56d30
  • Marco Marinello's avatar
    Merge tag 'libreoffice-6.4.0.2' into fuss-online-6-4 · 2b4fe841
    Marco Marinello authored
    libreoffice-6.4.0.2
    2b4fe841
......@@ -427,6 +427,15 @@ struct _LibreOfficeKitDocumentClass
int* pFontHeight,
int pOrientation);
/// Switches view to viewId if viewId >= 0, and paints window
/// @see lok::Document::paintWindowDPI().
void (*paintWindowForView) (LibreOfficeKitDocument* pThis, unsigned nWindowId,
unsigned char* pBuffer,
const int x, const int y,
const int width, const int height,
const double dpiscale,
int viewId);
#endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY
};
......
......@@ -177,10 +177,11 @@ public:
const int y,
const int width,
const int height,
const double dpiscale = 1.0)
const double dpiscale = 1.0,
const int viewId = -1)
{
return mpDoc->pClass->paintWindowDPI(mpDoc, nWindowId, pBuffer,
x, y, width, height, dpiscale);
return mpDoc->pClass->paintWindowForView(mpDoc, nWindowId, pBuffer, x, y,
width, height, dpiscale, viewId);
}
/**
......@@ -314,7 +315,7 @@ public:
}
/**
* Posts an UNO command to the document.
* Posts a UNO command to the document.
*
* Example argument string:
*
......@@ -557,7 +558,7 @@ public:
const char *pChar,
int *pFontWidth,
int *pFontHeight,
int pOrientation = 0)
int pOrientation=0)
{
if (LIBREOFFICEKIT_DOCUMENT_HAS(mpDoc, renderFontOrientation))
return mpDoc->pClass->renderFontOrientation(mpDoc, pFontName, pChar, pFontWidth, pFontHeight, pOrientation);
......
......@@ -131,12 +131,7 @@ typedef enum
/**
* The size and/or the position of the visible cursor changed.
*
* Old format is the same as LOK_CALLBACK_INVALIDATE_TILES.
* New format is a JSON with 3 elements the 'viewId' element represented by
* an integer value, a 'rectangle' element in the format "x, y, width, height",
* and a 'mispelledWord' element represented by an integer value: '1' when
* a mispelled word is at the cursor position, '0' when the word is
* not mispelled.
* Rectangle format is the same as LOK_CALLBACK_INVALIDATE_TILES.
*/
LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR = 1,
/**
......@@ -267,6 +262,10 @@ typedef enum
*
* Payload format is "width, height", i.e. clients get the new size without
* having to do an explicit lok::Document::getDocumentSize() call.
*
* A size change is always preceded by a series of
* LOK_CALLBACK_INVALIDATE_TILES events invalidating any areas
* need re-rendering to adapt.
*/
LOK_CALLBACK_DOCUMENT_SIZE_CHANGED = 13,
......
......@@ -56,16 +56,19 @@ namespace
class FileDeleter
{
std::vector<std::string> _filesToDelete;
std::mutex _lock;
public:
FileDeleter() {}
~FileDeleter()
{
for (auto& file: _filesToDelete)
std::unique_lock<std::mutex> guard(_lock);
for (const std::string& file: _filesToDelete)
filesystem::remove(file);
}
void registerForDeletion(const std::string& file)
{
std::unique_lock<std::mutex> guard(_lock);
_filesToDelete.push_back(file);
}
};
......@@ -104,11 +107,6 @@ namespace FileUtil
return dstPath;
}
std::string getTempFilePath(const std::string& srcDir, const std::string& srcFilename)
{
return getTempFilePath(srcDir, srcFilename, "");
}
bool saveDataToFileSafely(const std::string& fileName, const char *data, size_t size)
{
const auto tempFileName = fileName + ".temp";
......
......@@ -70,14 +70,18 @@ namespace FileUtil
removeFile(path.toString(), recursive);
}
/// Make a temp copy of a file, and prepend it with a prefix.
std::string getTempFilePath(const std::string& srcDir, const std::string& srcFilename,
const std::string& dstFilenamePrefix);
/// Make a temp copy of a file.
/// Primarily used by tests to avoid tainting the originals.
/// srcDir shouldn't end with '/' and srcFilename shouldn't contain '/'.
/// Returns the created file path.
std::string getTempFilePath(const std::string& srcDir, const std::string& srcFilename);
/// Make a temp copy of a file, and prepend it with a prefix.
std::string getTempFilePath(const std::string& srcDir, const std::string& srcFilename, const std::string& dstFilenamePrefix);
inline std::string getTempFilePath(const std::string& srcDir, const std::string& srcFilename)
{
return getTempFilePath(srcDir, srcFilename, std::string());
}
} // end namespace FileUtil
......
......@@ -83,7 +83,7 @@ namespace Log
while (true)
{
const int length = std::strlen(message);
const int written = write (STDERR_FILENO, message, length);
const int written = write(STDERR_FILENO, message, length);
if (written < 0)
{
if (errno == EINTR)
......@@ -119,6 +119,7 @@ namespace Log
Poco::DateTime time;
#ifdef __linux
const long osTid = Util::getThreadId();
// Note that snprintf is deemed signal-safe in most common implementations.
snprintf(buffer, len, "%s-%.05lu %.4u-%.2u-%.2u %.2u:%.2u:%.2u.%.6u [ %s ] %s ",
(Source.getInited() ? Source.getId().c_str() : "<shutdown>"),
osTid,
......
......@@ -83,13 +83,38 @@ namespace SigUtil
}
#if !MOBILEAPP
std::mutex SigHandlerTrap;
namespace SigUtil
{
std::mutex& getSigHandlerTrap()
/// This traps the signal-handler so we don't _Exit
/// while dumping stack trace. It's re-entrant.
/// Used to safely increment and decrement the signal-handler trap.
class SigHandlerTrap
{
static std::atomic<int> SigHandling;
public:
SigHandlerTrap() { ++SigHandlerTrap::SigHandling; }
~SigHandlerTrap() { --SigHandlerTrap::SigHandling; }
/// Check that we have exclusive access to the trap.
/// Otherwise, there is another signal in progress.
bool isExclusive() const
{
// Return true if we are alone.
return SigHandlerTrap::SigHandling == 1;
}
/// Wait for the trap to clear.
static void wait()
{
while (SigHandlerTrap::SigHandling)
sleep(1);
}
};
std::atomic<int> SigHandlerTrap::SigHandling;
void waitSigHandlerTrap()
{
return SigHandlerTrap;
SigHandlerTrap::wait();
}
const char *signalName(const int signo)
......@@ -157,7 +182,7 @@ namespace SigUtil
{
bool hardExit = false;
const char *domain;
if (!ShutdownRequestFlag && signal == SIGINT)
if (!ShutdownRequestFlag && (signal == SIGINT || signal == SIGTERM))
{
domain = " Shutdown signal received: ";
ShutdownRequestFlag = true;
......@@ -211,19 +236,17 @@ namespace SigUtil
static
void handleFatalSignal(const int signal)
{
std::unique_lock<std::mutex> lock(SigHandlerTrap);
SigHandlerTrap guard;
bool bReEntered = !guard.isExclusive();
Log::signalLogPrefix();
Log::signalLog(" Fatal signal received: ");
Log::signalLog(signalName(signal));
Log::signalLog("\n");
if (std::getenv("LOOL_DEBUG"))
{
Log::signalLog(FatalGdbString);
LOG_ERR("Sleeping 30s to allow debugging.");
sleep(30);
}
// Heap corruption can re-enter through backtrace.
if (bReEntered)
Log::signalLog(" Fatal double signal received: ");
else
Log::signalLog(" Fatal signal received: ");
Log::signalLog(signalName(signal));
struct sigaction action;
......@@ -233,7 +256,8 @@ namespace SigUtil
sigaction(signal, &action, nullptr);
dumpBacktrace();
if (!bReEntered)
dumpBacktrace();
// let default handler process the signal
kill(getpid(), signal);
......@@ -241,34 +265,17 @@ namespace SigUtil
void dumpBacktrace()
{
char header[32];
sprintf(header, "Backtrace %d:\n", getpid());
#if !defined(__ANDROID__)
Log::signalLog("\nBacktrace ");
Log::signalLogNumber(getpid());
Log::signalLog(":\n");
const int maxSlots = 50;
void *backtraceBuffer[maxSlots];
int numSlots = backtrace(backtraceBuffer, maxSlots);
const int numSlots = backtrace(backtraceBuffer, maxSlots);
if (numSlots > 0)
{
char **symbols = backtrace_symbols(backtraceBuffer, numSlots);
if (symbols != nullptr)
{
struct iovec ioVector[maxSlots*2+1];
ioVector[0].iov_base = static_cast<void*>(header);
ioVector[0].iov_len = std::strlen(static_cast<const char*>(ioVector[0].iov_base));
for (int i = 0; i < numSlots; i++)
{
ioVector[1+i*2+0].iov_base = symbols[i];
ioVector[1+i*2+0].iov_len = std::strlen(static_cast<const char *>(ioVector[1+i*2+0].iov_base));
ioVector[1+i*2+1].iov_base = const_cast<void*>(static_cast<const void*>("\n"));
ioVector[1+i*2+1].iov_len = 1;
}
if (writev(STDERR_FILENO, ioVector, numSlots*2+1) == -1)
{
LOG_SYS("Failed to dump backtrace to stderr.");
}
}
backtrace_symbols_fd(backtraceBuffer, numSlots, STDERR_FILENO);
}
#else
LOG_SYS("Backtrace not available on Android.");
......@@ -276,6 +283,7 @@ namespace SigUtil
if (std::getenv("LOOL_DEBUG"))
{
Log::signalLog(FatalGdbString);
LOG_ERR("Sleeping 30s to allow debugging.");
sleep(30);
}
......@@ -295,9 +303,9 @@ namespace SigUtil
sigaction(SIGILL, &action, nullptr);
sigaction(SIGFPE, &action, nullptr);
// prepare this in advance just in case.
// Prepare this in advance just in case.
std::ostringstream stream;
stream << "\nFatal signal! Attach debugger with:\n"
stream << "\nERROR: Fatal signal! Attach debugger with:\n"
<< "sudo gdb --pid=" << getpid() << "\n or \n"
<< "sudo gdb --q --n --ex 'thread apply all backtrace full' --batch --pid="
<< getpid() << "\n";
......@@ -336,7 +344,7 @@ namespace SigUtil
bool killChild(const int pid)
{
LOG_DBG("Killing PID: " << pid);
if (kill(pid, SIGTERM) == 0 || errno == ESRCH)
if (kill(pid, SIGKILL) == 0 || errno == ESRCH)
{
// Killed or doesn't exist.
return true;
......
......@@ -38,14 +38,12 @@ namespace SigUtil
bool getDumpGlobalState();
/// Reset the flag to dump internal state.
void resetDumpGlobalState();
}
#if !MOBILEAPP
namespace SigUtil
{
/// Mutex to trap signal handler, if any,
/// Wait for the signal handler, if any,
/// and prevent _Exit while collecting backtrace.
std::mutex& getSigHandlerTrap();
void waitSigHandlerTrap();
/// Returns the name of the signal.
const char* signalName(int signo);
......@@ -78,10 +76,10 @@ namespace SigUtil
/// Dump a signal-safe back-trace
void dumpBacktrace();
} // end namespace SigUtil
#endif // !MOBILEAPP
} // end namespace SigUtil
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -3,7 +3,7 @@
AC_PREREQ([2.63])
AC_INIT([loolwsd], [6.4.0.0.beta1], [libreoffice@lists.freedesktop.org])
AC_INIT([loolwsd], [6.4.0.2], [libreoffice@lists.freedesktop.org])
LT_INIT([shared, disable-static, dlopen])
AM_INIT_AUTOMAKE([1.10 subdir-objects tar-pax -Wno-portability])
......
......@@ -95,8 +95,6 @@ cp -a libreoffice/instdir "$INSTDIR"/opt/libreoffice
# build
( cd online && ./autogen.sh ) || exit 1
( cd online && ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-silent-rules --with-lokit-path="$BUILDDIR"/libreoffice/include --with-lo-path=/opt/libreoffice $ONLINE_EXTRA_BUILD_OPTIONS) || exit 1
( cd online/loleaflet/po && ../../scripts/downloadpootle.sh )
( cd online/loleaflet && make l10n) || exit 1
( cd online && scripts/locorestrings.py "$BUILDDIR"/online "$BUILDDIR"/libreoffice/translations )
( cd online && scripts/unocommands.py --update "$BUILDDIR"/online "$BUILDDIR"/libreoffice )
( cd online && scripts/unocommands.py --translate "$BUILDDIR"/online "$BUILDDIR"/libreoffice/translations )
......
......@@ -2641,11 +2641,10 @@ void lokit_main(
#if !MOBILEAPP
// Trap the signal handler, if invoked,
// to prevent exiting.
LOG_INF("Process finished.");
Log::shutdown();
std::unique_lock<std::mutex> lock(SigUtil::getSigHandlerTrap());
// Wait for the signal handler, if invoked, to prevent exiting until done.
SigUtil::waitSigHandlerTrap();
std::_Exit(EX_OK);
#endif
......
......@@ -69,18 +69,22 @@ private:
for (int to_y = from_offset_y, from_y = 0; (to_y < to_height) && (from_y < from_height) ; ++to_y, ++from_y)
for (int to_x = from_offset_x, from_x = 0; (to_x < to_width) && (from_x < from_width); ++to_x, ++from_x)
{
const unsigned char* f = from.data() + 4 * (from_y * from_width + from_x);
double src_r = f[0];
double src_g = f[1];
double src_b = f[2];
double src_a = f[3] / 255.0;
unsigned char* t = to + 4 * (to_y * to_width + to_x);
if (t[3] != 255.0)
continue;
double dst_r = t[0];
double dst_g = t[1];
double dst_b = t[2];
double dst_a = t[3] / 255.0;
const unsigned char* f = from.data() + 4 * (from_y * from_width + from_x);
double src_r = f[0];
double src_g = f[1];
double src_b = f[2];
double src_a = f[3] / 255.0;
double out_a = src_a + dst_a * (1.0 - src_a);
unsigned char out_r = src_r + dst_r * (1.0 - src_a);
unsigned char out_g = src_g + dst_g * (1.0 - src_a);
......
This diff is collapsed.
{
"Average":"Promeyo",
"Background":"Fundo",
"Default":"Por defecto",
"Example":"Eixemplo",
"Footer":"Piet de pachina",
......
......@@ -8,10 +8,10 @@
"Amharic":"Amháricu",
"Arabic":"Árabe",
"Arabic (Algeria)":"Árabe (Arxelia)",
"Arabic (Bahrain)":"Árabe (Bahréin)",
"Arabic (Chad)":"Árabe (Iraq)",
"Arabic (Comoros)":"Árabe (Comoros)",
"Arabic (Djibouti)":"Árabe (Djibouti)",
"Arabic (Bahrain)":"Árabe (Baréin)",
"Arabic (Chad)":"Árabe (Chad)",
"Arabic (Comoros)":"Árabe (Comores)",
"Arabic (Djibouti)":"Árabe (Xibuti)",
"Arabic (Egypt)":"Árabe (Exiptu)",
"Arabic (Eritrea)":"Árabe (Eritrea)",
"Arabic (Iraq)":"Árabe (Iraq)",
......@@ -29,15 +29,17 @@
"Arabic (Somalia)":"Árabe (Somalia)",
"Arabic (Sudan)":"Árabe (Sudán)",
"Arabic (Syria)":"Árabe (Siria)",
"Arabic (Tunisia)":"Árabe (Túnez)",
"Arabic (Tunisia)":"Árabe (Tunicia)",
"Arabic (UAE)":"Árabe (EAX)",
"Arabic (Yemen)":"Árabe (Yemen)",
"Arabic (Yemen)":"Árabe (Yeme)",
"Aragonese":"Aragonés",
"Aranese":"Aranés",
"Arpitan (Switzerland)":"Alemán (Suiza)",
"Assamese":"Asamés",
"Asturian":"Asturianu",
"Average":"Promediu",
"Azerbaijani Cyrillic":"Azerbaiyanu cirílicu",
"Azerbaijani Latin":"Azerbaiyanu llatín",
"Azerbaijani Cyrillic":"Azerbaixanu cirílicu",
"Azerbaijani Latin":"Azerbaixanu llatín",
"Background":"Fondu",
"Background objects":"Oxetos de fondu",
"Bafia":"Bafia",
......@@ -47,9 +49,9 @@
"Basque":"Vascu",
"Beembe":"Beembe",
"Bekwel":"Bekwel",
"Belarusian":"Bielorusu",
"Belarusian":"Bielorrusu",
"Bengali (Bangladesh)":"Bengalí (Bangladesh)",
"Bengali (India)":"Bengalí (India)",
"Bengali (India)":"Bengalín (India)",
"Bibliography 1":"Bibliografía 1",
"Bibliography Heading":"Encabezamientu de bibliografía",
"Blank Slide":"Diapositiva balera",
......@@ -65,13 +67,14 @@
"Caption":"Testu de la etiqueta",
"Caption Characters":"Caráuteres d'etiqueta",
"Catalan":"Catalán",
"Catalan (Valencian)":"Catalán (Valencianu)",
"Catalan (Valencian)":"Catalán (valencianu)",
"Centered Text":"Testu centráu",
"Chinese (Hong Kong)":"Chinu (Hong Kong)",
"Chinese (Macau)":"Chinu (Macao)",
"Chinese (Hong Kong)":"Chinu (ong Kong)",
"Chinese (Macau)":"Chinu (Macáu)",
"Chinese (Singapore)":"Chinu (Singapur)",
"Chinese (simplified)":"Chinu (simplificáu)",
"Chinese (traditional)":"Chinu (tradicional)",
"Church Slavic":"Eslavu eclesiásticu",
"Chuvash":"Chuvash",
"Clear formatting":"Desaniciar formatu",
"Complimentary Close":"Fras de despidida",
......@@ -92,6 +95,7 @@
"Count":"Cuenta",
"CountA":"CuntadorA",
"Croatian":"Croata",
"Curves and Polygons":"Curves y polígonos",
"Czech":"Checu",
"Danish":"Danés",
"Default":"Predetermináu",
......@@ -112,20 +116,27 @@
"Endnote Characters":"Caráuteres de Nota final",
"English (Australia)":"Inglés (Australia)",
"English (Belize)":"Inglés (Belice)",
"English (Botswana)":"Inglés (Botsuana)",
"English (Canada)":"Inglés (Canadá)",
"English (Caribbean)":"Inglés (Caribe)",
"English (Gambia)":"Inglés (Gambia)",
"English (Ghana)":"Inglés (Ghana)",
"English (India)":"Inglés (India)",
"English (Ireland)":"Inglés (Irlanda)",
"English (Jamaica)":"Inglés (Xamaica)",
"English (Malawi)":"Inglés (Malawi)",
"English (Malaysia)":"Inglés (Malasia)",
"English (Mauritius)":"Inglés (Mauriciu)",
"English (Namibia)":"Inglés (Namibia)",
"English (New Zealand)":"Inglés (Nueva Zelanda)",
"English (Nigeria)":"Inglés (Nixeria)",
"English (Philippines)":"Inglés (Filipines)",
"English (South Africa)":"Inglés (Sudáfrica)",
"English (Sri Lanka)":"Inglés (Sri Lanka)",
"English (Trinidad)":"Inglés (Trinidá)",
"English (UK)":"Inglés (Reinu Xuníu)",
"English (USA)":"Inglés (EE.XX.)",
"English (Zambia)":"Inglés (Zambia)",
"English (Zimbabwe)":"Inglés (Zimbabue)",
"English, OED spelling (UK)":"Inglés, ortografía del OED (Reinu Xuníu)",
"Envelope":"Sobre",
......@@ -134,12 +145,13 @@
"Estonian":"Estoniu",
"Example":"Exemplu",
"Faroese":"Feroés",
"Fijian":"Fidjianu",
"Fijian":"Fixanu",
"Finnish":"Finés",
"First Line Indent":"Sangría de primera llinia",
"First Page":"Primer Páxina",
"First column":"Primer columna",
"Flowchart":"Diagrama de fluxu",
"Fon":"Fon",
"Footer":"Pie",
"Footer Left":"Pie izquierda",
"Footer Right":"Pie drecha",
......@@ -151,12 +163,19 @@
"Frame":"Marcu",
"Frame Contents":"Conteníu del marcu",
"French (Belgium)":"Francés (Bélxica)",
"French (Burkina Faso)":"Francés (Burkina Faso)",
"French (Benin)":"Francés (Benín)",
"French (Burkina Faso)":"Francés (Burkina Fasu)",
"French (Canada)":"Francés (Canadá)",
"French (Côte d'Ivoire)":"Francés (Costa de Marfil)",
"French (France)":"Francés (Francia)",
"French (Luxembourg)":"Francés (Luxemburgo)",
"French (Monaco)":"Francés (Mónaco)",
"French (Luxembourg)":"Francés (Luxemburgu)",
"French (Mali)":"Francés (Malí)",
"French (Mauritius)":"Francés (Mauriciu)",
"French (Monaco)":"Francés (Mónacu)",
"French (Niger)":"Francés (Níxer)",
"French (Senegal)":"Francés (Senegal)",
"French (Switzerland)":"Francés (Suiza)",
"French (Togo)":"Francés (Togu)",
"Frisian":"Frisón",
"Friulian":"Friulianu",
"Gaelic (Scotland)":"Gaélicu (Escocia)",
......@@ -168,7 +187,7 @@
"German (Belgium)":"Alemán (Bélxica)",
"German (Germany)":"Alemán (Alemaña)",
"German (Liechtenstein)":"Alemán (Liechtenstein)",
"German (Luxembourg)":"Alemán (Luxemburgo)",
"German (Luxembourg)":"Alemán (Luxemburgu)",
"German (Switzerland)":"Alemán (Suiza)",
"Gikuyu":"Gikuyu",
"Graphics":"Gráficos",
......@@ -219,6 +238,7 @@
"Italian (Switzerland)":"Italianu (Suiza)",
"Japanese":"Xaponés",
"Kaamba":"Kaamba",
"Kabardian":"Cabardianu",
"Kabyle Latin":"Cabileñu en llatín",
"Kalaallisut":"Groenlandés",
"Kannada":"Kannada",
......@@ -258,6 +278,7 @@
"Left Page":"Páxina izquierda",
"Limbu":"Limbu",
"Line Numbering":"Numberación de llinies",
"Lines and Arrows":"Llinies y fleches",
"Lingala":"Lingala",
"List":"Llista",
"List 1":"Llista 1",
......@@ -286,15 +307,15 @@
"Lithuanian":"Lituanu",
"Livonian":"Livoniu",
"Lojban":"Lojban",
"Low German":"Alemán Baxu",
"Low German":"Baxu alemán",
"Luxembourgish":"Lluxemburgués",
"Macedonian":"Macedoniu",
"Main Index Entry":"Entrada d'índiz principal",
"Maithili":"Maithili",
"Malagasy, Plateau":"Malgache, Plateau",
"Malay (Brunei Darussalam)":"Malayu (Brunei Darusalam)",
"Malay (Brunei Darussalam)":"Malayu (Brunéi Darusalam)",
"Malay (Malaysia)":"Malayu (Malasia)",
"Malayalam":"Malayu",
"Malayalam":"Malayalam",
"Maltese":"Maltés",
"Manipuri":"Manipuri",
"Maore":"Maore",
......@@ -368,6 +389,7 @@
"Persian":"Persa",
"Pitjantjatjara":"Pitjantjatjara",
"Placeholder":"Marcador de posición",
"Plautdietsch":"Baxu alemán menonita",
"Polish":"Polacu",
"Portuguese (Angola)":"Portugués (Angola)",
"Portuguese (Brazil)":"Portugués (Brasil)",
......@@ -423,7 +445,8 @@
"Serbian Latin (Serbia)":"Serbiu Latin (Serbia)",
"Shuswap":"Shuswap",
"Sidama":"Sidama",
"Signature":"Firma",
"Signature":"Robla",
"Silesian":"Silesiu",
"Sinhala":"Singalés",
"Six Slides":"Seyes páxines",
"Slovak":"Eslovacu",
......@@ -433,7 +456,7 @@
"Sorbian, Upper":"Sorbianés, Altu",
"Source Text":"Testu Fonte",
"Southern Sotho":"Sotho sur",
"Spanish (Argentina)":"Castellanu (Argentina)",
"Spanish (Argentina)":"Castellanu (Arxentina)",
"Spanish (Bolivia)":"Castellanu (Bolivia)",
"Spanish (Chile)":"Castellanu (Chile)",
"Spanish (Colombia)":"Castellanu (Colombia)",
......@@ -444,21 +467,21 @@
"Spanish (El Salvador)":"Castellanu (El Salvador)",
"Spanish (Guatemala)":"Castellanu (Guatemala)",
"Spanish (Honduras)":"Castellanu (Hondures)",
"Spanish (Mexico)":"Castellanu (México)",
"Spanish (Mexico)":"Castellanu (Méxicu)",
"Spanish (Nicaragua)":"Castellanu (Nicaragua)",
"Spanish (Panama)":"Castellanu (Panamá)",
"Spanish (Paraguay)":"Castellanu (Paraguay)",
"Spanish (Paraguay)":"Castellanu (Paraguái)",
"Spanish (Peru)":"Castellanu (Perú)",
"Spanish (Puerto Rico)":"Castellanu (Puerto Rico)",
"Spanish (Puerto Rico)":"Castellanu (Puertu Ricu)",
"Spanish (Spain)":"Castellanu (España)",
"Spanish (Uruguay)":"Castellanu (Uruguay)",
"Spanish (Uruguay)":"Castellanu (Uruguái)",
"Spanish (Venezuela)":"Castellanu (Venezuela)",
"StDev":"DesvEst",
"Strong Emphasis":"Mui destacáu",
"Subtitle":"Sotítulu",
"Sum":"Suma",
"Suundi":"Suundi",
"Swahili (Kenya)":"Suajili (Kenia)",
"Swahili (Kenya)":"Suaili (Kenia)",
"Swahili (Tanzania)":"Suaḥili (Tanzania)",
"Swazi":"Swazi",
"Swedish (Finland)":"Suecu (Finlandia)",
......
......@@ -281,6 +281,7 @@
"Japanese":"Японски",
"Juǀ’hoan":"Жуцоан",
"Kaamba":"Каамба",
"Kabardian":"Кабардино-черкезки",
"Kabyle Latin":"Кабилски (латиница)",
"Kalaallisut":"Гренландски",
"Kannada":"Каннада",
......
......@@ -119,6 +119,7 @@
"Cree, Plains, Latin":"cree (Plains, llatí)",
"Cree, Plains, Syllabics":"cree (Plains, sil·làbics)",
"Croatian":"croata",
"Curves and Polygons":"Corbes i polígons",
"Czech":"txec",
"Danish":"danès",
"Dashed Line":"Línia de traços",
......@@ -280,6 +281,7 @@
"Japanese":"japonès",
"Juǀ’hoan":"juǀ’hoan",
"Kaamba":"kaamba",
"Kabardian":"cabardià",
"Kabyle Latin":"llatí cabilenc",
"Kalaallisut":"kalaallisut",
"Kannada":"kanarès",
......@@ -324,6 +326,7 @@
"Limbu":"limbu",
"Line Numbering":"Numeració de línies",
"Lines":"Línies",
"Lines and Arrows":"Línies i fletxes",
"Lingala":"lingala",
"List":"Llista",
"List 1":"Llista 1",
......@@ -360,8 +363,8 @@
"Malagasy, Plateau":"malgaix, altiplà",
"Malay (Brunei Darussalam)":"malai (Brunei)",
"Malay (Malaysia)":"malai (Malàisia)",
"Malay Arabic (Brunei Darussalam)":"àrab malai (Brunei)",
"Malay Arabic (Malaysia)":"àrab malai (Malàisia)",
"Malay Arabic (Brunei Darussalam)":"malai àrab (Brunei)",
"Malay Arabic (Malaysia)":"malai àrab (Malàisia)",
"Malayalam":"malaiàlam",
"Maltese":"maltès",
"Manchu":"mantxú",
......@@ -443,6 +446,7 @@
"Outlined Yellow":"Contorn groc",
"Overwrite":"Sobreescriu",
"Page %1 of %2":"Pàgina %1 de %2",
"Page %1 of %2 (Page %3 of %4 to print)":"Pàgina %1 de %2 (pàgina %3 de %4 per imprimir)",
"Page %1 of %2 (Page %3)":"Pàgina %1 de %2 (Pàgina %3)",
"Page Number":"Número de pàgina",
"Pali Latin":"pali (llatí)",
......@@ -548,6 +552,7 @@
"Spanish (Venezuela)":"espanyol (Veneçuela)",
"StDev":"DesvEst",
"Standard selection":"Selecció estàndard",
"Stars and Banners":"Estrelles i tires",
"Strong Emphasis":"Èmfasi fort",
"Subtitle":"Subtítol",
"Sum":"Suma",
......@@ -557,6 +562,7 @@
"Swazi":"swazi",
"Swedish (Finland)":"suec (Finlàndia)",
"Swedish (Sweden)":"suec (Suècia)",
"Symbol Shapes":"Formes clàssiques",
"Table":"Taula",
"Table Contents":"Contingut de la taula",
"Table Heading":"Encapçalament de la taula",
......
......@@ -40,6 +40,7 @@
"Arabic (Yemen)":"Arabština (Jemen)",
"Aragonese":"Aragonština",
"Aranese":"Aranéština",
"Armenian, Classical (Armenia)":"Klasická arménština (Arménie)",
"Armenian, Eastern (Armenia)":"Východní arménština (Arménie)",
"Armenian, Eastern (Iran)":"Východní arménština (Írán)",
"Armenian, Eastern (Russia)":"Východní arménština (Rusko)",
......@@ -118,6 +119,7 @@
"Cree, Plains, Latin":"Kríjština, plains, latinka",
"Cree, Plains, Syllabics":"Kríjština, plains, slabičné",
"Croatian":"Chorvatština",
"Curves and Polygons":"Křivky a mnohoúhelníky",
"Czech":"Čeština",
"Danish":"Dánština",
"Dashed Line":"Čárkovaná čára",
......@@ -152,8 +154,10 @@
"English (Mauritius)":"Angličtina (Mauricius)",
"English (Namibia)":"Angličtina (Namibie)",
"English (New Zealand)":"Angličtina (Nový Zéland)",
"English (Nigeria)":"Angličtina (Nigérie)",
"English (Philippines)":"Angličtina (Filipíny)",
"English (South Africa)":"Angličtina (Jižní Afrika)",
"English (Sri Lanka)":"Angličtina (Srí Lanka)",
"English (Trinidad)":"Angličtina (Trinidad)",
"English (UK)":"Angličtina (UK)",
"English (USA)":"Angličtina (USA)",
......@@ -277,6 +281,7 @@
"Japanese":"Japonština",
"Juǀ’hoan":"Juǀ’hoan",
"Kaamba":"Kaamba",
"Kabardian":"Kabardština",
"Kabyle Latin":"Kabulí (latinka)",
"Kalaallisut":"Grónština",
"Kannada":"Kannadština",
......@@ -321,6 +326,7 @@
"Limbu":"Limbu",
"Line Numbering":"Číslování řádků",
"Lines":"Čáry",
"Lines and Arrows":"Čáry a šipky",
"Lingala":"Lingalština",
"List":"Seznam",
"List 1":"Seznam 1",
......@@ -440,6 +446,7 @@
"Outlined Yellow":"Žlutý obrys",
"Overwrite":"Přepis",
"Page %1 of %2":"Stránka %1 z %2",
"Page %1 of %2 (Page %3 of %4 to print)":"Stránka %1 z %2 (stránka %3 z %4 pro tisk)",
"Page %1 of %2 (Page %3)":"Stránka %1 z %2 (stránka %3)",
"Page Number":"Číslo stránky",
"Pali Latin":"Páli, latinka",
......@@ -545,6 +552,7 @@
"Spanish (Venezuela)":"Španělština (Venezuela)",
"StDev":"SměrOdch",
"Standard selection":"Standardní výběr",
"Stars and Banners":"Hvězdy a cedule",
"Strong Emphasis":"Silné zdůraznění",
"Subtitle":"Podnadpis",
"Sum":"Součet",
......@@ -554,6 +562,7 @@
"Swazi":"Svazijština",
"Swedish (Finland)":"Švédština (Finsko)",
"Swedish (Sweden)":"Švédština (Švédsko)",
"Symbol Shapes":"Tvary symbolů",
"Table":"Tabulka",
"Table Contents":"Obsah tabulky",
"Table Heading":"Nadpis tabulky",
......
......@@ -40,6 +40,7 @@
"Arabic (Yemen)":"Arabeg (Yemen)",
"Aragonese":"Aragoneg",
"Aranese":"Aragoneg",
"Armenian, Classical (Armenia)":"Armeneg, Clasurol (Armenia)",
"Armenian, Eastern (Armenia)":"Armeneg, Dwyrain (Armenia)",
"Armenian, Eastern (Iran)":"Armenieg, Dwyrain (Iran)",
"Armenian, Eastern (Russia)":"Armenieg, Dwyrain (Rwsia)",
......@@ -118,6 +119,7 @@
"Cree, Plains, Latin":"Cree, Gwastadeddau, Lladin",
"Cree, Plains, Syllabics":"Cree, Gwstadeddau, Syllafwyddor",
"Croatian":"Croatieg",
"Curves and Polygons":"Cromliniau a Pholygonau",
"Czech":"Tsiec",
"Danish":"Daneg",
"Dashed Line":"Llinell Doredig",
......@@ -152,8 +154,10 @@
"English (Mauritius)":"Saesneg (Mauritius)",
"English (Namibia)":"Saesneg (Namibia)",
"English (New Zealand)":"Saesneg (Seland Newydd)",
"English (Nigeria)":"Saesneg (Nigeria)",
"English (Philippines)":"Saesneg (Philippines)",
"English (South Africa)":"Saesneg (De Affrica)",
"English (Sri Lanka)":"Saesneg (Sri Lanka)",
"English (Trinidad)":"Saesneg (Trinidad)",
"English (UK)":"Saesneg (DU)",
"English (USA)":"Saesneg (UDA)",
......@@ -277,6 +281,7 @@
"Japanese":"Japaneeg",
"Juǀ’hoan":"Juǀ’hoan",
"Kaamba":"Kaamba",
"Kabardian":"Kabardieg",
"Kabyle Latin":"Kabyle Lladin",
"Kalaallisut":"Kalaallisut",
"Kannada":"Kannada",
......@@ -321,6 +326,7 @@
"Limbu":"Limbu",
"Line Numbering":"Rhifo Llinell",
"Lines":"Llinellau",
"Lines and Arrows":"Llinellau a Saethau",
"Lingala":"Lingala",
"List":"Rhestr",
"List 1":"Rhestr 1",
......@@ -440,6 +446,7 @@
"Outlined Yellow":"Amlinell Melyn",
"Overwrite":"Trosysgrifo",
"Page %1 of %2":"Tudalen %1 o %2",
"Page %1 of %2 (Page %3 of %4 to print)":"Tudalen %1 of %2 (Tudalen %3 o %4 i'w hargraffu)",
"Page %1 of %2 (Page %3)":"Tudalen %1 o %2 (Tudalen %3)",
"Page Number":"Rhif Tudalen",
"Pali Latin":"Lladin Pali",
......@@ -545,6 +552,7 @@
"Spanish (Venezuela)":"Sbaeneg (Venezuela)",
"StDev":"StDev",
"Standard selection":"Dewis safonol",
"Stars and Banners":"Sêr a Baneri",
"Strong Emphasis":"Pwyslais cryf",
"Subtitle":"Is deitl",
"Sum":"Swm",
......@@ -554,6 +562,7 @@
"Swazi":"Swazi",
"Swedish (Finland)":"Swedeg (Ffindir)",
"Swedish (Sweden)":"Swedeg (Sweden)",
"Symbol Shapes":"Siapiau Symbolau",
"Table":"Tabl",
"Table Contents":"Cynnwys Tabl",
"Table Heading":"Pennawd Tabl",
......
......@@ -118,6 +118,7 @@
"Cree, Plains, Latin":