Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Signal handler-fbsdws

46 views

Published on

シグナルハンドラーの使い方

Published in: Software
  • Be the first to comment

  • Be the first to like this

Signal handler-fbsdws

  1. 1. シグナルハンドラーで そんなことをするな!
  2. 2. libedit に bug があったけ ど、よく考えたらシグナ ルハンドラでそんなこと しちゃいけないよね!
  3. 3. シグナルハンドラの話 は終わりの方で
  4. 4. OpenBSD
  5. 5. ftp (client) が SEGV で 落ちる
  6. 6. SEGV 発生の経緯
  7. 7. ftp 起動直後の操作で発生
  8. 8. ftp> deb[TAB] で SEGV 発生
  9. 9. /usr/lib/libedit で SEGV
  10. 10. libedit はGNU Readline のようなもの
  11. 11. NetBSD 起源
  12. 12. char *el_display[] EditLine “ftp> 0” 行末に nul 初期状態 “0” el_line char *buffer 行末まで空白
  13. 13. char *el_display[] EditLine “ftp> deb 0” 行末に nul 入力 “deb0” el_line char *buffer
  14. 14. tmux 上でペインサイズ を変更で SIGWINCH
  15. 15. char *el_display[] EditLine シグナルハンドラーで実行 el_line char *buffer “0” “0” “deb0” 行頭に nul ウインドウサイズ変更のため free/malloc
  16. 16. char *el_display[] EditLine “0” “0” 行頭に nul SIGWINCH直後 el_line char *buffer “deb0”
  17. 17. char *el_display[] EditLine “0” TABキーで補完 el_line char *buffer “debug0” この文字列の文字数を記憶しているので、 “0” を除く“debug” の五文字を el_display にコピー コピー “0” 行頭に nul
  18. 18. char *el_display[] EditLine “debug” “0” 行末の nul が無い! TABキーで補完 el_line char *buffer “debug0” この文字列の文字数を記憶しているので、 “0” を除く“debug” の五文字を el_display にコピー コピー
  19. 19. char *el_display[] EditLine “0” 行末の nul が無い! TABキーで補完 el_line char *buffer re_refresh() で el_display を el_vdisplay にコピーする際に “debug” “debug0”
  20. 20. static void re_update_line(EditLine *el, wchar_t *old, wchar_t *new, int i) { </snip> /* * Find the end of both old and new */ while (*o) o++;
  21. 21. SEGV は el_display の 再設定ミス
  22. 22. NetBSD だと発生しな いかも?
  23. 23. NetBSD malloc によるメモリーの割り当て OpenBSD 不連続の空間連続した空間
  24. 24. SEGV 発生の経緯は以上
  25. 25. シグナルハンドラーで そんなことをするな!
  26. 26. char *el_display[] EditLine シグナルハンドラーで実行 el_line char *buffer ウインドウサイズ変更のため free/malloc
  27. 27. multi thread で共有資源をロ ックしないで free/malloc と 同じ状況
  28. 28. シグナルハンドラでは最低限 のことだけを行いましょう!
  29. 29. volatile sig_atomic_t flag; 使いましょう
  30. 30. OpenBSD に報告したけ ど誰も反応してくれない
  31. 31. 以上

×