From 7a1a4d6dddf7c2aaa7440de26ea18b6267282e91 Mon Sep 17 00:00:00 2001 From: Pavel Borzenkov Date: Wed, 6 Jul 2011 13:39:56 +0400 Subject: [PATCH] Don't allow to set bookmarks with reserved names Currently, 'page', 'offset' and 'scale' are reserved bookmark names. We should not allow to set arbitary bookmarks with such names. Also, this patch fixes memory leaks in the cmd_bookmark() function. Signed-off-by: Pavel Borzenkov Signed-off-by: Sebastian Ramacher --- config.def.h | 18 +++++++++++++++--- zathura.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/config.def.h b/config.def.h index 9937373..1d59488 100644 --- a/config.def.h +++ b/config.def.h @@ -27,9 +27,21 @@ static const char CONFIG_DIR[] = "~/.config/zathura"; static const char DATA_DIR[] = "~/.local/share/zathura"; /* bookmarks */ -static const char BM_PAGE_ENTRY[] = "page"; -static const char BM_PAGE_OFFSET[] = "offset"; -static const char BM_PAGE_SCALE[] = "scale"; +enum +{ + BM_PAGE_ENTRY = 0, + BM_PAGE_OFFSET, + BM_PAGE_SCALE, + BM_MAX, +}; + +static const char *bm_reserved_names[] = +{ + [BM_PAGE_ENTRY] = "page", + [BM_PAGE_OFFSET] = "offset", + [BM_PAGE_SCALE] = "scale", +}; + int save_position = 1; int save_zoom_level = 1; diff --git a/zathura.c b/zathura.c index e510b5e..4f897c7 100644 --- a/zathura.c +++ b/zathura.c @@ -389,6 +389,7 @@ GtkEventBox* create_completion_row(GtkBox*, char*, char*, gboolean); gchar* fix_path(const gchar*); gchar* path_from_env(const gchar*); gchar* get_home_dir(void); +gboolean is_reserved_bm_name(const char *); Completion* completion_init(void); CompletionGroup* completion_group_create(char*); @@ -628,6 +629,18 @@ init_bookmarks(void) read_bookmarks_file(); } +gboolean +is_reserved_bm_name(const char *bm_name) +{ + int i; + + for(i = 0; i < BM_MAX; i++) + if(strcmp(bm_reserved_names[i], bm_name) == 0) + return TRUE; + + return FALSE; +} + void init_keylist(void) { @@ -1058,18 +1071,18 @@ close_file(gboolean keep_monitor) { /* set current page */ g_key_file_set_integer(Zathura.Bookmarks.data, Zathura.PDF.file, - BM_PAGE_ENTRY, Zathura.PDF.page_number); + bm_reserved_names[BM_PAGE_ENTRY], Zathura.PDF.page_number); /* set page offset */ g_key_file_set_integer(Zathura.Bookmarks.data, Zathura.PDF.file, - BM_PAGE_OFFSET, Zathura.PDF.page_offset); + bm_reserved_names[BM_PAGE_OFFSET], Zathura.PDF.page_offset); } if (save_zoom_level) { /* set zoom level */ g_key_file_set_integer(Zathura.Bookmarks.data, Zathura.PDF.file, - BM_PAGE_SCALE, Zathura.PDF.scale); + bm_reserved_names[BM_PAGE_SCALE], Zathura.PDF.scale); } /* save bookmarks */ @@ -1393,19 +1406,25 @@ open_file(char* path, char* password) if(Zathura.Bookmarks.data && g_key_file_has_group(Zathura.Bookmarks.data, file)) { /* get last opened page */ - if(save_position && g_key_file_has_key(Zathura.Bookmarks.data, file, BM_PAGE_ENTRY, NULL)) - start_page = g_key_file_get_integer(Zathura.Bookmarks.data, file, BM_PAGE_ENTRY, NULL); + if(save_position && g_key_file_has_key(Zathura.Bookmarks.data, file, + bm_reserved_names[BM_PAGE_ENTRY], NULL)) + start_page = g_key_file_get_integer(Zathura.Bookmarks.data, file, + bm_reserved_names[BM_PAGE_ENTRY], NULL); /* get page offset */ - if(save_position && g_key_file_has_key(Zathura.Bookmarks.data, file, BM_PAGE_OFFSET, NULL)) - Zathura.PDF.page_offset = g_key_file_get_integer(Zathura.Bookmarks.data, file, BM_PAGE_OFFSET, NULL); + if(save_position && g_key_file_has_key(Zathura.Bookmarks.data, file, + bm_reserved_names[BM_PAGE_OFFSET], NULL)) + Zathura.PDF.page_offset = g_key_file_get_integer(Zathura.Bookmarks.data, file, + bm_reserved_names[BM_PAGE_OFFSET], NULL); if((Zathura.PDF.page_offset != 0) && (Zathura.PDF.page_offset != GOTO_OFFSET)) Zathura.PDF.page_offset = GOTO_OFFSET; /* get zoom level */ - if (save_zoom_level && g_key_file_has_key(Zathura.Bookmarks.data, file, BM_PAGE_SCALE, NULL)) + if (save_zoom_level && g_key_file_has_key(Zathura.Bookmarks.data, file, + bm_reserved_names[BM_PAGE_SCALE], NULL)) { - Zathura.PDF.scale = g_key_file_get_integer(Zathura.Bookmarks.data, file, BM_PAGE_SCALE, NULL); + Zathura.PDF.scale = g_key_file_get_integer(Zathura.Bookmarks.data, file, + bm_reserved_names[BM_PAGE_SCALE], NULL); Zathura.Global.adjust_mode = ADJUST_NONE; } if (Zathura.PDF.scale > zoom_max) @@ -1420,8 +1439,7 @@ open_file(char* path, char* password) for(i = 0; i < number_of_keys; i++) { - if(strcmp(keys[i], BM_PAGE_ENTRY) && strcmp(keys[i], BM_PAGE_OFFSET) - && strcmp(keys[i], BM_PAGE_SCALE)) + if(!is_reserved_bm_name(keys[i])) { Zathura.Bookmarks.bookmarks = realloc(Zathura.Bookmarks.bookmarks, (Zathura.Bookmarks.number_of_bookmarks + 1) * sizeof(Bookmark)); @@ -3061,12 +3079,20 @@ cmd_bookmark(int argc, char** argv) id = g_string_append(id, argv[i]); } + if(is_reserved_bm_name(id->str)) + { + notify(WARNING, "Can't set bookmark: reserved bookmark name"); + g_string_free(id, TRUE); + return FALSE; + } + /* check for existing bookmark to overwrite */ for(i = 0; i < Zathura.Bookmarks.number_of_bookmarks; i++) { if(!strcmp(id->str, Zathura.Bookmarks.bookmarks[i].id)) { Zathura.Bookmarks.bookmarks[i].page = Zathura.PDF.page_number; + g_string_free(id, TRUE); return TRUE; } } @@ -3079,6 +3105,7 @@ cmd_bookmark(int argc, char** argv) Zathura.Bookmarks.bookmarks[Zathura.Bookmarks.number_of_bookmarks].page = Zathura.PDF.page_number; Zathura.Bookmarks.number_of_bookmarks++; + g_string_free(id, TRUE); return TRUE; }