Canna3.7p3 addwords segfault

time_t が64bitなOSで addwords すると cannaserver がこけますな。

--- lib/RK/dd.c 17 Sep 2003 08:50:52 -0000      1.5
+++ lib/RK/dd.c 18 Jun 2012 07:37:59 -0000
@@ -742,7 +742,7 @@
   int ret = -1;
   int tmpres;
   int          fdes;
-  long       tloc;
+  time_t       tloc;
 #ifdef __EMX__
   struct stat    statbuf;
 #endif
@@ -818,7 +818,7 @@
 #endif
 /* header */
   tloc = time(0);
-  strcpy(whattime, ctime(&tloc));
+  strncpy(whattime, ctime(&tloc), RK_LINE_BMAX);
   whattime[strlen(whattime)-1] = 0;
   (void)strcpy(header, "#CANNA dics.dir [");
   (void)strcat(header, whattime);

こういうのの発見の仕方。

  1. make CC='gcc -g' で再構築する
  2. libcanna.soなんかにもデバッグオプション(-g)があったほうがいいので そのまま make install する
  3. cannaserver -d のように、foreground で起動するのをgdb配下で行なう。
    gdb cannaserver
    gdb> run -d
    
  4. 落とす。今回は addwords すると落ちるので別端末から addwords hoge とかする。
  5. gdbでトレースが表示されるので where で確認。
  6. みつかる。直す。パッチを作る。