[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00757] using malloc in read_default()



小野寛生です

> ・私の手元では、jserver が jserverrc を読み込み中に fgets() で SIGSEGV
>   で死にます。

これの debug 中に (的外れでしたが) read_default() で大量に作成している
文字列を一時格納するための配列の領域を自動変数から malloc で確保するよ
うに変えてみました。この部分だと malloc を使う意味はあまりないかもしれ
ませんが、

・現状のまま
・malloc を使う

のどちらが好ましいでしょう?
Index: initjserv.c
===================================================================
RCS file: /cvs/FreeWnn/Wnn/jserver/initjserv.c,v
retrieving revision 1.7
diff -u -r1.7 initjserv.c
--- initjserv.c	2001/06/18 09:09:42	1.7
+++ initjserv.c	2001/09/24 09:24:04
@@ -34,6 +34,7 @@
 #endif
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <ctype.h>
 
 #if defined(HAVE_SYS_TYPES_H)
@@ -62,9 +63,12 @@
 
 static int
 expand_expr (s)
- /**    @LIBDIRの展開(但し、文字列の先頭のみ)。できない時は-1が
-        返り、その場合sの中身は着々とそのまんま。sの長さ<256と仮定してる。*/
- /**    @USR (env名、logname), @LANG の展開 */
+ /*
+  * @LIBDIRの展開(但し、文字列の先頭のみ)。できない時は-1が返り、
+  * その場合sの中身は着々とそのまんま。
+  * sの長さ < EXPAND_PATH_LENGTH と仮定している。
+  */
+ /* @USR (env名、logname), @LANG の展開 */
      char *s;
 {
   char tmp[EXPAND_PATH_LENGTH];
@@ -95,7 +99,7 @@
         }
       else
         *tmp = '\0';
-      /* ここまでは準備。s…先頭、s1…2文字目、p…最初の'/'のあったところ
+      /* ここまでは準備。s…先頭、s1…2文字目、p…最初の'/'のあったところ
          (ここで一旦切る)、tmp…それ以後のコピー。 */
 
       if (!strcmp (s1, "LIBDIR"))
@@ -143,14 +147,37 @@
 read_default ()
 {
   FILE *fp, *fopen ();
+/*
   char data[EXPAND_PATH_LENGTH];
   char code[EXPAND_PATH_LENGTH];
   char s[20][EXPAND_PATH_LENGTH];
+ */
+  char *data, *code, *s[20];
   register int num;
-#ifndef CHINESE
   register int i;
-#endif
 
+  data = (char *) malloc (EXPAND_PATH_LENGTH * sizeof(char));
+  if (data == NULL)
+    {
+      error1 ("jserver: malloc() failed in read_default()");
+      exit(1);
+    }
+  code = (char *) malloc (EXPAND_PATH_LENGTH * sizeof(char));
+  if (code == NULL)
+    {
+      error1 ("jserver: malloc() failed in read_default()");
+      exit(1);
+    }
+  for (i = 0; i < 20; i++)
+    {
+      s[i] = (char *) malloc (EXPAND_PATH_LENGTH * sizeof(char));
+      if (s[i] == NULL)
+        {
+          error1 ("jserver: malloc() failed in read_default()");
+          exit(1);
+        }
+    }
+
   strcpy (jserver_dir, JSERVER_DIR);
 
   if ((fp = fopen (jserverrcfile, "r")) == NULL)
@@ -210,8 +237,8 @@
           change_ascii_to_int (s[14], &default_para.p13);
           change_ascii_to_int (s[15], &default_para.p14);
           change_ascii_to_int (s[16], &default_para.p15);
-#ifndef CHINESE
         }
+#ifndef CHINESE
       else if (strcmp (code, "set_giji_eisuu") == 0 && num >= 2)
         {
           for (i = 0; i < num - 1; i++)
@@ -222,9 +249,15 @@
             {
               giji_eisuu[i] = 0xffff;
             }
-#endif
         }
+#endif
     }
+  free(data);
+  free(code);
+  for (i=0; i < 20; i++)
+    {
+      free(s[i]);
+    }
   fclose (fp);
   return (0);
 }
@@ -233,10 +266,10 @@
 read_default_files ()
 {
   FILE *fp, *fopen ();
-  char data[256];
+  char data[EXPAND_PATH_LENGTH];
   int num;
-  char code[256];
-  char file[256];
+  char code[EXPAND_PATH_LENGTH];
+  char file[EXPAND_PATH_LENGTH];
 
   if ((fp = fopen (jserverrcfile, "r")) == NULL)
     {
@@ -244,12 +277,12 @@
       printf ("Error can't open %s\n", jserverrcfile);
       return (-1);
     }
-  while (fgets (data, 256, fp) != NULL)
+  while (fgets (data, EXPAND_PATH_LENGTH, fp) != NULL)
     {
       num = sscanf (data, "%s %s", code, file);
       if (strcmp (code, "readfile") == 0 && num == 2)
         {
-          read_default_file (file, 256);
+          read_default_file (file, EXPAND_PATH_LENGTH);
         }
     }
   fclose (fp);


http://www.freewnn.org/ FreeWnn Project