Blame SOURCES/0001-rhbz-1527945-segv-on-failed-open-of-password-protect.patch

dc0b3e
From 243d94875dc9c24932c2aec5ec44cf31e310d006 Mon Sep 17 00:00:00 2001
dc0b3e
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
dc0b3e
Date: Thu, 21 Dec 2017 16:19:42 +0000
dc0b3e
Subject: [PATCH] rhbz#1527945 segv on failed open of password protected doc in
dc0b3e
 gnome-documents
dc0b3e
dc0b3e
Change-Id: I1bec502ae20d03214c673d8911792c89669c0fe9
dc0b3e
Reviewed-on: https://gerrit.libreoffice.org/46923
dc0b3e
Tested-by: Jenkins <ci@libreoffice.org>
dc0b3e
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
dc0b3e
(cherry picked from commit a61f45499856aad9910d82af1312a163504c15c2)
dc0b3e
dc0b3e
Lok: number callback enum for easier debugging
dc0b3e
dc0b3e
Since the entries and their order are part of the
dc0b3e
public API, and will not change, numbering them
dc0b3e
makes it easier to trap particular callbacks by
dc0b3e
their number (as that's what shows in logs and
dc0b3e
the debugger).
dc0b3e
dc0b3e
Change-Id: Ife2fe3e601ce3dce0939363d748fcb54d3c85fd4
dc0b3e
Reviewed-on: https://gerrit.libreoffice.org/31257
dc0b3e
Tested-by: Jenkins <ci@libreoffice.org>
dc0b3e
Reviewed-by: Ashod Nakashian <ashnakash@gmail.com>
dc0b3e
(cherry picked from commit 719f7cb94ce783349fb1cf366a78edd9996d3e37)
dc0b3e
dc0b3e
lokdocview: use std::string where possible
dc0b3e
dc0b3e
This also prevents an invalid memory access: we were storing the pointer
dc0b3e
to a temporary in the struct and then using it after temporary was gone.
dc0b3e
dc0b3e
Change-Id: I2b6d9df16bc24b222095ccbf45c9f0bd9c86ed65
dc0b3e
(cherry picked from commit 9d2e0d60c0381a4bb23fada14c80e032b68bf2a8)
dc0b3e
Reviewed-on: https://gerrit.libreoffice.org/46951
dc0b3e
Tested-by: Jenkins <ci@libreoffice.org>
dc0b3e
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
dc0b3e
(cherry picked from commit 4ed5f5b28aaaf4522b71f32fb2f9f6a960dbff69)
dc0b3e
---
dc0b3e
 include/LibreOfficeKit/LibreOfficeKitEnums.h | 64 ++++++++++++++--------------
dc0b3e
 libreofficekit/source/gtk/lokdocview.cxx     | 44 +++++++++----------
dc0b3e
 2 files changed, 53 insertions(+), 55 deletions(-)
dc0b3e
dc0b3e
diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h
dc0b3e
index 187fa9812e60..d2ccc0fdccd8 100644
dc0b3e
--- a/include/LibreOfficeKit/LibreOfficeKitEnums.h
dc0b3e
+++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h
dc0b3e
@@ -93,13 +93,13 @@ typedef enum
dc0b3e
      *
dc0b3e
      * @see LOK_FEATURE_PART_IN_INVALIDATION_CALLBACK.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_INVALIDATE_TILES,
dc0b3e
+    LOK_CALLBACK_INVALIDATE_TILES = 0,
dc0b3e
     /**
dc0b3e
      * The size and/or the position of the visible cursor changed.
dc0b3e
      *
dc0b3e
      * Rectangle format is the same as LOK_CALLBACK_INVALIDATE_TILES.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR,
dc0b3e
+    LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR = 1,
dc0b3e
     /**
dc0b3e
      * The list of rectangles representing the current text selection changed.
dc0b3e
      *
dc0b3e
@@ -108,7 +108,7 @@ typedef enum
dc0b3e
      * LOK_CALLBACK_INVALIDATE_TILES. When there is no selection, an empty
dc0b3e
      * string is provided.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_TEXT_SELECTION,
dc0b3e
+    LOK_CALLBACK_TEXT_SELECTION = 2,
dc0b3e
     /**
dc0b3e
      * The position and size of the cursor rectangle at the text
dc0b3e
      * selection start. It is used to draw the selection handles.
dc0b3e
@@ -118,7 +118,7 @@ typedef enum
dc0b3e
      *
dc0b3e
      * Rectangle format is the same as LOK_CALLBACK_INVALIDATE_TILES.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_TEXT_SELECTION_START,
dc0b3e
+    LOK_CALLBACK_TEXT_SELECTION_START = 3,
dc0b3e
     /**
dc0b3e
      * The position and size of the cursor rectangle at the text
dc0b3e
      * selection end. It is used to draw the selection handles.
dc0b3e
@@ -128,7 +128,7 @@ typedef enum
dc0b3e
      *
dc0b3e
      * Rectangle format is the same as LOK_CALLBACK_INVALIDATE_TILES.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_TEXT_SELECTION_END,
dc0b3e
+    LOK_CALLBACK_TEXT_SELECTION_END = 4,
dc0b3e
     /**
dc0b3e
      * The blinking text cursor is now visible or not.
dc0b3e
      *
dc0b3e
@@ -137,26 +137,26 @@ typedef enum
dc0b3e
      * LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR once it becomes false. Payload is
dc0b3e
      * either the "true" or the "false" string.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_CURSOR_VISIBLE,
dc0b3e
+    LOK_CALLBACK_CURSOR_VISIBLE = 5,
dc0b3e
     /**
dc0b3e
      * The size and/or the position of the graphic selection changed.
dc0b3e
      *
dc0b3e
      * Rectangle format is the same as LOK_CALLBACK_INVALIDATE_TILES.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_GRAPHIC_SELECTION,
dc0b3e
+    LOK_CALLBACK_GRAPHIC_SELECTION = 6,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * User clicked on an hyperlink that should be handled by other
dc0b3e
      * applications accordingly.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_HYPERLINK_CLICKED,
dc0b3e
+    LOK_CALLBACK_HYPERLINK_CLICKED = 7,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Emit state update to the client.
dc0b3e
      * For example, when cursor is on bold text, this callback is triggered
dc0b3e
      * with payload: ".uno:Bold=true"
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_STATE_CHANGED,
dc0b3e
+    LOK_CALLBACK_STATE_CHANGED = 8,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Start a "status indicator" (here restricted to a progress bar type
dc0b3e
@@ -172,25 +172,25 @@ typedef enum
dc0b3e
      * loading a document and then constructing a LibreOfficeKitDocument
dc0b3e
      * object.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_STATUS_INDICATOR_START,
dc0b3e
+    LOK_CALLBACK_STATUS_INDICATOR_START = 9,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Sets the numeric value of the status indicator.
dc0b3e
      * The payload should be a percentage, an integer between 0 and 100.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE,
dc0b3e
+    LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE = 10,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Ends the status indicator.
dc0b3e
      *
dc0b3e
      * Not necessarily ever emitted.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_STATUS_INDICATOR_FINISH,
dc0b3e
+    LOK_CALLBACK_STATUS_INDICATOR_FINISH = 11,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * No match was found for the search input
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_SEARCH_NOT_FOUND,
dc0b3e
+    LOK_CALLBACK_SEARCH_NOT_FOUND = 12,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Size of the document changed.
dc0b3e
@@ -198,14 +198,14 @@ typedef enum
dc0b3e
      * Payload format is "width, height", i.e. clients get the new size without
dc0b3e
      * having to do an explicit lok::Document::getDocumentSize() call.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_DOCUMENT_SIZE_CHANGED,
dc0b3e
+    LOK_CALLBACK_DOCUMENT_SIZE_CHANGED = 13,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The current part number is changed.
dc0b3e
      *
dc0b3e
      * Payload is a single 0-based integer.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_SET_PART,
dc0b3e
+    LOK_CALLBACK_SET_PART = 14,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Selection rectangles of the search result when find all is performed.
dc0b3e
@@ -231,7 +231,7 @@ typedef enum
dc0b3e
      * - searchResultSelection is an array of part-number and rectangle list
dc0b3e
      *   pairs, in LOK_CALLBACK_SET_PART / LOK_CALLBACK_TEXT_SELECTION format.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_SEARCH_RESULT_SELECTION,
dc0b3e
+    LOK_CALLBACK_SEARCH_RESULT_SELECTION = 15,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Result of the UNO command execution when bNotifyWhenFinished was set
dc0b3e
@@ -246,26 +246,26 @@ typedef enum
dc0b3e
      *     // TODO "result": "..."  // UNO Any converted to JSON (not implemented yet)
dc0b3e
      * }
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_UNO_COMMAND_RESULT,
dc0b3e
+    LOK_CALLBACK_UNO_COMMAND_RESULT = 16,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The size and/or the position of the cell cursor changed.
dc0b3e
      *
dc0b3e
      * Rectangle format is the same as LOK_CALLBACK_INVALIDATE_TILES.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_CELL_CURSOR,
dc0b3e
+    LOK_CALLBACK_CELL_CURSOR = 17,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The current mouse pointer style.
dc0b3e
      *
dc0b3e
      * Payload is a css mouse pointer style.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_MOUSE_POINTER,
dc0b3e
+    LOK_CALLBACK_MOUSE_POINTER = 18,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The text content of the formula bar in Calc.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_CELL_FORMULA,
dc0b3e
+    LOK_CALLBACK_CELL_FORMULA = 19,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Loading a document requires a password.
dc0b3e
@@ -274,7 +274,7 @@ typedef enum
dc0b3e
      * lok::Office::setDocumentPassword().  The document cannot be loaded
dc0b3e
      * without the password.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_DOCUMENT_PASSWORD,
dc0b3e
+    LOK_CALLBACK_DOCUMENT_PASSWORD = 20,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Editing a document requires a password.
dc0b3e
@@ -282,7 +282,7 @@ typedef enum
dc0b3e
      * Loading the document is blocked until the password is provided via
dc0b3e
      * lok::Office::setDocumentPassword().
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY,
dc0b3e
+    LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY = 21,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * An error happened.
dc0b3e
@@ -296,7 +296,7 @@ typedef enum
dc0b3e
      *     "message": freeform description
dc0b3e
      * }
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_ERROR,
dc0b3e
+    LOK_CALLBACK_ERROR = 22,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * Context menu structure
dc0b3e
@@ -318,7 +318,7 @@ typedef enum
dc0b3e
      *
dc0b3e
      *     {"text": "label text3", "type": "command", "command": ".uno:Something3", "checktype": "checkmark|radio|auto", "checked": "true|false"}
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_CONTEXT_MENU,
dc0b3e
+    LOK_CALLBACK_CONTEXT_MENU = 23,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The size and/or the position of the view cursor changed. A view cursor
dc0b3e
@@ -334,7 +334,7 @@ typedef enum
dc0b3e
      * - viewId is a value returned earlier by lok::Document::createView()
dc0b3e
      * - rectangle uses the format of LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_INVALIDATE_VIEW_CURSOR,
dc0b3e
+    LOK_CALLBACK_INVALIDATE_VIEW_CURSOR = 24,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The text selection in one of the other views has changed.
dc0b3e
@@ -349,7 +349,7 @@ typedef enum
dc0b3e
      * - viewId is a value returned earlier by lok::Document::createView()
dc0b3e
      * - selection uses the format of LOK_CALLBACK_TEXT_SELECTION.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_TEXT_VIEW_SELECTION,
dc0b3e
+    LOK_CALLBACK_TEXT_VIEW_SELECTION = 25,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The cell cursor in one of the other views has changed.
dc0b3e
@@ -364,7 +364,7 @@ typedef enum
dc0b3e
      * - viewId is a value returned earlier by lok::Document::createView()
dc0b3e
      * - rectangle uses the format of LOK_CALLBACK_CELL_CURSOR.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_CELL_VIEW_CURSOR,
dc0b3e
+    LOK_CALLBACK_CELL_VIEW_CURSOR = 26,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The size and/or the position of a graphic selection in one of the other
dc0b3e
@@ -380,7 +380,7 @@ typedef enum
dc0b3e
      * - viewId is a value returned earlier by lok::Document::createView()
dc0b3e
      * - selection uses the format of LOK_CALLBACK_INVALIDATE_TILES.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_GRAPHIC_VIEW_SELECTION,
dc0b3e
+    LOK_CALLBACK_GRAPHIC_VIEW_SELECTION = 27,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The blinking text cursor in one of the other views is now visible or
dc0b3e
@@ -396,7 +396,7 @@ typedef enum
dc0b3e
      * - viewId is a value returned earlier by lok::Document::createView()
dc0b3e
      * - visible uses the format of LOK_CALLBACK_CURSOR_VISIBLE.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_VIEW_CURSOR_VISIBLE,
dc0b3e
+    LOK_CALLBACK_VIEW_CURSOR_VISIBLE = 28,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The size and/or the position of a lock rectangle in one of the other
dc0b3e
@@ -412,7 +412,7 @@ typedef enum
dc0b3e
      * - viewId is a value returned earlier by lok::Document::createView()
dc0b3e
      * - rectangle uses the format of LOK_CALLBACK_INVALIDATE_TILES.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_VIEW_LOCK,
dc0b3e
+    LOK_CALLBACK_VIEW_LOCK = 29,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * The size of the change tracking table has changed.
dc0b3e
@@ -437,7 +437,7 @@ typedef enum
dc0b3e
      * - 'action' is either 'Add' or 'Remove', depending on if this is an
dc0b3e
      *   insertion into the table or a removal.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_REDLINE_TABLE_SIZE_CHANGED,
dc0b3e
+    LOK_CALLBACK_REDLINE_TABLE_SIZE_CHANGED = 30,
dc0b3e
 
dc0b3e
     /**
dc0b3e
      * An entry in the change tracking table has been modified.
dc0b3e
@@ -461,7 +461,7 @@ typedef enum
dc0b3e
      *
dc0b3e
      * - 'action' is 'Modify'.
dc0b3e
      */
dc0b3e
-    LOK_CALLBACK_REDLINE_TABLE_ENTRY_MODIFIED,
dc0b3e
+    LOK_CALLBACK_REDLINE_TABLE_ENTRY_MODIFIED = 31,
dc0b3e
 }
dc0b3e
 LibreOfficeKitCallbackType;
dc0b3e
 
dc0b3e
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
dc0b3e
index 0b48cf8b7373..bbf64bf9ec9a 100644
dc0b3e
--- a/libreofficekit/source/gtk/lokdocview.cxx
dc0b3e
+++ b/libreofficekit/source/gtk/lokdocview.cxx
dc0b3e
@@ -77,9 +77,9 @@ struct ViewRectangles
dc0b3e
 /// Private struct used by this GObject type
dc0b3e
 struct LOKDocViewPrivateImpl
dc0b3e
 {
dc0b3e
-    const gchar* m_aLOPath;
dc0b3e
-    const gchar* m_pUserProfileURL;
dc0b3e
-    const gchar* m_aDocPath;
dc0b3e
+    std::string m_aLOPath;
dc0b3e
+    std::string m_aUserProfileURL;
dc0b3e
+    std::string m_aDocPath;
dc0b3e
     std::string m_aRenderingArguments;
dc0b3e
     gdouble m_nLoadProgress;
dc0b3e
     gboolean m_bIsLoading;
dc0b3e
@@ -195,10 +195,7 @@ struct LOKDocViewPrivateImpl
dc0b3e
     std::map<int, ViewRectangle> m_aViewLockRectangles;
dc0b3e
 
dc0b3e
     LOKDocViewPrivateImpl()
dc0b3e
-        : m_aLOPath(nullptr),
dc0b3e
-        m_pUserProfileURL(nullptr),
dc0b3e
-        m_aDocPath(nullptr),
dc0b3e
-        m_nLoadProgress(0),
dc0b3e
+        : m_nLoadProgress(0),
dc0b3e
         m_bIsLoading(false),
dc0b3e
         m_bCanZoomIn(true),
dc0b3e
         m_bCanZoomOut(true),
dc0b3e
@@ -1736,7 +1733,7 @@ renderOverlay(LOKDocView* pDocView, cairo_t* pCairo)
dc0b3e
     if (priv->m_bEdit && priv->m_bCursorVisible && !isEmptyRectangle(priv->m_aVisibleCursor) && priv->m_aTextSelectionRectangles.empty())
dc0b3e
     {
dc0b3e
         // Have a cursor, but no selection: we need the middle handle.
dc0b3e
-        gchar* handleMiddlePath = g_strconcat (priv->m_aLOPath, CURSOR_HANDLE_DIR, "handle_image_middle.png", nullptr);
dc0b3e
+        gchar* handleMiddlePath = g_strconcat (priv->m_aLOPath.c_str(), CURSOR_HANDLE_DIR, "handle_image_middle.png", nullptr);
dc0b3e
         if (!priv->m_pHandleMiddle)
dc0b3e
         {
dc0b3e
             priv->m_pHandleMiddle = cairo_image_surface_create_from_png(handleMiddlePath);
dc0b3e
@@ -1764,7 +1761,7 @@ renderOverlay(LOKDocView* pDocView, cairo_t* pCairo)
dc0b3e
         if (!isEmptyRectangle(priv->m_aTextSelectionStart))
dc0b3e
         {
dc0b3e
             // Have a start position: we need a start handle.
dc0b3e
-            gchar* handleStartPath = g_strconcat (priv->m_aLOPath, CURSOR_HANDLE_DIR, "handle_image_start.png", nullptr);
dc0b3e
+            gchar* handleStartPath = g_strconcat (priv->m_aLOPath.c_str(), CURSOR_HANDLE_DIR, "handle_image_start.png", nullptr);
dc0b3e
             if (!priv->m_pHandleStart)
dc0b3e
             {
dc0b3e
                 priv->m_pHandleStart = cairo_image_surface_create_from_png(handleStartPath);
dc0b3e
@@ -1776,7 +1773,7 @@ renderOverlay(LOKDocView* pDocView, cairo_t* pCairo)
dc0b3e
         if (!isEmptyRectangle(priv->m_aTextSelectionEnd))
dc0b3e
         {
dc0b3e
             // Have a start position: we need an end handle.
dc0b3e
-            gchar* handleEndPath = g_strconcat (priv->m_aLOPath, CURSOR_HANDLE_DIR, "handle_image_end.png", nullptr);
dc0b3e
+            gchar* handleEndPath = g_strconcat (priv->m_aLOPath.c_str(), CURSOR_HANDLE_DIR, "handle_image_end.png", nullptr);
dc0b3e
             if (!priv->m_pHandleEnd)
dc0b3e
             {
dc0b3e
                 priv->m_pHandleEnd = cairo_image_surface_create_from_png(handleEndPath);
dc0b3e
@@ -2207,8 +2204,7 @@ openDocumentInThread (gpointer data)
dc0b3e
     }
dc0b3e
 
dc0b3e
     priv->m_pOffice->pClass->registerCallback(priv->m_pOffice, globalCallbackWorker, pDocView);
dc0b3e
-    priv->m_pDocument = priv->m_pOffice->pClass->documentLoad( priv->m_pOffice, priv->m_aDocPath );
dc0b3e
-    priv->m_eDocumentType = static_cast<LibreOfficeKitDocumentType>(priv->m_pDocument->pClass->getDocumentType(priv->m_pDocument));
dc0b3e
+    priv->m_pDocument = priv->m_pOffice->pClass->documentLoad( priv->m_pOffice, priv->m_aDocPath.c_str() );
dc0b3e
     if ( !priv->m_pDocument )
dc0b3e
     {
dc0b3e
         char *pError = priv->m_pOffice->pClass->getError( priv->m_pOffice );
dc0b3e
@@ -2216,6 +2212,7 @@ openDocumentInThread (gpointer data)
dc0b3e
     }
dc0b3e
     else
dc0b3e
     {
dc0b3e
+        priv->m_eDocumentType = static_cast<LibreOfficeKitDocumentType>(priv->m_pDocument->pClass->getDocumentType(priv->m_pDocument));
dc0b3e
         gdk_threads_add_idle(postDocumentLoad, pDocView);
dc0b3e
         g_task_return_boolean (task, true);
dc0b3e
     }
dc0b3e
@@ -2469,16 +2466,17 @@ static void lok_doc_view_set_property (GObject* object, guint propId, const GVal
dc0b3e
     switch (propId)
dc0b3e
     {
dc0b3e
     case PROP_LO_PATH:
dc0b3e
-        priv->m_aLOPath = g_value_dup_string (value);
dc0b3e
+        priv->m_aLOPath = g_value_get_string (value);
dc0b3e
         break;
dc0b3e
     case PROP_LO_POINTER:
dc0b3e
         priv->m_pOffice = static_cast<LibreOfficeKit*>(g_value_get_pointer(value));
dc0b3e
         break;
dc0b3e
     case PROP_USER_PROFILE_URL:
dc0b3e
-        priv->m_pUserProfileURL = g_value_dup_string(value);
dc0b3e
+        if (const gchar* pUserProfile = g_value_get_string(value))
dc0b3e
+            priv->m_aUserProfileURL = pUserProfile;
dc0b3e
         break;
dc0b3e
     case PROP_DOC_PATH:
dc0b3e
-        priv->m_aDocPath = g_value_dup_string (value);
dc0b3e
+        priv->m_aDocPath = g_value_get_string (value);
dc0b3e
         break;
dc0b3e
     case PROP_DOC_POINTER:
dc0b3e
         priv->m_pDocument = static_cast<LibreOfficeKitDocument*>(g_value_get_pointer(value));
dc0b3e
@@ -2523,16 +2521,16 @@ static void lok_doc_view_get_property (GObject* object, guint propId, GValue *va
dc0b3e
     switch (propId)
dc0b3e
     {
dc0b3e
     case PROP_LO_PATH:
dc0b3e
-        g_value_set_string (value, priv->m_aLOPath);
dc0b3e
+        g_value_set_string (value, priv->m_aLOPath.c_str());
dc0b3e
         break;
dc0b3e
     case PROP_LO_POINTER:
dc0b3e
         g_value_set_pointer(value, priv->m_pOffice);
dc0b3e
         break;
dc0b3e
     case PROP_USER_PROFILE_URL:
dc0b3e
-        g_value_set_string(value, priv->m_pUserProfileURL);
dc0b3e
+        g_value_set_string(value, priv->m_aUserProfileURL.c_str());
dc0b3e
         break;
dc0b3e
     case PROP_DOC_PATH:
dc0b3e
-        g_value_set_string (value, priv->m_aDocPath);
dc0b3e
+        g_value_set_string (value, priv->m_aDocPath.c_str());
dc0b3e
         break;
dc0b3e
     case PROP_DOC_POINTER:
dc0b3e
         g_value_set_pointer(value, priv->m_pDocument);
dc0b3e
@@ -2632,14 +2630,14 @@ static gboolean lok_doc_view_initable_init (GInitable *initable, GCancellable* /
dc0b3e
     if (priv->m_pOffice != nullptr)
dc0b3e
         return TRUE;
dc0b3e
 
dc0b3e
-    priv->m_pOffice = lok_init_2(priv->m_aLOPath, priv->m_pUserProfileURL);
dc0b3e
+    priv->m_pOffice = lok_init_2(priv->m_aLOPath.c_str(), priv->m_aUserProfileURL.empty() ? nullptr : priv->m_aUserProfileURL.c_str());
dc0b3e
 
dc0b3e
     if (priv->m_pOffice == nullptr)
dc0b3e
     {
dc0b3e
         g_set_error (error,
dc0b3e
                      g_quark_from_static_string ("LOK initialization error"), 0,
dc0b3e
                      "Failed to get LibreOfficeKit context. Make sure path (%s) is correct",
dc0b3e
-                     priv->m_aLOPath);
dc0b3e
+                     priv->m_aLOPath.c_str());
dc0b3e
         return FALSE;
dc0b3e
     }
dc0b3e
     priv->m_nLOKFeatures |= LOK_FEATURE_PART_IN_INVALIDATION_CALLBACK;
dc0b3e
@@ -3118,8 +3116,8 @@ SAL_DLLPUBLIC_EXPORT GtkWidget* lok_doc_view_new_from_widget(LOKDocView* pOldLOK
dc0b3e
 {
dc0b3e
     LOKDocViewPrivate& pOldPriv = getPrivate(pOldLOKDocView);
dc0b3e
     GtkWidget* pNewDocView = GTK_WIDGET(g_initable_new(LOK_TYPE_DOC_VIEW, /*cancellable=*/nullptr, /*error=*/nullptr,
dc0b3e
-                                                       "lopath", pOldPriv->m_aLOPath,
dc0b3e
-                                                       "userprofileurl", pOldPriv->m_pUserProfileURL,
dc0b3e
+                                                       "lopath", pOldPriv->m_aLOPath.c_str(),
dc0b3e
+                                                       "userprofileurl", pOldPriv->m_aUserProfileURL.c_str(),
dc0b3e
                                                        "lopointer", pOldPriv->m_pOffice,
dc0b3e
                                                        "docpointer", pOldPriv->m_pDocument,
dc0b3e
                                                        "halign", GTK_ALIGN_CENTER,
dc0b3e
@@ -3165,7 +3163,7 @@ lok_doc_view_open_document (LOKDocView* pDocView,
dc0b3e
     LOEvent* pLOEvent = new LOEvent(LOK_LOAD_DOC);
dc0b3e
     pLOEvent->m_pPath = pPath;
dc0b3e
 
dc0b3e
-    priv->m_aDocPath = pPath;
dc0b3e
+    g_object_set(G_OBJECT(pDocView), "docpath", pPath, nullptr);
dc0b3e
     if (pRenderingArguments)
dc0b3e
         priv->m_aRenderingArguments = pRenderingArguments;
dc0b3e
     g_task_set_task_data(task, pLOEvent, LOEvent::destroy);
dc0b3e
-- 
dc0b3e
2.14.3
dc0b3e