[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);