Commit fcd3f2cd authored by Michael Widenius's avatar Michael Widenius

Safety fix for Aria:

- Set lastinx= ~0 when last_key.keyinfo is set.


storage/maria/ma_check.c:
  Set lastinx= ~0 when last_key.keyinfo is set
storage/maria/ma_ft_boolean_search.c:
  Set lastinx= ~0 when last_key.keyinfo is set
storage/maria/ma_rt_index.c:
  Remove setting of info->lastkey.keyinfo, as this should already be set by caller
storage/maria/ma_search.c:
  Added ASSERT to ensure that info->last_key.keyinfo is properly set
storage/maria/ma_unique.c:
   Set lastinx= ~0 when last_key.keyinfo is set
parent 505c663a
...@@ -881,6 +881,7 @@ static int chk_index(HA_CHECK *param, MARIA_HA *info, MARIA_KEYDEF *keyinfo, ...@@ -881,6 +881,7 @@ static int chk_index(HA_CHECK *param, MARIA_HA *info, MARIA_KEYDEF *keyinfo,
} }
info->last_key.keyinfo= tmp_key.keyinfo= keyinfo; info->last_key.keyinfo= tmp_key.keyinfo= keyinfo;
info->lastinx= ~0; /* Safety */
tmp_key.data= tmp_key_buff; tmp_key.data= tmp_key_buff;
for ( ;; ) for ( ;; )
{ {
...@@ -1134,6 +1135,7 @@ static int check_keys_in_record(HA_CHECK *param, MARIA_HA *info, int extend, ...@@ -1134,6 +1135,7 @@ static int check_keys_in_record(HA_CHECK *param, MARIA_HA *info, int extend,
{ {
(*keyinfo->make_key)(info, &key, keynr, info->lastkey_buff, record, (*keyinfo->make_key)(info, &key, keynr, info->lastkey_buff, record,
start_recpos, 0); start_recpos, 0);
info->last_key.keyinfo= key.keyinfo;
if (extend) if (extend)
{ {
/* We don't need to lock the key tree here as we don't allow /* We don't need to lock the key tree here as we don't allow
......
...@@ -357,6 +357,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -357,6 +357,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
ftbw->key_root=info->s->state.key_root[ftb->keynr]; ftbw->key_root=info->s->state.key_root[ftb->keynr];
ftbw->keyinfo=info->s->keyinfo+ftb->keynr; ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo; info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo;
info->lastinx= ~0; /* Safety */
key.data= ftbw->word; key.data= ftbw->word;
key.data_length= ftbw->len; key.data_length= ftbw->len;
key.ref_length= 0; key.ref_length= 0;
...@@ -381,6 +382,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -381,6 +382,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
} }
info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo; info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo;
info->lastinx= ~0; /* Safety */
key.data= lastkey_buf; key.data= lastkey_buf;
key.data_length= USE_WHOLE_KEY; key.data_length= USE_WHOLE_KEY;
key.ref_length= 0; key.ref_length= 0;
......
...@@ -134,7 +134,6 @@ static int maria_rtree_find_req(MARIA_HA *info, MARIA_KEYDEF *keyinfo, ...@@ -134,7 +134,6 @@ static int maria_rtree_find_req(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
tmp_key.data_length= key_data_length; tmp_key.data_length= key_data_length;
info->cur_row.lastpos= _ma_row_pos_from_key(&tmp_key); info->cur_row.lastpos= _ma_row_pos_from_key(&tmp_key);
info->last_key.keyinfo= keyinfo;
info->last_key.data_length= key_data_length; info->last_key.data_length= key_data_length;
info->last_key.ref_length= share->base.rec_reflength; info->last_key.ref_length= share->base.rec_reflength;
info->last_key.flag= 0; info->last_key.flag= 0;
......
...@@ -97,6 +97,7 @@ int _ma_search(register MARIA_HA *info, MARIA_KEY *key, uint32 nextflag, ...@@ -97,6 +97,7 @@ int _ma_search(register MARIA_HA *info, MARIA_KEY *key, uint32 nextflag,
@note @note
Position to row is stored in info->lastpos Position to row is stored in info->lastpos
Last used key is stored in info->last_key
@return @return
@retval 0 ok (key found) @retval 0 ok (key found)
...@@ -122,6 +123,7 @@ static int _ma_search_no_save(register MARIA_HA *info, MARIA_KEY *key, ...@@ -122,6 +123,7 @@ static int _ma_search_no_save(register MARIA_HA *info, MARIA_KEY *key,
(ulong) (pos / info->s->block_size), (ulong) (pos / info->s->block_size),
nextflag, (ulong) info->cur_row.lastpos)); nextflag, (ulong) info->cur_row.lastpos));
DBUG_EXECUTE("key", _ma_print_key(DBUG_FILE, key);); DBUG_EXECUTE("key", _ma_print_key(DBUG_FILE, key););
DBUG_ASSERT(info->last_key.keyinfo == key->keyinfo);
if (pos == HA_OFFSET_ERROR) if (pos == HA_OFFSET_ERROR)
{ {
......
...@@ -34,6 +34,7 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record, ...@@ -34,6 +34,7 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
MARIA_KEYDEF *keyinfo= &info->s->keyinfo[def->key]; MARIA_KEYDEF *keyinfo= &info->s->keyinfo[def->key];
uchar *key_buff= info->lastkey_buff2; uchar *key_buff= info->lastkey_buff2;
MARIA_KEY key; MARIA_KEY key;
int error= 0;
DBUG_ENTER("_ma_check_unique"); DBUG_ENTER("_ma_check_unique");
DBUG_PRINT("enter",("unique_hash: %lu", (ulong) unique_hash)); DBUG_PRINT("enter",("unique_hash: %lu", (ulong) unique_hash));
...@@ -43,14 +44,19 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record, ...@@ -43,14 +44,19 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
/* The above changed info->lastkey_buff2. Inform maria_rnext_same(). */ /* The above changed info->lastkey_buff2. Inform maria_rnext_same(). */
info->update&= ~HA_STATE_RNEXT_SAME; info->update&= ~HA_STATE_RNEXT_SAME;
/* Setup that unique key is active key */
info->last_key.keyinfo= keyinfo; info->last_key.keyinfo= keyinfo;
/* any key pointer in data is destroyed */
info->lastinx= ~0;
DBUG_ASSERT(key.data_length == MARIA_UNIQUE_HASH_LENGTH); DBUG_ASSERT(key.data_length == MARIA_UNIQUE_HASH_LENGTH);
if (_ma_search(info, &key, SEARCH_FIND, info->s->state.key_root[def->key])) if (_ma_search(info, &key, SEARCH_FIND, info->s->state.key_root[def->key]))
{ {
info->page_changed=1; /* Can't optimize read next */ info->page_changed=1; /* Can't optimize read next */
info->cur_row.lastpos= lastpos; info->cur_row.lastpos= lastpos;
DBUG_RETURN(0); /* No matching rows */ goto end;
} }
for (;;) for (;;)
...@@ -64,7 +70,8 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record, ...@@ -64,7 +70,8 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
info->page_changed= 1; /* Can't optimize read next */ info->page_changed= 1; /* Can't optimize read next */
info->cur_row.lastpos= lastpos; info->cur_row.lastpos= lastpos;
DBUG_PRINT("info",("Found duplicate")); DBUG_PRINT("info",("Found duplicate"));
DBUG_RETURN(1); /* Found identical */ error= 1; /* Found identical */
goto end;
} }
DBUG_ASSERT(info->last_key.data_length == MARIA_UNIQUE_HASH_LENGTH); DBUG_ASSERT(info->last_key.data_length == MARIA_UNIQUE_HASH_LENGTH);
if (_ma_search_next(info, &info->last_key, SEARCH_BIGGER, if (_ma_search_next(info, &info->last_key, SEARCH_BIGGER,
...@@ -73,9 +80,12 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record, ...@@ -73,9 +80,12 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
{ {
info->page_changed= 1; /* Can't optimize read next */ info->page_changed= 1; /* Can't optimize read next */
info->cur_row.lastpos= lastpos; info->cur_row.lastpos= lastpos;
DBUG_RETURN(0); /* end of tree */ break; /* end of tree */
} }
} }
end:
DBUG_RETURN(error);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment