From 793d55b72a11e117394cb4688fd50b4ed95dd141 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Sat, 15 Nov 2008 23:51:58 -0600 Subject: [PATCH] winemenubuilder: escape & in xml menu files --- programs/winemenubuilder/winemenubuilder.c | 40 +++++++++++++++++++-------- 1 files changed, 28 insertions(+), 12 deletions(-) diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c index 4792d0d..201fc73 100644 --- a/programs/winemenubuilder/winemenubuilder.c +++ b/programs/winemenubuilder/winemenubuilder.c @@ -850,8 +850,9 @@ static BOOL write_menu_file(const char *filename) FILE *tempfile = NULL; char *lastEntry; char *name = NULL; + char *escaped_name = NULL; char *menuPath = NULL; - int i; + int i, j, name_size=0, escaped_size=0; int count = 0; BOOL ret = FALSE; @@ -886,20 +887,34 @@ static BOOL write_menu_file(const char *filename) fprintf(tempfile, "\n"); fprintf(tempfile, " Applications\n"); - name = HeapAlloc(GetProcessHeap(), 0, lstrlenA(filename) + 1); - if (name == NULL) goto end; + for (i=0; filename[i]; i++) + { + if (filename[i] == '&') + escaped_size += 4; + } + name_size = i+1; + escaped_size += name_size; + + name = HeapAlloc(GetProcessHeap(), 0, name_size); + escaped_name = HeapAlloc(GetProcessHeap(), 0, escaped_size); + if (name == NULL || escaped_name == NULL) goto end; lastEntry = name; - for (i = 0; filename[i]; i++) + for (i = 0, j = 0; filename[i]; i++, j++) { - name[i] = filename[i]; - if (filename[i] == '/') + escaped_name[j] = name[i] = filename[i]; + if (filename[i] == '&') + { + strcpy(&escaped_name[j+1], "amp;"); + j += 4; + } + else if (filename[i] == '/') { char *dir_file_name; struct stat st; - name[i] = 0; + escaped_name[j] = name[i] = 0; fprintf(tempfile, " \n"); - fprintf(tempfile, " %s%s\n", count ? "" : "wine-", name); - fprintf(tempfile, " %s%s.directory\n", count ? "" : "wine-", name); + fprintf(tempfile, " %s%s\n", count ? "" : "wine-", escaped_name); + fprintf(tempfile, " %s%s.directory\n", count ? "" : "wine-", escaped_name); dir_file_name = heap_printf("%s/desktop-directories/%s%s.directory", xdg_data_dir, count ? "" : "wine-", name); if (dir_file_name) @@ -908,15 +923,15 @@ static BOOL write_menu_file(const char *filename) write_directory_entry(lastEntry, dir_file_name); HeapFree(GetProcessHeap(), 0, dir_file_name); } - name[i] = '-'; + escaped_name[j] = name[i] = '-'; lastEntry = &name[i+1]; ++count; } } - name[i] = 0; + escaped_name[j] = name[i] = 0; fprintf(tempfile, " \n"); - fprintf(tempfile, " %s\n", name); + fprintf(tempfile, " %s\n", escaped_name); fprintf(tempfile, " \n"); for (i = 0; i < count; i++) fprintf(tempfile, " \n"); @@ -936,6 +951,7 @@ end: remove(tempfilename); free(tempfilename); HeapFree(GetProcessHeap(), 0, name); + HeapFree(GetProcessHeap(), 0, escaped_name); HeapFree(GetProcessHeap(), 0, menuPath); return ret; } -- 1.6.0.4