X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flocalcharset.c;h=e80a2c523991aea41240bc26e21ea2960a9fe05b;hb=606ec43d80c524d2f322129b3dd0676fce6ccea2;hp=86f43b58896712244f64b08f94ec7125bff2fe76;hpb=8aecbf69e84c78c3dd989b8d25368a1f2a7e6e0e;p=gnulib.git diff --git a/lib/localcharset.c b/lib/localcharset.c index 86f43b588..e80a2c523 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -45,9 +45,17 @@ # endif #endif +#include "path-concat.h" + char *xmalloc (); char *xrealloc (); +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ @@ -63,10 +71,10 @@ get_charset_aliases () if (cp == NULL) { FILE *fp; + char *file_name = path_concat (LIBDIR, "charset.alias", NULL); - fp = fopen (LIBDIR "/" "charset.alias", "r"); - if (fp == NULL) - /* File not found, treat it as empty. */ + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ cp = ""; else { @@ -124,6 +132,8 @@ get_charset_aliases () } charset_aliases = cp; + if (file_name != NULL) + free (file_name); } return cp;