Libreoffice: Das Spreadsheet of Death

Vor einigen Wochen fiel jemandem auf, daß sein PC jedes mal lahmte, wenn er im LibreOffice eine bestimmte Tabelle ansah und editieren wollte. Das Tabellenblatt war aber gar nicht so groß, wie man glauben könnte, aber es war …

Das Spreadsheet of Death

Was passiert mit einem Linuxsystem, wenn der Xorg-Serverprozess bei 100% ankommt? Es bleibt faktisch stehen. Wer das mal live mit Libreoffice auf einem Ryzen 1500X erleben will, der kann sich noch dies Dokument ziehen: Das Spreadsheet of Death Beispiel. Das richtige ist leider wegen Datenschutz nicht öffentlich verfügbar und war ein bisschen länger.

Die Ursache ist, daß der Spellchecker, also die Rechtschreibkorrektur, alle Feldinhalte immer und immer wieder prüft, für falsch betrachtet und dann mit einem neuen Antialising-Malframework einen blauen oder roten Krikkel unter den Feldeintrag zeichnet.  Das neue Framework ist aber so inperformant, daß der Xorg Prozess auf einem CPU Kern bei 100% Last arbeitet.

Bei jedem Scrollen geht die Rechtschreibkorrektur wieder von vorn los, was direkt zum zähesten PC Erlebnis ever führt.  In TOP sah das dann so aus:

[~]$ top -c -b -n 1 | head -n 20
top - 11:54:26 up  2:01,  1 user,  load average: 0,51, 0,28, 0,20
Tasks: 409 total,   2 running, 407 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14,2 us,  2,1 sy,  0,0 ni, 83,0 id,  0,0 wa,  0,0 hi,  0,7 si,  0,0 st
MiB Mem :  15967,5 total,   5456,9 free,   5122,1 used,   5388,4 buff/cache
MiB Swap:   7810,9 total,   7810,9 free,      0,0 used.  10141,6 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   1957 root      20   0  857132 191608 150596 R 100,0   1,2   6:16.45 /usr/libexec/Xorg vt2 -displayfd 3 -auth /run/u+
   2452 marius    20   0 3841504 252908 104348 S   6,2   1,5   4:15.81 cinnamon --replace
  13809 marius    20   0  126080  10728   8724 S   6,2   0,1   0:01.11 ssh -C -Y xxx@yy.yy.yy.yy
  14410 marius    20   0  116004   4228   3412 R   6,2   0,0   0:00.02 top -c -b -n 1
      1 root      20   0  171508  15268   9792 S   0,0   0,1   0:04.67 /usr/lib/systemd/systemd --switched-root --syst+
      2 root      20   0       0      0      0 S   0,0   0,0   0:00.01 [kthreadd]
      3 root       0 -20       0      0      0 I   0,0   0,0   0:00.00 [rcu_gp]
      4 root       0 -20       0      0      0 I   0,0   0,0   0:00.00 [rcu_par_gp]
      6 root       0 -20       0      0      0 I   0,0   0,0   0:00.00 [kworker/0:0H-kblockd]
      7 root      20   0       0      0      0 I   0,0   0,0   0:03.58 [kworker/u16:0-kcryptd/253:0]
      8 root       0 -20       0      0      0 I   0,0   0,0   0:00.00 [mm_percpu_wq]
      9 root      20   0       0      0      0 S   0,0   0,0   0:00.08 [ksoftirqd/0]
     10 root      20   0       0      0      0 I   0,0   0,0   0:02.65 [rcu_sched]

Das wurde nicht nur über den Bugzilla von RedHat berichtet, sondern auch von anderer Seite an die Entwickler bei LibreOffice gemeldet. Daher gibt es jetzt, so gefühlt 4 Monate später, einen Bugfix:

https://cgit.freedesktop.org/libreoffice/core/commit/?id=bdd149b1ff3d43b94cadc0d43365100c287c7639

Improve spell checking performance and impl. in several ways:
* do synchronous spell checking, avoiding an idle handler
* avoid continuous invalidations caused per-cell by spell-checking
* cache spell-checking information for a given SharedString to avoid repeated checking of frequently recurring strings.

 

Das mit dem Cache für gleiche Inhalte hätte man glaube ich bei Version 0.1 einbauen sollen, das ist nämlich naheliegend 😉

Jetzt fragt Ihr Euch, wieso berichte ich erst jetzt davon… Tja, „a maliciously crafted document can lead to a DOS like attack on linux“. Das wollten wir natürlich nicht noch fördern 😉  Es werden zwar nur die sichtbaren Zeilen geprüft, aber alle Spalten. Da jetzt der Patch vorliegt und verteilt wird, kann man es ruhig erzählen 🙂