Fix Fl_Tree::insert() with pos out ouf range (#18)

The given position to insert a new item was not checked  against the
valid range so the program  could crash if a position less than zero
or greater than children() was given. The position is now clamped to
the valid range, i.e. the item is either prepended or appended.

Fixes issue #18.
This commit is contained in:
Albrecht Schlosser 2019-01-25 17:39:20 +01:00
parent 9b272cfa4e
commit 2c5ba94458
3 changed files with 25 additions and 5 deletions

View File

@ -874,6 +874,14 @@ Fl_Tree_Item* Fl_Tree::insert_above(Fl_Tree_Item *above, const char *name) {
/**
Insert a new item \p 'name' into \p 'item's children at position \p 'pos'.
If \p pos is out of range the new item is
- prepended if \p pos \< 0 or
- appended if \p pos \> item->children().
Note: \p pos == children() is not considered out of range: the item is
appended to the child list.
Example:
\par
\code

View File

@ -387,10 +387,17 @@ Fl_Tree_Item *Fl_Tree_Item::add(const Fl_Tree_Prefs &prefs,
: 0; // failed? error
}
/// Insert a new item named \p 'new_label' into current item's
/// children at a specified position \p 'pos'.
/// \returns the new item inserted.
///
/**
Insert a new item named \p 'new_label' into current item's
children at a specified position \p 'pos'.
If \p pos is out of range the new item is
- prepended if \p pos \< 0 or
- appended if \p pos \> item->children().
\returns the new item inserted
\see Fl_Tree::insert()
*/
Fl_Tree_Item *Fl_Tree_Item::insert(const Fl_Tree_Prefs &prefs, const char *new_label, int pos) {
Fl_Tree_Item *item = new Fl_Tree_Item(_tree);
item->label(new_label);

View File

@ -109,9 +109,14 @@ void Fl_Tree_Item_Array::enlarge(int count) {
/// Insert an item at index position \p pos.
///
/// Handles enlarging array if needed, total increased by 1.
/// If \p pos == total(), an empty item is appended to the array.
/// If \p pos \>= total(), the item is appended to the array.
/// If \p pos \< 0, the item is prepended (works like pos == 0).
///
void Fl_Tree_Item_Array::insert(int pos, Fl_Tree_Item *new_item) {
if (pos < 0)
pos = 0;
else if (pos > _total)
pos = _total;
enlarge(1);
// printf("*** POS=%d TOTAL-1=%d NITEMS=%d\n", pos, _total-1, (_total-pos));
if ( pos <= (_total - 1) ) { // need to move memory around?