diff options
Diffstat (limited to 'apps/plugins')
-rw-r--r-- | apps/plugins/open_plugins.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/apps/plugins/open_plugins.c b/apps/plugins/open_plugins.c index 7230387efb..6deaf80f7d 100644 --- a/apps/plugins/open_plugins.c +++ b/apps/plugins/open_plugins.c | |||
@@ -87,6 +87,15 @@ static size_t pathbasename(const char *name, const char **nameptr) | |||
87 | *nameptr = q; | 87 | *nameptr = q; |
88 | return r - q; | 88 | return r - q; |
89 | } | 89 | } |
90 | static int op_entry_checksum(void) | ||
91 | { | ||
92 | if (op_entry.checksum != open_plugin_csum + | ||
93 | (op_entry.lang_id <= OPEN_PLUGIN_LANG_INVALID ? 0 : LANG_LAST_INDEX_IN_ARRAY)) | ||
94 | { | ||
95 | return 0; | ||
96 | } | ||
97 | return 1; | ||
98 | } | ||
90 | 99 | ||
91 | static bool op_entry_read(int fd, int selected_item, off_t data_sz) | 100 | static bool op_entry_read(int fd, int selected_item, off_t data_sz) |
92 | { | 101 | { |
@@ -94,7 +103,7 @@ static bool op_entry_read(int fd, int selected_item, off_t data_sz) | |||
94 | op_entry.lang_id = -1; | 103 | op_entry.lang_id = -1; |
95 | return ((selected_item >= 0) && | 104 | return ((selected_item >= 0) && |
96 | (rb->lseek(fd, selected_item * op_entry_sz, SEEK_SET) >= 0) && | 105 | (rb->lseek(fd, selected_item * op_entry_sz, SEEK_SET) >= 0) && |
97 | (rb->read(fd, &op_entry, data_sz) == data_sz)); | 106 | (rb->read(fd, &op_entry, data_sz) == data_sz) && op_entry_checksum() > 0); |
98 | } | 107 | } |
99 | 108 | ||
100 | static bool op_entry_read_name(int fd, int selected_item) | 109 | static bool op_entry_read_name(int fd, int selected_item) |
@@ -102,15 +111,6 @@ static bool op_entry_read_name(int fd, int selected_item) | |||
102 | return op_entry_read(fd, selected_item, op_name_sz); | 111 | return op_entry_read(fd, selected_item, op_name_sz); |
103 | } | 112 | } |
104 | 113 | ||
105 | static int op_entry_checksum(void) | ||
106 | { | ||
107 | if (op_entry.checksum != open_plugin_csum) | ||
108 | { | ||
109 | return 0; | ||
110 | } | ||
111 | return 1; | ||
112 | } | ||
113 | |||
114 | static int op_entry_read_opx(const char *path) | 114 | static int op_entry_read_opx(const char *path) |
115 | { | 115 | { |
116 | int ret = -1; | 116 | int ret = -1; |
@@ -174,7 +174,8 @@ failure: | |||
174 | 174 | ||
175 | static void op_entry_set_checksum(void) | 175 | static void op_entry_set_checksum(void) |
176 | { | 176 | { |
177 | op_entry.checksum = open_plugin_csum; | 177 | op_entry.checksum = open_plugin_csum + |
178 | (op_entry.lang_id <= OPEN_PLUGIN_LANG_INVALID ? 0 : LANG_LAST_INDEX_IN_ARRAY); | ||
178 | } | 179 | } |
179 | 180 | ||
180 | static void op_entry_set_name(void) | 181 | static void op_entry_set_name(void) |
@@ -466,7 +467,7 @@ static void op_entry_remove_empty(void) | |||
466 | while (resave == false && | 467 | while (resave == false && |
467 | rb->read(fd_dat, &op_entry, op_entry_sz) == op_entry_sz) | 468 | rb->read(fd_dat, &op_entry, op_entry_sz) == op_entry_sz) |
468 | { | 469 | { |
469 | if (op_entry.hash == 0) | 470 | if (op_entry.hash == 0 || !op_entry_checksum()) |
470 | resave = true; | 471 | resave = true; |
471 | } | 472 | } |
472 | } | 473 | } |
@@ -839,6 +840,12 @@ reopen_datfile: | |||
839 | }/* OP_EXT */ | 840 | }/* OP_EXT */ |
840 | } | 841 | } |
841 | 842 | ||
843 | for (int i = items - 1; i > 0 && !exit; i--) | ||
844 | { | ||
845 | if (!op_entry_read(fd_dat, i, op_entry_sz)) | ||
846 | items--; | ||
847 | } | ||
848 | |||
842 | if (items < 1 && !exit) | 849 | if (items < 1 && !exit) |
843 | { | 850 | { |
844 | char* cur_filename = rb->plugin_get_current_filename(); | 851 | char* cur_filename = rb->plugin_get_current_filename(); |