чување f812d1c31155a73a299cac13e72b8a2da5c3a511
родитељ efcfcb1c83d5cd3a14985846362387cced877ac3
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Mon, 12 Jul 2021 11:17:17 +0200
Fix: state.first_shown_msgid was sometimes <1, resulting in SIGSEGV
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
| M | draw.c | | | 1 | - |
| M | po.c | | | 15 | +++++---------- |
| M | poe.c | | | 38 | +++++++++++++++++++++----------------- |
измењених датотека: 3, додавања: 26(+), брисања: 28(-)
diff --git a/draw.c b/draw.c
@@ -834,7 +834,6 @@ draw_list_visible(const struct DrawState* state)
flags_buf, MAXFLAGSBUF-1+2, MAXFLAGSBUF-1+2,
2, 0, LEFT, 0, 1, NULL, 0, 0))
return NULL;
- /* TODO: Highlight */
if (current->msgid)
u32_draw_string(MAXFLAGSBUF-1+2, cy, sel ?
LIST_MSGID_SEL_FG : LIST_MSGID_FG, sel ?
diff --git a/po.c b/po.c
@@ -201,7 +201,8 @@ u32_set_msgstr(struct PoEntry* entry, const uint32_t* msgstr, int msgstr_index,
entry->msgstr_count = msgstr_index + 1;
if (!entry->msgstr)
{
- newmsgstr = calloc(entry->msgstr_count, sizeof(uint32_t*));
+ newmsgstr = calloc(entry->msgstr_count,
+ sizeof(uint32_t*));
/* when the .po file is not a standard text file (no LF
* at end) */
if (state->untranslated_count > 0)
@@ -209,7 +210,8 @@ u32_set_msgstr(struct PoEntry* entry, const uint32_t* msgstr, int msgstr_index,
}
else
newmsgstr = realloc(entry->msgstr,
- entry->msgstr_count * sizeof(uint32_t*));
+ entry->msgstr_count *
+ sizeof(uint32_t*));
if (!newmsgstr)
return NULL;
*(newmsgstr + msgstr_index) = NULL;
@@ -378,20 +380,13 @@ load_file(struct DrawState* dstate, long* lineno, long* col)
{
if (entry->msgid)
dstate->msgid_count++;
- /*
- *else if (entry->obsolete)
- * dstate->obsolete_count++;
- */
}
- /*
- *if (entry->msgid || entry->obsolete)
- * dstate->untranslated_count--;
- */
/* file has < PO_DETECTION_LINES */
if (msgid_counter > 0)
return LOAD_ERR_NOT_PO_FILE;
+ dstate->first_shown_msgid = dstate->msgid_count > 0 ? 1 : 0;
update_statistics(dstate->entries, dstate, entry);
dstate->real_msgid_count = dstate->msgid_count + dstate->obsolete_count;
diff --git a/poe.c b/poe.c
@@ -862,11 +862,12 @@ next_match(struct DrawState* state)
state->msgid_count > 0 ? 1 : 0;
else if (state->msgid_count - state->msgid_number <
(state->maxy-1)/2)
- state->first_shown_msgid =
- state->msgid_count - (state->maxy-2);
+ state->first_shown_msgid = MAX(1,
+ state->msgid_count - (state->maxy-2));
else
- state->first_shown_msgid = state->msgid_number
- - (state->maxy-1)/2;
+ state->first_shown_msgid = MAX(1,
+ state->msgid_number
+ - (state->maxy-1)/2);
return;
}
@@ -898,11 +899,12 @@ prev_match(struct DrawState* state)
state->msgid_count > 0 ? 1 : 0;
else if (state->msgid_count - state->msgid_number <
(state->maxy-1)/2)
- state->first_shown_msgid =
- state->msgid_count - (state->maxy-2);
+ state->first_shown_msgid = MAX(1,
+ state->msgid_count - (state->maxy-2));
else
- state->first_shown_msgid = state->msgid_number
- - (state->maxy-1)/2;
+ state->first_shown_msgid = MAX(1,
+ state->msgid_number
+ - (state->maxy-1)/2);
return;
}
@@ -939,11 +941,12 @@ next_untranslated(struct DrawState* state)
state->msgid_count > 0 ? 1 : 0;
else if (state->msgid_count - state->msgid_number <
(state->maxy-1)/2)
- state->first_shown_msgid =
- state->msgid_count - (state->maxy-2);
+ state->first_shown_msgid = MAX(1,
+ state->msgid_count - (state->maxy-2));
else
- state->first_shown_msgid = state->msgid_number
- - (state->maxy-1)/2;
+ state->first_shown_msgid = MAX(1,
+ state->msgid_number
+ - (state->maxy-1)/2);
if (save_show_edit)
{
@@ -985,11 +988,12 @@ next_fuzzy(struct DrawState* state)
state->msgid_count > 0 ? 1 : 0;
else if (state->msgid_count - state->msgid_number <
(state->maxy-1)/2)
- state->first_shown_msgid =
- state->msgid_count - (state->maxy-2);
+ state->first_shown_msgid = MAX(1,
+ state->msgid_count - (state->maxy-2));
else
- state->first_shown_msgid = state->msgid_number
- - (state->maxy-1)/2;
+ state->first_shown_msgid = MAX(1,
+ state->msgid_number
+ - (state->maxy-1)/2);
if (save_show_edit)
{
@@ -1354,7 +1358,7 @@ move_list_end(struct DrawState* state)
state->error[0] = 0;
state->msgid_number = state->msgid_count;
state->first_shown_msgid = state->msgid_count > 0 ?
- state->msgid_number - (state->maxy - 2) : 0;
+ MAX(1, state->msgid_number - (state->maxy - 2)) : 0;
}
void