mirror of
https://gitlab.gnome.org/GNOME/gimp.git
synced 2025-07-03 17:33:25 +00:00
app: do not use PATH_MAX and realpath() on macOS.
See the comments in MR!424. Basically realpath relies on false assumptions (probably ones which used to be true when the API got created) on the max size of a path. Actually nowadays paths can be much bigger than what the macro advertizes or can even be unbounded. The Linux version of realpath() allows the second parameter to be NULL, in which case it would allocate the buffer, exactly for this reason (written in the BUGS section on the man). Unfortunately this behavior is not standardized in POSIX and the man from Apple I found does not indicate it will do this. So let's use g_canonicalize_filename() instead, which seems to do the right thing. Similarly use g_strdup_printf instead of g_snprintf().
This commit is contained in:
parent
5d14c59d2e
commit
03d6bc9726
1 changed files with 44 additions and 24 deletions
68
app/main.c
68
app/main.c
|
@ -39,7 +39,6 @@
|
|||
#endif /* G_OS_WIN32 */
|
||||
|
||||
#if defined(ENABLE_RELOCATABLE_RESOURCES) && defined(__APPLE__)
|
||||
#include <sys/param.h> /* PATH_MAX */
|
||||
#include <libgen.h> /* dirname */
|
||||
#include <sys/stat.h>
|
||||
#endif /* __APPLE__ */
|
||||
|
@ -312,13 +311,15 @@ gimp_macos_setenv (const char * progname)
|
|||
* Due to the latest changes it is not recommended to set it in the shell
|
||||
* wrapper anymore.
|
||||
*/
|
||||
gchar resolved_path[PATH_MAX];
|
||||
gchar *resolved_path;
|
||||
/* on some OSX installations open file limit is 256 and GIMP needs more */
|
||||
struct rlimit limit;
|
||||
struct rlimit limit;
|
||||
|
||||
limit.rlim_cur = 10000;
|
||||
limit.rlim_max = 10000;
|
||||
setrlimit (RLIMIT_NOFILE, &limit);
|
||||
if (realpath (progname, resolved_path) && !g_getenv ("GIMP_NO_WRAPPER"))
|
||||
resolved_path = g_canonicalize_filename (progname, NULL);
|
||||
if (resolved_path && ! g_getenv ("GIMP_NO_WRAPPER"))
|
||||
{
|
||||
/* set path to the app folder to make sure that our python is called
|
||||
* instead of system one
|
||||
|
@ -326,18 +327,25 @@ gimp_macos_setenv (const char * progname)
|
|||
static gboolean show_playground = TRUE;
|
||||
|
||||
gchar *path;
|
||||
gchar tmp[PATH_MAX];
|
||||
gchar *tmp;
|
||||
gchar *app_dir;
|
||||
gchar res_dir[PATH_MAX];
|
||||
gchar *res_dir;
|
||||
size_t path_len;
|
||||
struct stat sb;
|
||||
|
||||
app_dir = g_path_get_dirname (resolved_path);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/../Resources", app_dir);
|
||||
if (realpath (tmp, res_dir) && !stat (res_dir,&sb) && S_ISDIR (sb.st_mode))
|
||||
g_print ("GIMP is started as MacOS application\n");
|
||||
tmp = g_strdup_printf ("%s/../Resources", app_dir);
|
||||
res_dir = g_canonicalize_filename (tmp, NULL);
|
||||
g_free (tmp);
|
||||
if (res_dir && !stat (res_dir, &sb) && S_ISDIR (sb.st_mode))
|
||||
{
|
||||
g_print ("GIMP is started as MacOS application\n");
|
||||
}
|
||||
else
|
||||
return;
|
||||
{
|
||||
g_free (res_dir);
|
||||
return;
|
||||
}
|
||||
|
||||
path_len = strlen (g_getenv ("PATH") ? g_getenv ("PATH") : "") + strlen (app_dir) + 2;
|
||||
path = g_try_malloc (path_len);
|
||||
|
@ -353,34 +361,46 @@ gimp_macos_setenv (const char * progname)
|
|||
g_free (app_dir);
|
||||
g_setenv ("PATH", path, TRUE);
|
||||
g_free (path);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/lib/gtk-3.0/3.0.0", res_dir);
|
||||
tmp = g_strdup_printf ("%s/lib/gtk-3.0/3.0.0", res_dir);
|
||||
g_setenv ("GTK_PATH", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/etc/gtk-3.0/gtk.immodules", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/etc/gtk-3.0/gtk.immodules", res_dir);
|
||||
g_setenv ("GTK_IM_MODULE_FILE", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/lib/gegl-0.4", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/lib/gegl-0.4", res_dir);
|
||||
g_setenv ("GEGL_PATH", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/lib/babl-0.1", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/lib/babl-0.1", res_dir);
|
||||
g_setenv ("BABL_PATH", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache", res_dir);
|
||||
g_setenv ("GDK_PIXBUF_MODULE_FILE", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/etc/fonts", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/etc/fonts", res_dir);
|
||||
g_setenv ("FONTCONFIG_PATH", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s", res_dir);
|
||||
g_setenv ("PYTHONHOME", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/lib/python2.7:%s/lib/gimp/2.0/python", res_dir, res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/lib/python2.7:%s/lib/gimp/2.0/python", res_dir, res_dir);
|
||||
g_setenv ("PYTHONPATH", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/lib/gio/modules", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/lib/gio/modules", res_dir);
|
||||
g_setenv ("GIO_MODULE_DIR", tmp, TRUE);
|
||||
g_snprintf (tmp, sizeof(tmp), "%s/share/libwmf/fonts", res_dir);
|
||||
g_free (tmp);
|
||||
tmp = g_strdup_printf ("%s/share/libwmf/fonts", res_dir);
|
||||
g_setenv ("WMF_FONTDIR", tmp, TRUE);
|
||||
if (g_getenv ("HOME")!=NULL)
|
||||
g_free (tmp);
|
||||
if (g_getenv ("HOME") != NULL)
|
||||
{
|
||||
g_snprintf (tmp, sizeof(tmp),
|
||||
"%s/Library/Application Support/GIMP/3.00/cache",
|
||||
g_getenv("HOME"));
|
||||
tmp = g_strdup_printf ("%s/Library/Application Support/GIMP/3.00/cache",
|
||||
g_getenv ("HOME"));
|
||||
g_setenv ("XDG_CACHE_HOME", tmp, TRUE);
|
||||
g_free (tmp);
|
||||
}
|
||||
g_free (res_dir);
|
||||
}
|
||||
g_free (resolved_path);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue