[Win32] Don't leak return value from get_special_folder(). (#169348,

2005-03-09  Tor Lillqvist  <tml@novell.com>

	* glib/gutils.c (g_get_user_data_dir, g_get_user_config_dir,
	g_get_user_cache_dir, g_get_system_data_dirs,
	g_get_system_config_dirs): [Win32] Don't leak return value from
	get_special_folder(). (#169348, Daniel Atallah) Guard against
	g_home_dir being NULL, use g_tmp_dir/g_user_name in that case.
This commit is contained in:
Tor Lillqvist 2005-03-09 02:08:34 +00:00 committed by Tor Lillqvist
parent 331548d91c
commit 1607e3f1d0
5 changed files with 96 additions and 16 deletions

View File

@ -1,3 +1,11 @@
2005-03-09 Tor Lillqvist <tml@novell.com>
* glib/gutils.c (g_get_user_data_dir, g_get_user_config_dir,
g_get_user_cache_dir, g_get_system_data_dirs,
g_get_system_config_dirs): [Win32] Don't leak return value from
get_special_folder(). (#169348, Daniel Atallah) Guard against
g_home_dir being NULL, use g_tmp_dir/g_user_name in that case.
Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com> Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com>
* glib/gfileutils.c (g_file_replace): New API. A function to * glib/gfileutils.c (g_file_replace): New API. A function to

View File

@ -1,3 +1,11 @@
2005-03-09 Tor Lillqvist <tml@novell.com>
* glib/gutils.c (g_get_user_data_dir, g_get_user_config_dir,
g_get_user_cache_dir, g_get_system_data_dirs,
g_get_system_config_dirs): [Win32] Don't leak return value from
get_special_folder(). (#169348, Daniel Atallah) Guard against
g_home_dir being NULL, use g_tmp_dir/g_user_name in that case.
Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com> Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com>
* glib/gfileutils.c (g_file_replace): New API. A function to * glib/gfileutils.c (g_file_replace): New API. A function to

View File

@ -1,3 +1,11 @@
2005-03-09 Tor Lillqvist <tml@novell.com>
* glib/gutils.c (g_get_user_data_dir, g_get_user_config_dir,
g_get_user_cache_dir, g_get_system_data_dirs,
g_get_system_config_dirs): [Win32] Don't leak return value from
get_special_folder(). (#169348, Daniel Atallah) Guard against
g_home_dir being NULL, use g_tmp_dir/g_user_name in that case.
Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com> Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com>
* glib/gfileutils.c (g_file_replace): New API. A function to * glib/gfileutils.c (g_file_replace): New API. A function to

View File

@ -1,3 +1,11 @@
2005-03-09 Tor Lillqvist <tml@novell.com>
* glib/gutils.c (g_get_user_data_dir, g_get_user_config_dir,
g_get_user_cache_dir, g_get_system_data_dirs,
g_get_system_config_dirs): [Win32] Don't leak return value from
get_special_folder(). (#169348, Daniel Atallah) Guard against
g_home_dir being NULL, use g_tmp_dir/g_user_name in that case.
Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com> Tue Mar 8 15:46:54 2005 Søren Sandmann <sandmann@redhat.com>
* glib/gfileutils.c (g_file_replace): New API. A function to * glib/gfileutils.c (g_file_replace): New API. A function to

View File

@ -1872,17 +1872,21 @@ g_get_user_data_dir (void)
data_dir = get_special_folder (CSIDL_PERSONAL); data_dir = get_special_folder (CSIDL_PERSONAL);
#else #else
data_dir = (gchar *) g_getenv ("XDG_DATA_HOME"); data_dir = (gchar *) g_getenv ("XDG_DATA_HOME");
#endif
if (data_dir && data_dir[0]) if (data_dir && data_dir[0])
data_dir = g_strdup (data_dir); data_dir = g_strdup (data_dir);
else #endif
if (!data_dir || !data_dir[0])
{ {
if (!g_tmp_dir) if (!g_tmp_dir)
g_get_any_init (); g_get_any_init ();
data_dir = g_build_filename (g_home_dir, ".local", if (g_home_dir)
"share", NULL); data_dir = g_build_filename (g_home_dir, ".local",
"share", NULL);
else
data_dir = g_build_filename (g_tmp_dir, g_user_name, ".local",
"share", NULL);
} }
g_user_data_dir = data_dir; g_user_data_dir = data_dir;
@ -1922,16 +1926,19 @@ g_get_user_config_dir (void)
config_dir = get_special_folder (CSIDL_APPDATA); config_dir = get_special_folder (CSIDL_APPDATA);
#else #else
config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME"); config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME");
#endif
if (config_dir && config_dir[0]) if (config_dir && config_dir[0])
config_dir = g_strdup (config_dir); config_dir = g_strdup (config_dir);
else #endif
if (!config_dir || !config_dir[0])
{ {
if (!g_tmp_dir) if (!g_tmp_dir)
g_get_any_init (); g_get_any_init ();
config_dir = g_build_filename (g_home_dir, ".config", NULL); if (g_home_dir)
config_dir = g_build_filename (g_home_dir, ".config", NULL);
else
config_dir = g_build_filename (g_tmp_dir, g_user_name, ".config", NULL);
} }
g_user_config_dir = config_dir; g_user_config_dir = config_dir;
} }
@ -1970,15 +1977,19 @@ g_get_user_cache_dir (void)
cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */ cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */
#else #else
cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME"); cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME");
#endif
if (cache_dir && cache_dir[0]) if (cache_dir && cache_dir[0])
cache_dir = g_strdup (cache_dir); cache_dir = g_strdup (cache_dir);
else #endif
if (!cache_dir || !cache_dir[0])
{ {
if (!g_tmp_dir) if (!g_tmp_dir)
g_get_any_init (); g_get_any_init ();
cache_dir = g_build_filename (g_home_dir, ".cache", NULL); if (g_home_dir)
cache_dir = g_build_filename (g_home_dir, ".cache", NULL);
else
cache_dir = g_build_filename (g_tmp_dir, g_user_name, ".cache", NULL);
} }
g_user_cache_dir = cache_dir; g_user_cache_dir = cache_dir;
} }
@ -2014,17 +2025,43 @@ g_get_system_data_dirs (void)
if (!g_system_data_dirs) if (!g_system_data_dirs)
{ {
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
data_dirs = g_strconcat (get_special_folder (CSIDL_COMMON_APPDATA), char *appdata = get_special_folder (CSIDL_COMMON_APPDATA);
G_SEARCHPATH_SEPARATOR_S, char *docs = get_special_folder (CSIDL_COMMON_DOCUMENTS);
get_special_folder (CSIDL_COMMON_DOCUMENTS),
NULL); if (appdata && docs)
{
data_dirs = g_strconcat (appdata,
G_SEARCHPATH_SEPARATOR_S,
docs,
NULL);
g_free (appdata);
g_free (docs);
}
else if (appdata)
data_dirs = appdata;
else if (docs)
data_dirs = docs;
else
data_dirs = NULL;
if (data_dirs)
{
data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
g_free (data_dirs);
}
else
{
/* Punt, return empty list */
data_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0);
}
#else #else
data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS"); data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS");
if (!data_dirs || !data_dirs[0]) if (!data_dirs || !data_dirs[0])
data_dirs = "/usr/local/share/:/usr/share/"; data_dirs = "/usr/local/share/:/usr/share/";
#endif
data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0); data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
#endif
g_system_data_dirs = data_dir_vector; g_system_data_dirs = data_dir_vector;
} }
@ -2061,13 +2098,24 @@ g_get_system_config_dirs (void)
{ {
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA); conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA);
if (conf_dirs)
{
conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
g_free (conf_dirs);
}
else
{
/* Return empty list */
conf_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0);
}
#else #else
conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS"); conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS");
if (!conf_dirs || !conf_dirs[0]) if (!conf_dirs || !conf_dirs[0])
conf_dirs = "/etc/xdg"; conf_dirs = "/etc/xdg";
#endif
conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0); conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
#endif
g_system_config_dirs = conf_dir_vector; g_system_config_dirs = conf_dir_vector;
} }