Bug 660730: Use GStatBuf for portability

Thanks to Kean Johnston for pointing this out.

There are a few places in GTK that use "struct stat",
and then g_stat(), rather than using GStatBuf.This breaks things on
Windows. Since the size of struct stat can vary depending on other
flags specified, this has the potential to cause overwrites and is
trivial to fix.

Based on patch submitted by Kean Johnston
This commit is contained in:
Chun-wei Fan 2011-10-03 23:25:33 +08:00
parent 25e65dc1b5
commit eb8c2dfae2
4 changed files with 17 additions and 12 deletions

View File

@ -89,8 +89,8 @@ _gtk_icon_cache_new_for_path (const gchar *path)
gchar *cache_filename; gchar *cache_filename;
gint fd = -1; gint fd = -1;
struct stat st; GStatBuf st;
struct stat path_st; GStatBuf path_st;
CacheInfo info; CacheInfo info;
/* Check if we have a cache file */ /* Check if we have a cache file */
@ -107,7 +107,12 @@ _gtk_icon_cache_new_for_path (const gchar *path)
if (fd < 0) if (fd < 0)
goto done; goto done;
#ifdef G_OS_WIN32
#undef fstat /* Just in case */
#define fstat _fstat32
#endif
if (fstat (fd, &st) < 0 || st.st_size < 4) if (fstat (fd, &st) < 0 || st.st_size < 4)
goto done; goto done;

View File

@ -979,7 +979,7 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name)
GKeyFile *theme_file; GKeyFile *theme_file;
GError *error = NULL; GError *error = NULL;
IconThemeDirMtime *dir_mtime; IconThemeDirMtime *dir_mtime;
struct stat stat_buf; GStatBuf stat_buf;
priv = icon_theme->priv; priv = icon_theme->priv;
@ -1123,7 +1123,7 @@ load_themes (GtkIconTheme *icon_theme)
IconSuffix old_suffix, new_suffix; IconSuffix old_suffix, new_suffix;
GTimeVal tv; GTimeVal tv;
IconThemeDirMtime *dir_mtime; IconThemeDirMtime *dir_mtime;
struct stat stat_buf; GStatBuf stat_buf;
priv = icon_theme->priv; priv = icon_theme->priv;
@ -1948,7 +1948,7 @@ rescan_themes (GtkIconTheme *icon_theme)
IconThemeDirMtime *dir_mtime; IconThemeDirMtime *dir_mtime;
GList *d; GList *d;
int stat_res; int stat_res;
struct stat stat_buf; GStatBuf stat_buf;
GTimeVal tv; GTimeVal tv;
priv = icon_theme->priv; priv = icon_theme->priv;

View File

@ -2037,7 +2037,7 @@ gboolean
gtk_recent_info_exists (GtkRecentInfo *info) gtk_recent_info_exists (GtkRecentInfo *info)
{ {
gchar *filename; gchar *filename;
struct stat stat_buf; GStatBuf stat_buf;
gboolean retval = FALSE; gboolean retval = FALSE;
g_return_val_if_fail (info != NULL, FALSE); g_return_val_if_fail (info != NULL, FALSE);
@ -2049,7 +2049,7 @@ gtk_recent_info_exists (GtkRecentInfo *info)
filename = g_filename_from_uri (info->uri, NULL, NULL); filename = g_filename_from_uri (info->uri, NULL, NULL);
if (filename) if (filename)
{ {
if (stat (filename, &stat_buf) == 0) if (g_stat (filename, &stat_buf) == 0)
retval = TRUE; retval = TRUE;
g_free (filename); g_free (filename);

View File

@ -73,11 +73,11 @@ static gchar *var_name = "-";
#include <ftw.h> #include <ftw.h>
static struct stat cache_stat; static GStatBuf cache_stat;
static gboolean cache_up_to_date; static gboolean cache_up_to_date;
static int check_dir_mtime (const char *dir, static int check_dir_mtime (const char *dir,
const struct stat *sb, const GStatBuf *sb,
int tf) int tf)
{ {
if (tf != FTW_NS && sb->st_mtime > cache_stat.st_mtime) if (tf != FTW_NS && sb->st_mtime > cache_stat.st_mtime)
@ -118,7 +118,7 @@ static int check_dir_mtime (const char *dir,
gboolean gboolean
is_cache_up_to_date (const gchar *path) is_cache_up_to_date (const gchar *path)
{ {
struct stat path_stat, cache_stat; GStatBuf path_stat, cache_stat;
gchar *cache_path; gchar *cache_path;
int retval; int retval;
@ -1455,7 +1455,7 @@ build_cache (const gchar *path)
#endif #endif
GHashTable *files; GHashTable *files;
FILE *cache; FILE *cache;
struct stat path_stat, cache_stat; GStatBuf path_stat, cache_stat;
struct utimbuf utime_buf; struct utimbuf utime_buf;
GList *directories = NULL; GList *directories = NULL;
int fd; int fd;