From b8f6e211a3a9351c6c620528f684b8b1253eab9f Mon Sep 17 00:00:00 2001 From: Morten Welinder Date: Fri, 20 Apr 2018 14:45:49 -0400 Subject: [PATCH] ssconvert: fix hash usage problem. --- ChangeLog | 3 +++ NEWS | 1 + src/ssconvert.c | 27 ++++++++++++++++----------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index c98a92ece..ee0bc3594 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2018-04-20 Morten Welinder + * src/ssconvert.c (merge_single): Avoid a + hash-changed-while-iterating problem. [#795408] + * src/xml-sax-write.c (xml_write_cell_and_position): In the clipboard case, write result values too. diff --git a/NEWS b/NEWS index 5a7ea2472..cb42ba84e 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Morten: * Fix paste from LibreOffice. * Fix paste to LibreOffice -- use Biff8. [#795280] * Allow inter-process paste-special. [#346630] + * Fix ssconvert --merge-to problem with names. [#795408] -------------------------------------------------------------------------- Gnumeric 1.12.39 diff --git a/src/ssconvert.c b/src/ssconvert.c index addb9a492..e1ab773c0 100644 --- a/src/ssconvert.c +++ b/src/ssconvert.c @@ -343,22 +343,15 @@ suggest_size (GSList *wbs, int *csuggest, int *rsuggest) } static void -cb_fixup_name_wb (G_GNUC_UNUSED gconstpointer key, +cb_collect_names (G_GNUC_UNUSED gconstpointer key, GnmNamedExpr *nexpr, - Workbook *wb) + GSList **plist) { - GnmParsePos newpos = nexpr->pos; - if (!expr_name_is_active (nexpr)) return; - - if (nexpr->pos.wb) { - newpos.wb = wb; - expr_name_set_pos (nexpr, &newpos); - } + *plist = g_slist_prepend (*plist, expr_name_ref (nexpr)); } - /* Append the sheets of workbook wb2 to workbook wb. Resize sheets if necessary. Fix workbook links in sheet if necessary. Merge names in workbook scope (conflicts result in an error). */ @@ -409,13 +402,25 @@ merge_single (Workbook *wb, Workbook *wb2, GOUndo *undo; char *sheet_name; gboolean err; + GSList *names = NULL; g_object_ref (sheet); workbook_sheet_delete (sheet); sheet->workbook = wb; /* Fix names that reference the old workbook */ - gnm_sheet_foreach_name (sheet, (GHFunc)cb_fixup_name_wb, wb); + gnm_sheet_foreach_name (sheet, (GHFunc)cb_collect_names, &names); + while (names) { + GnmNamedExpr *nexpr = names->data; + names = g_slist_delete_link (names, names); + + if (nexpr->pos.wb) { + GnmParsePos newpos = nexpr->pos; + newpos.wb = wb; + expr_name_set_pos (nexpr, &newpos); + } + expr_name_unref (nexpr); + } undo = gnm_sheet_resize (sheet, cmax, rmax, cc, &err); if (undo) -- 2.11.4.GIT