Just cherry-picked to libreoffice-3-4 from master:
commit 1a790d00100183abfa71666d437af9115940c32a
Author: Michael Meeks <michael.meeks@novell.com>
Date: Wed May 4 20:27:43 2011 +0100
fix fdo#36838 by avoiding -L argument to pagein
diff --git a/desktop/source/pagein/pagein.c b/desktop/source/pagein/pagein.c
index 097b093..b625c57 100755
--- a/desktop/source/pagein/pagein.c
+++ b/desktop/source/pagein/pagein.c
@@ -107,16 +107,25 @@ int pagein_execute (int argc, char **argv)
if ((argv[i][0] == '@') && ((fp = fopen (argv[i], "r")) == 0))
{
- char path[1024];
+ char fullpath[4096];
+ char *path;
+ strncpy (fullpath, argv[i] + 1, 3000);
+ if (!(path = strrchr (fullpath, '/')))
+ path = fullpath;
+ else
+ path++;
+
if ((fp = fopen (&(argv[i][1]), "r")) == 0)
{
fprintf (stderr, "fopen %s: %s\n", &(argv[i][1]), strerror(errno));
continue;
}
- while (fgets (path, sizeof(path), fp) != 0)
+ while (fgets (path, 1024, fp) != 0)
{
path[strlen(path) - 1] = '\0', k = 0;
- if (do_pagein (path, &k) == 0)
+
+ /* paths relative to the location of the pagein file */
+ if (do_pagein (fullpath, &k) == 0)
{
/* accumulate total size */
nbytes += k;
diff --git a/desktop/unx/source/args.c b/desktop/unx/source/args.c
index 0f47f79..d69fe62 100644
--- a/desktop/unx/source/args.c
+++ b/desktop/unx/source/args.c
@@ -61,10 +61,10 @@ static struct {
{ "minimized", 0, 1, 0, 0, NULL },
/* pagein bits */
- { "writer", 0, 0, 0, 0, "@pagein-writer" },
- { "calc", 0, 0, 0, 0, "@pagein-calc" },
- { "draw", 0, 0, 0, 0, "@pagein-draw" },
- { "impress", 0, 0, 0, 0, "@pagein-impress" },
+ { "writer", 0, 0, 0, 0, "pagein-writer" },
+ { "calc", 0, 0, 0, 0, "pagein-calc" },
+ { "draw", 0, 0, 0, 0, "pagein-draw" },
+ { "impress", 0, 0, 0, 0, "pagein-impress" },
/* nothing much */
{ "version", 0, 1, 1, 1, NULL },
diff --git a/desktop/unx/source/start.c b/desktop/unx/source/start.c
index b0f5ab3..b6ae8aa 100755
--- a/desktop/unx/source/start.c
+++ b/desktop/unx/source/start.c
@@ -728,6 +728,24 @@ system_checks( void )
/* re-use the pagein code */
extern int pagein_execute (int argc, char **argv);
+#define REL_PATH "/../basis-link/program"
+static char *build_pagein_path (Args *args, const char *pagein_name)
+{
+ char *path;
+ rtl_String *app_path;
+
+ app_path = ustr_to_str (args->pAppPath);
+ path = malloc (app_path->length + strlen (pagein_name) + sizeof (REL_PATH) + 8);
+ strcpy (path, "@");
+ strcpy (path + 1, rtl_string_getStr (app_path));
+ strcat (path, "/../basis-link/program/");
+ strcat (path, pagein_name);
+
+ rtl_string_release( app_path );
+
+ return path;
+}
+
void
exec_pagein (Args *args)
{
@@ -735,24 +753,20 @@ exec_pagein (Args *args)
#ifdef MACOSX
(void)args;
#else
- char *argv[5];
- rtl_String *app_path;
-
- app_path = ustr_to_str (args->pAppPath);
+ char *argv[3];
+ /* don't use -L - since that does a chdir that breaks relative paths */
argv[0] = "dummy-pagein";
- argv[1] = malloc (app_path->length + sizeof ("-L/../basis-link/program") + 2);
- strcpy (argv[1], "-L");
- strcat (argv[1], app_path->buffer);
- strcat (argv[1], "/../basis-link/program");
- argv[2] = "@pagein-common";
- argv[3] = (char *)args->pPageinType;
- argv[4] = NULL;
-
- rtl_string_release( app_path );
+ argv[1] = build_pagein_path (args, "pagein-common");
+ if (args->pPageinType) {
+ argv[2] = build_pagein_path (args, args->pPageinType);
+ } else
+ argv[2] = NULL;
- pagein_execute (args->pPageinType ? 4 : 3, argv);
+ pagein_execute (args->pPageinType ? 3 : 2, argv);
+ if (argv[2])
+ free (argv[2]);
free (argv[1]);
#endif
}
--
michael.meeks@novell.com <><, Pseudo Engineer, itinerant idiot
Context
- [Libreoffice] pagein / relative path fix ... · Michael Meeks
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.