Author: ek.kato
Date: Thu Apr 17 02:09:18 2008
New Revision: 5423

Modified:
  trunk/gtk/compose.c
  trunk/qt/immodule-quiminputcontext.h
  trunk/qt/immodule-quiminputcontext_compose.cpp
  trunk/qt4/immodule/quiminputcontext.h
  trunk/qt4/immodule/quiminputcontext_compose.cpp
  trunk/xim/compose.cpp
  trunk/xim/xim.h

Log:
* gtk/compose.c (im_uim_create_compose_tree)
 - Check return value of get_lang_region() properly.
* qt/immodule-quiminputcontext.h
* qt/immodule-quiminputcontext_compose.cpp
* qt4/immodule/quiminputcontext.h
* qt4/immodule/quiminputcontext_compose.cpp
 - (get_compose_filename)
 - (TransFileName)
 - (get_lang_region)
   - Sync with gtk/compose.c.
* xim/xim.h
* xim/compose.cpp
 - (get_compose_filename)
 - (TransFileName)
   - Ditto.


Modified: trunk/gtk/compose.c
==============================================================================
--- trunk/gtk/compose.c (original)
+++ trunk/gtk/compose.c Thu Apr 17 02:09:18 2008
@@ -711,6 +711,7 @@
    char lang_region[BUFSIZ];
    const char *encoding;
    char *compose_env;
+    int ret;

    name[0] = '\0';
    compose_env = getenv("XCOMPOSEFILE");
@@ -733,9 +734,9 @@
    if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
        return;

-    get_lang_region(lang_region, sizeof(lang_region));
+    ret = get_lang_region(lang_region, sizeof(lang_region));
    g_get_charset(&encoding);
-    if (lang_region == NULL || encoding == NULL) {
+    if (!ret || encoding == NULL) {
        fprintf(stderr, "Warning: locale name is NULL\n");
        fclose(fp);
        return;

Modified: trunk/qt/immodule-quiminputcontext.h
==============================================================================
--- trunk/qt/immodule-quiminputcontext.h        (original)
+++ trunk/qt/immodule-quiminputcontext.h        Thu Apr 17 02:09:18 2008
@@ -139,14 +139,14 @@
    // for X11 Compose
    static DefTree *mTreeTop;
    static void create_compose_tree( void );
-    static char *get_compose_filename( void );
-    static char *TransFileName( char *name );
+    static int get_compose_filename( char *filename, size_t len );
+ static int TransFileName( char *transname, const char *name, size_t len );
    static void ParseComposeStringFile( FILE *fp );
    static void FreeComposeTree( DefTree *top );
static int parse_compose_line( FILE *fp, char **tokenbuf, size_t *buflen );
    static int get_mb_string( char *buf, unsigned int ks );
    static const char *get_encoding( void );
-    static char *get_lang_region( void );
+    static int get_lang_region( char *lang_region, size_t len );

    Compose *mCompose;
#endif

Modified: trunk/qt/immodule-quiminputcontext_compose.cpp
==============================================================================
--- trunk/qt/immodule-quiminputcontext_compose.cpp      (original)
+++ trunk/qt/immodule-quiminputcontext_compose.cpp      Thu Apr 17 02:09:18 2008
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/param.h>
#include <locale.h>
#include <errno.h>

@@ -362,7 +363,7 @@
                switch (c) {
                case '\\':
                case '"':
-                   *p++ = c;
+                   *p++ = (char)c;
                    len++;
                    break;
                case 'n':
@@ -426,12 +427,12 @@
                    token = ERROR;
                    goto string_error;
                default:
-                   *p++ = c;
+                   *p++ = (char)c;
                    len++;
                    break;
                }
            } else {
-               *p++ = c;
+               *p++ = (char)c;
                len++;
            }
        }
@@ -454,7 +455,7 @@
                *tokenbuf = (char *)realloc(*tokenbuf,  *buflen);
            }
            p = *tokenbuf;
-           *p++ = c;
+           *p++ = (char)c;
            len++;
            c = nextch(fp, lastch);
            while (isalnum(c) || c == '_' || c == '-') {
@@ -463,7 +464,7 @@
                        *tokenbuf = (char *)realloc(*tokenbuf,  *buflen);
                        p = *tokenbuf + len;
                }
-               *p++ = c;
+               *p++ = (char)c;
                len++;
                c = nextch(fp, lastch);
            }
@@ -510,42 +511,19 @@
    return(mask);
}

-char *
-QUimInputContext::TransFileName(char *name)
+int
+QUimInputContext::TransFileName(char *transname, const char *name, size_t len)
{
-    char *home = NULL, *lcCompose = NULL;
-    char *i = name, *ret, *j;
-    int l = 0;
+    char *home = NULL;
+    char lcCompose[MAXPATHLEN];
+    const char *i = name;
+    char *j;
+    char ret[MAXPATHLEN];

-    while (*i) {
-       if (*i == '%') {
-           i++;
-           switch (*i) {
-           case '%':
-               l++;
-               break;
-           case 'H':
-               home = getenv("HOME");
-               if (home)
-                   l += strlen(home);
-               break;
-           case 'L':
-               lcCompose = get_compose_filename();
-               if (lcCompose)
-                   l += strlen(lcCompose);
-               break;
-           }
-       } else {
-           l++;
-       }
-       i++;
-    }
-
-    j = ret = (char *)malloc(l + 1);
-    if (ret == NULL)
-       return ret;
+    j = ret;
    i = name;
-    while (*i) {
+    lcCompose[0] = ret[0] = '\0';
+    while (*i && j - ret < MAXPATHLEN - 1) {
        if (*i == '%') {
            i++;
            switch (*i) {
@@ -553,16 +531,17 @@
                *j++ = '%';
                break;
            case 'H':
+               home = getenv("HOME");
                if (home) {
-                   strcpy(j, home);
+                   strlcat(ret, home, sizeof(ret));
                    j += strlen(home);
                }
                break;
            case 'L':
-               if (lcCompose) {
-                   strcpy(j, lcCompose);
+               get_compose_filename(lcCompose, sizeof(lcCompose));
+               if (lcCompose[0] != '\0') {
+                   strlcat(ret, lcCompose, sizeof(ret));
                    j += strlen(lcCompose);
-                   free(lcCompose);
                }
                break;
            }
@@ -570,9 +549,11 @@
        } else {
            *j++ = *i++;
        }
+       *j = '\0';
    }
-    *j = '\0';
-    return ret;
+    strlcpy(transname, ret, len);
+
+    return 1;
}

#ifndef MB_LEN_MAX
@@ -587,23 +568,21 @@
   return codec->name();
}

-char *
-QUimInputContext::get_lang_region()
+int
+QUimInputContext::get_lang_region(char *locale, size_t len)
{
-    char *locale, *p;
+    char *p;

-    locale = setlocale(LC_CTYPE, NULL);
-    if (locale) {
-        locale = strdup(locale);
-    } else {
-        return NULL;
+    strlcpy(locale, setlocale(LC_CTYPE, NULL), len);
+    if (locale[0] == '\0') {
+        return 0;
    }

    p = strrchr(locale, '.');
    if (p)
        *p = '\0';

-    return locale;
+    return 1;
}

int
@@ -668,16 +647,15 @@
    n = 0;
    do {
        if ((token == KEY) && (strcmp("include", *tokenbuf) == 0)) {
-           char *filename;
+           char filename[MAXPATHLEN];
            FILE *infp;
            token = nexttoken(fp, tokenbuf, &lastch, buflen);
            if (token != KEY && token != STRING)
                goto error;

-           if ((filename = TransFileName(*tokenbuf)) == NULL)
+ if ((!TransFileName(filename, *tokenbuf, sizeof(filename))) || filename[0] == '\0')
                goto error;
            infp = fopen(filename, "r");
-           free(filename);
            if (infp == NULL)
                goto error;
            ParseComposeStringFile(infp);
@@ -875,119 +853,81 @@
void QUimInputContext::create_compose_tree()
{
    FILE *fp = NULL;
-    char *name, *tmpname = NULL;
-    char *lang_region;
+    char name[MAXPATHLEN];
+    char lang_region[BUFSIZ];
    const char *encoding;
+    char *compose_env;
+    int ret;

-    name = getenv("XCOMPOSEFILE");
+    name[0] = '\0';
+    compose_env = getenv("XCOMPOSEFILE");

-    if (name == NULL) {
+    if (compose_env != NULL) {
+       strlcpy(name, compose_env, sizeof(name));
+    } else {
        char *home = getenv("HOME");
        if (home != NULL) {
-           int hl = strlen(home);
-           tmpname = name = (char *)malloc(hl + 10 + 1);
-           if (name != NULL) {
-               strcpy(name, home);
-               strcpy(name + hl, "/.XCompose");
-               fp = fopen(name, "r");
-               if (fp == NULL) {
-                   free(name);
-                   name = tmpname = NULL;
-               }
-           }
+           snprintf(name, sizeof(name), "%s/.XCompose", home);
+           fp = fopen(name, "r");
+           if (fp == NULL)
+               name[0] = '\0';
        }
    }

-    if (name == NULL) {
-       tmpname = name = get_compose_filename();
-    }
-
-    if (name == NULL)
+    if (name[0] == '\0' && !get_compose_filename(name, sizeof(name)))
        return;
-    if (fp == NULL) {
-       fp = fopen(name, "r");
-    }
-    if (tmpname != NULL) {
-       free(tmpname);
-    }
-    if (fp == NULL)
+
+    if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
        return;

-    lang_region = get_lang_region();
+    ret = get_lang_region(lang_region, sizeof(lang_region));
    encoding = get_encoding();
-    if (lang_region == NULL || encoding == NULL) {
+    if (!ret || encoding == NULL) {
        fprintf(stderr, "Warning: locale name is NULL\n");
        fclose(fp);
-       free(lang_region);
        return;
    }

    ParseComposeStringFile(fp);
    fclose(fp);
-    free(lang_region);
}

-char *QUimInputContext::get_compose_filename()
+int QUimInputContext::get_compose_filename(char *filename, size_t len)
{
-    char *compose_dir_file;
-    char *locale;
-    char *lang_region;
+    char compose_dir_file[MAXPATHLEN], name[MAXPATHLEN];
+    char locale[BUFSIZ];
    const char *encoding;
+    char lang_region[BUFSIZ];
+    int ret;

    FILE *fp;
-    char buf[XLC_BUFSIZE], *name = NULL, *filename = NULL;
+    char buf[XLC_BUFSIZE];
    const char *xlib_dir = XLIB_DIR ;

-    lang_region = get_lang_region();
+    ret = get_lang_region(lang_region, sizeof(lang_region));
    encoding = get_encoding();

-    if (lang_region == NULL || encoding == NULL) {
-       free(lang_region);
-       return NULL;
-    }
-
-    locale = (char *)malloc(strlen(lang_region) + strlen(encoding) + 2);
-    if (locale == NULL) {
-       free(lang_region);
-       return NULL;
-    }
-    sprintf(locale, "%s.%s", lang_region, encoding);
-    free(lang_region);
+    if (!ret || encoding == NULL)
+       return 0;

- compose_dir_file = (char *)malloc(strlen(XLIB_DIR) + strlen(COMPOSE_DIR_FILE) + 2);
-    if (compose_dir_file == NULL) {
-       free(locale);
-       return NULL;
-    }
-    sprintf(compose_dir_file, "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);
+    snprintf(locale, sizeof(locale), "%s.%s", lang_region, encoding);
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);

    fp = fopen(compose_dir_file, "r");
    if (fp == NULL) {
        /* retry with fallback file */
        if (strcmp(FALLBACK_XLIB_DIR, XLIB_DIR)) {
-           compose_dir_file = (char *)realloc(compose_dir_file,
-                           strlen(FALLBACK_XLIB_DIR) +
-                           strlen(COMPOSE_DIR_FILE) + 2);
-           if (compose_dir_file == NULL) {
-               free(locale);
-               return NULL;
-           }
-           sprintf(compose_dir_file, "%s/%s",
+           snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
                            FALLBACK_XLIB_DIR, COMPOSE_DIR_FILE);
            fp = fopen(compose_dir_file, "r");
-           if (fp == NULL) {
-               free(locale);
-               free(compose_dir_file);
-               return NULL;
-           }
+           if (fp == NULL)
+               return 0;
            xlib_dir = FALLBACK_XLIB_DIR;
-       } else {
-           free(locale);
-           free(compose_dir_file);
-           return NULL;
-       }
+       } else
+           return 0;
    }

+    name[0] = '\0';
    while (fgets(buf, XLC_BUFSIZE, fp) != NULL) {
        char *p = buf;
        int n;
@@ -1004,28 +944,18 @@
        }
        from = args[1], to = args[0];
        if (!strcmp(from, locale)) {
-           name = (char *)malloc(strlen(to) + 1);
-           if (name != NULL) {
-               strcpy(name, to);
-           }
+           strlcpy(name, to, sizeof(name));
            break;
        }
    }
    fclose(fp);
-    free(locale);
-    free(compose_dir_file);

-    if (name == NULL)
-       return NULL;
+    if (name[0] == '\0')
+       return 0;

-    filename = (char *)malloc(strlen(xlib_dir) + strlen(XLOCALE_DIR) +
-                   strlen(name) + 3);
-    if (filename == NULL)
-       return NULL;
-    sprintf(filename, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
-    free(name);
+    snprintf(filename, len, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);

-    return filename;
+    return 1;
}

static int

Modified: trunk/qt4/immodule/quiminputcontext.h
==============================================================================
--- trunk/qt4/immodule/quiminputcontext.h       (original)
+++ trunk/qt4/immodule/quiminputcontext.h       Thu Apr 17 02:09:18 2008
@@ -148,14 +148,14 @@
    // for X11 Compose
    static DefTree *mTreeTop;
    static void create_compose_tree( void );
-    static char *get_compose_filename( void );
-    static char *TransFileName( char *name );
+    static int get_compose_filename( char *filename, size_t len );
+ static int TransFileName( char *transname, const char *name, size_t len );
    static void ParseComposeStringFile( FILE *fp );
    static void FreeComposeTree( DefTree *top );
static int parse_compose_line( FILE *fp, char **tokenbuf, size_t *buflen );
    static int get_mb_string( char *buf, unsigned int ks );
    static const char *get_encoding( void );
-    static char *get_lang_region( void );
+    static int get_lang_region( char *lang_region, size_t len );

    Compose *mCompose;
#endif

Modified: trunk/qt4/immodule/quiminputcontext_compose.cpp
==============================================================================
--- trunk/qt4/immodule/quiminputcontext_compose.cpp     (original)
+++ trunk/qt4/immodule/quiminputcontext_compose.cpp     Thu Apr 17 02:09:18 2008
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/param.h>
#include <locale.h>
#include <errno.h>
#ifdef HAVE_LANGINFO_CODESET
@@ -365,7 +366,7 @@
                switch (c) {
                case '\\':
                case '"':
-                   *p++ = c;
+                   *p++ = (char)c;
                    len++;
                    break;
                case 'n':
@@ -429,12 +430,12 @@
                    token = ERROR;
                    goto string_error;
                default:
-                   *p++ = c;
+                   *p++ = (char)c;
                    len++;
                    break;
                }
            } else {
-               *p++ = c;
+               *p++ = (char)c;
                len++;
            }
        }
@@ -457,7 +458,7 @@
                *tokenbuf = (char *)realloc(*tokenbuf,  *buflen);
            }
            p = *tokenbuf;
-           *p++ = c;
+           *p++ = (char)c;
            len++;
            c = nextch(fp, lastch);
            while (isalnum(c) || c == '_' || c == '-') {
@@ -466,7 +467,7 @@
                        *tokenbuf = (char *)realloc(*tokenbuf,  *buflen);
                        p = *tokenbuf + len;
                }
-               *p++ = c;
+               *p++ = (char)c;
                len++;
                c = nextch(fp, lastch);
            }
@@ -513,42 +514,19 @@
    return(mask);
}

-char *
-QUimInputContext::TransFileName(char *name)
+int
+QUimInputContext::TransFileName(char *transname, const char *name, size_t len)
{
-    char *home = NULL, *lcCompose = NULL;
-    char *i = name, *ret, *j;
-    int l = 0;
+    char *home = NULL;
+    char lcCompose[MAXPATHLEN];
+    const char *i = name;
+    char *j;
+    char ret[MAXPATHLEN];

-    while (*i) {
-       if (*i == '%') {
-           i++;
-           switch (*i) {
-           case '%':
-               l++;
-               break;
-           case 'H':
-               home = getenv("HOME");
-               if (home)
-                   l += strlen(home);
-               break;
-           case 'L':
-               lcCompose = get_compose_filename();
-               if (lcCompose)
-                   l += strlen(lcCompose);
-               break;
-           }
-       } else {
-           l++;
-       }
-       i++;
-    }
-
-    j = ret = (char *)malloc(l + 1);
-    if (ret == NULL)
-       return ret;
+    j = ret;
    i = name;
-    while (*i) {
+    lcCompose[0] = ret[0] = '\0';
+    while (*i && j - ret < MAXPATHLEN - 1) {
        if (*i == '%') {
            i++;
            switch (*i) {
@@ -556,16 +534,17 @@
                *j++ = '%';
                break;
            case 'H':
+               home = getenv("HOME");
                if (home) {
-                   strcpy(j, home);
+                   strlcat(ret, home, sizeof(ret));
                    j += strlen(home);
                }
                break;
            case 'L':
-               if (lcCompose) {
-                   strcpy(j, lcCompose);
+               get_compose_filename(lcCompose, sizeof(lcCompose));
+               if (lcCompose[0] != '\0') {
+                   strlcat(ret, lcCompose, sizeof(ret));
                    j += strlen(lcCompose);
-                   free(lcCompose);
                }
                break;
            }
@@ -573,9 +552,11 @@
        } else {
            *j++ = *i++;
        }
+       *j = '\0';
    }
-    *j = '\0';
-    return ret;
+    strlcpy(transname, ret, len);
+
+    return 1;
}

#ifndef MB_LEN_MAX
@@ -608,23 +589,21 @@
#endif
}

-char *
-QUimInputContext::get_lang_region()
+int
+QUimInputContext::get_lang_region(char *locale, size_t len)
{
-    char *locale, *p;
+    char *p;

-    locale = setlocale(LC_CTYPE, NULL);
-    if (locale) {
-        locale = strdup(locale);
-    } else {
-        return NULL;
+    strlcpy(locale, setlocale(LC_CTYPE, NULL), len);
+    if (locale[0] == '\0') {
+        return 0;
    }

    p = strrchr(locale, '.');
    if (p)
        *p = '\0';

-    return locale;
+    return 1;
}

int
@@ -689,16 +668,15 @@
    n = 0;
    do {
        if ((token == KEY) && (strcmp("include", *tokenbuf) == 0)) {
-           char *filename;
+           char filename[MAXPATHLEN];
            FILE *infp;
            token = nexttoken(fp, tokenbuf, &lastch, buflen);
            if (token != KEY && token != STRING)
                goto error;

-           if ((filename = TransFileName(*tokenbuf)) == NULL)
+ if ((!TransFileName(filename, *tokenbuf, sizeof(filename))) || filename[0] == '\0')
                goto error;
            infp = fopen(filename, "r");
-           free(filename);
            if (infp == NULL)
                goto error;
            ParseComposeStringFile(infp);
@@ -896,119 +874,82 @@
void QUimInputContext::create_compose_tree()
{
    FILE *fp = NULL;
-    char *name, *tmpname = NULL;
-    char *lang_region;
+    char name[MAXPATHLEN];
+    char lang_region[BUFSIZ];
    const char *encoding;
+    char *compose_env;
+    int ret;

-    name = getenv("XCOMPOSEFILE");
+    name[0] = '\0';
+    compose_env = getenv("XCOMPOSEFILE");

-    if (name == NULL) {
+    if (compose_env != NULL) {
+       strlcpy(name, compose_env, sizeof(name));
+    } else {
        char *home = getenv("HOME");
        if (home != NULL) {
-           int hl = strlen(home);
-           tmpname = name = (char *)malloc(hl + 10 + 1);
-           if (name != NULL) {
-               strcpy(name, home);
-               strcpy(name + hl, "/.XCompose");
-               fp = fopen(name, "r");
-               if (fp == NULL) {
-                   free(name);
-                   name = tmpname = NULL;
-               }
-           }
+           snprintf(name, sizeof(name), "%s/.XCompose", home);
+           fp = fopen(name, "r");
+           if (fp == NULL)
+               name[0] = '\0';
        }
    }

-    if (name == NULL) {
-       tmpname = name = get_compose_filename();
-    }
-
-    if (name == NULL)
+    if (name[0] == '\0' && !get_compose_filename(name, sizeof(name))) {
        return;
-    if (fp == NULL) {
-       fp = fopen(name, "r");
-    }
-    if (tmpname != NULL) {
-       free(tmpname);
    }
-    if (fp == NULL)
+
+    if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
        return;

-    lang_region = get_lang_region();
+    ret = get_lang_region(lang_region, sizeof(lang_region));
    encoding = get_encoding();
-    if (lang_region == NULL || encoding == NULL) {
+    if (!ret || encoding == NULL) {
        fprintf(stderr, "Warning: locale name is NULL\n");
        fclose(fp);
-       free(lang_region);
        return;
    }

    ParseComposeStringFile(fp);
    fclose(fp);
-    free(lang_region);
}

-char *QUimInputContext::get_compose_filename()
+int QUimInputContext::get_compose_filename(char *filename, size_t len)
{
-    char *compose_dir_file;
-    char *locale;
-    char *lang_region;
+    char compose_dir_file[MAXPATHLEN], name[MAXPATHLEN];
+    char locale[BUFSIZ];
    const char *encoding;
+    char lang_region[BUFSIZ];
+    int ret;

    FILE *fp;
-    char buf[XLC_BUFSIZE], *name = NULL, *filename = NULL;
+    char buf[XLC_BUFSIZE];
    const char *xlib_dir = XLIB_DIR ;

-    lang_region = get_lang_region();
+    ret = get_lang_region(lang_region, sizeof(lang_region));
    encoding = get_encoding();

-    if (lang_region == NULL || encoding == NULL) {
-       free(lang_region);
-       return NULL;
-    }
-
-    locale = (char *)malloc(strlen(lang_region) + strlen(encoding) + 2);
-    if (locale == NULL) {
-       free(lang_region);
-       return NULL;
-    }
-    sprintf(locale, "%s.%s", lang_region, encoding);
-    free(lang_region);
+    if (!ret || encoding == NULL)
+       return 0;

- compose_dir_file = (char *)malloc(strlen(XLIB_DIR) + strlen(COMPOSE_DIR_FILE) + 2);
-    if (compose_dir_file == NULL) {
-       free(locale);
-       return NULL;
-    }
-    sprintf(compose_dir_file, "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);
+    snprintf(locale, sizeof(locale), "%s.%s", lang_region, encoding);
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);

    fp = fopen(compose_dir_file, "r");
    if (fp == NULL) {
        /* retry with fallback file */
        if (strcmp(FALLBACK_XLIB_DIR, XLIB_DIR)) {
-           compose_dir_file = (char *)realloc(compose_dir_file,
-                           strlen(FALLBACK_XLIB_DIR) +
-                           strlen(COMPOSE_DIR_FILE) + 2);
-           if (compose_dir_file == NULL) {
-               free(locale);
-               return NULL;
-           }
-           sprintf(compose_dir_file, "%s/%s",
+           snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
                            FALLBACK_XLIB_DIR, COMPOSE_DIR_FILE);
            fp = fopen(compose_dir_file, "r");
-           if (fp == NULL) {
-               free(locale);
-               free(compose_dir_file);
-               return NULL;
-           }
+           if (fp == NULL)
+               return 0;
            xlib_dir = FALLBACK_XLIB_DIR;
-       } else {
-           free(locale);
-           free(compose_dir_file);
-           return NULL;
-       }
+       } else
+           return 0;
    }

+    name[0] = '\0';
    while (fgets(buf, XLC_BUFSIZE, fp) != NULL) {
        char *p = buf;
        int n;
@@ -1026,28 +967,18 @@
        }
        from = args[1], to = args[0];
        if (!strcmp(from, locale)) {
-           name = (char *)malloc(strlen(to) + 1);
-           if (name != NULL) {
-               strcpy(name, to);
-           }
+           strlcpy(name, to, sizeof(name));
            break;
        }
    }
    fclose(fp);
-    free(locale);
-    free(compose_dir_file);

-    if (name == NULL)
-       return NULL;
+    if (name[0] == '\0')
+       return 0;

-    filename = (char *)malloc(strlen(xlib_dir) + strlen(XLOCALE_DIR) +
-                   strlen(name) + 3);
-    if (filename == NULL)
-       return NULL;
-    sprintf(filename, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
-    free(name);
+    snprintf(filename, len, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);

-    return filename;
+    return 1;
}

static int

Modified: trunk/xim/compose.cpp
==============================================================================
--- trunk/xim/compose.cpp       (original)
+++ trunk/xim/compose.cpp       Thu Apr 17 02:09:18 2008
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/param.h>
#include <locale.h>
#include <iconv.h>
#include <errno.h>
@@ -363,42 +364,19 @@
    return(mask);
}

-char *
-XimIM::TransFileName(char *name)
+int
+XimIM::TransFileName(char *transname, const char *name, size_t len)
{
-    char *home = NULL, *lcCompose = NULL;
-    char *i = name, *ret, *j;
-    int l = 0;
+    char *home = NULL;
+    char lcCompose[MAXPATHLEN];
+    const char *i = name;
+    char *j;
+    char ret[MAXPATHLEN];

-    while (*i) {
-       if (*i == '%') {
-           i++;
-           switch (*i) {
-           case '%':
-               l++;
-               break;
-           case 'H':
-               home = getenv("HOME");
-               if (home)
-                   l += strlen(home);
-               break;
-           case 'L':
-               lcCompose = get_compose_filename();
-               if (lcCompose)
-                   l += strlen(lcCompose);
-               break;
-           }
-       } else {
-           l++;
-       }
-       i++;
-    }
-
-    j = ret = (char *)malloc(l + 1);
-    if (ret == NULL)
-       return ret;
+    j = ret;
    i = name;
-    while (*i) {
+    lcCompose[0] = ret[0] = '\0';
+    while (*i && j - ret < MAXPATHLEN - 1) {
        if (*i == '%') {
            i++;
            switch (*i) {
@@ -406,16 +384,17 @@
                *j++ = '%';
                break;
            case 'H':
+               home = getenv("HOME");
                if (home) {
-                   strcpy(j, home);
+                   strlcat(ret, home, sizeof(ret));
                    j += strlen(home);
                }
                break;
            case 'L':
-               if (lcCompose) {
-                   strcpy(j, lcCompose);
+               get_compose_filename(lcCompose, sizeof(lcCompose));
+               if (lcCompose[0] != '\0') {
+                   strlcat(ret, lcCompose, sizeof(ret));
                    j += strlen(lcCompose);
-                   free(lcCompose);
                }
                break;
            }
@@ -423,9 +402,11 @@
        } else {
            *j++ = *i++;
        }
+       *j = '\0';
    }
-    *j = '\0';
-    return ret;
+    strlcpy(transname, ret, len);
+
+    return 1;
}

#ifndef MB_LEN_MAX
@@ -496,16 +477,15 @@
    n = 0;
    do {
        if ((token == KEY) && (strcmp("include", *tokenbuf) == 0)) {
-           char *filename;
+           char filename[MAXPATHLEN];
            FILE *infp;
            token = nexttoken(fp, tokenbuf, &lastch, buflen);
            if (token != KEY && token != STRING)
                goto error;

-           if ((filename = TransFileName(*tokenbuf)) == NULL)
+ if (!TransFileName(filename, *tokenbuf, sizeof(filename)) || filename[0] == '\0')
                goto error;
            infp = fopen(filename, "r");
-           free(filename);
            if (infp == NULL)
                goto error;
            ParseComposeStringFile(infp);
@@ -695,41 +675,29 @@
void XimIM::create_compose_tree()
{
    FILE *fp = NULL;
-    char *name, *tmpname = NULL;
+    char name[MAXPATHLEN];
    const char *lang_region, *encoding;
+    char *compose_env;

-    name = getenv("XCOMPOSEFILE");
+    name[0] = '\0';
+    compose_env = getenv("XCOMPOSEFILE");

-    if (name == NULL) {
+    if (compose_env != NULL) {
+       strlcpy(name, compose_env, sizeof(name));
+    } else {
        char *home = getenv("HOME");
        if (home != NULL) {
-           int hl = strlen(home);
-           tmpname = name = (char *)malloc(hl + 10 + 1);
-           if (name != NULL) {
-               strcpy(name, home);
-               strcpy(name + hl, "/.XCompose");
-               fp = fopen(name, "r");
-               if (fp == NULL) {
-                   free(name);
-                   name = tmpname = NULL;
-               }
-           }
+           snprintf(name, sizeof(name), "%s/.XCompose", home);
+           fp = fopen(name, "r");
+           if (fp == NULL)
+               name[0] = '\0';
        }
    }

-    if (name == NULL) {
-       tmpname = name = get_compose_filename();
-    }
-
-    if (name == NULL)
+    if (name[0] == '\0' && !get_compose_filename(name, sizeof(name)))
        return;
-    if (fp == NULL) {
-       fp = fopen(name, "r");
-    }
-    if (tmpname != NULL) {
-       free(tmpname);
-    }
-    if (fp == NULL)
+
+    if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
        return;

    lang_region = get_lang_region();
@@ -749,61 +717,40 @@
    return mTreeTop;
}

-char *XimIM::get_compose_filename()
+int XimIM::get_compose_filename(char *filename, size_t len)
{
-    char *compose_dir_file;
-    char *locale;
+    char compose_dir_file[MAXPATHLEN], name[MAXPATHLEN];
+    char locale[BUFSIZ];
    const char *lang_region, *encoding;

    FILE *fp;
-    char buf[XLC_BUFSIZE], *name = NULL, *filename = NULL;
+    char buf[XLC_BUFSIZE];
    const char *xlib_dir = XLIB_DIR ;

    lang_region = get_lang_region();
    encoding = get_encoding();

    if (lang_region == NULL || encoding == NULL)
-       return NULL;
+       return 0;

-    locale = (char *)malloc(strlen(lang_region) + strlen(encoding) + 2);
-    if (locale == NULL)
-       return NULL;
-    sprintf(locale, "%s.%s", lang_region, encoding);
-
- compose_dir_file = (char *)malloc(strlen(XLIB_DIR) + strlen(COMPOSE_DIR_FILE) + 2);
-    if (compose_dir_file == NULL) {
-       free(locale);
-       return NULL;
-    }
-    sprintf(compose_dir_file, "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);
+    snprintf(locale, sizeof(locale), "%s.%s", lang_region, encoding);
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);

    fp = fopen(compose_dir_file, "r");
    if (fp == NULL) {
        /* retry with fallback file */
        if (strcmp(FALLBACK_XLIB_DIR, XLIB_DIR)) {
-           compose_dir_file = (char *)realloc(compose_dir_file,
-                           strlen(FALLBACK_XLIB_DIR) +
-                           strlen(COMPOSE_DIR_FILE) + 2);
-           if (compose_dir_file == NULL) {
-               free(locale);
-               return NULL;
-           }
-           sprintf(compose_dir_file, "%s/%s",
+           snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
                            FALLBACK_XLIB_DIR, COMPOSE_DIR_FILE);
            fp = fopen(compose_dir_file, "r");
-           if (fp == NULL) {
-               free(locale);
-               free(compose_dir_file);
-               return NULL;
-           }
+           if (fp == NULL)
+               return 0;
            xlib_dir = FALLBACK_XLIB_DIR;
-       } else {
-           free(locale);
-           free(compose_dir_file);
-           return NULL;
-       }
+       } else
+           return 0;
    }

+    name[0] = '\0';
    while (fgets(buf, XLC_BUFSIZE, fp) != NULL) {
        char *p = buf;
        int n;
@@ -820,28 +767,17 @@
        }
        from = args[1], to = args[0];
        if (!strcmp(from, locale)) {
-           name = (char *)malloc(strlen(to) + 1);
-           if (name != NULL) {
-               strcpy(name, to);
-           }
+           strlcpy(name, to, sizeof(name));
            break;
        }
    }
    fclose(fp);
-    free(locale);
-    free(compose_dir_file);

-    if (name == NULL)
-       return NULL;
-
-    filename = (char *)malloc(strlen(xlib_dir) + strlen(XLOCALE_DIR) +
-                   strlen(name) + 3);
-    if (filename == NULL)
-       return NULL;
-    sprintf(filename, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
-    free(name);
+    if (name[0] == '\0')
+       return 0;
+    snprintf(filename, len, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);

-    return filename;
+    return 1;
}

static int

Modified: trunk/xim/xim.h
==============================================================================
--- trunk/xim/xim.h     (original)
+++ trunk/xim/xim.h     Thu Apr 17 02:09:18 2008
@@ -208,8 +208,8 @@
    char *mLangRegion;

    // for Compose
-    char *get_compose_filename();
-    char *TransFileName(char *name);
+    int get_compose_filename(char *filename, size_t len);
+    int TransFileName(char *transname, const char *name, size_t len);
    void ParseComposeStringFile(FILE *fp);
    void FreeComposeTree(DefTree *top);
    int parse_compose_line(FILE *fp, char **tokenbuf, size_t *buflen);

Reply via email to