diff --git a/myisam/mi_test3.c b/myisam/mi_test3.c
index dca04a9a64b..27d23317b5c 100644
--- a/myisam/mi_test3.c
+++ b/myisam/mi_test3.c
@@ -40,7 +40,7 @@
 #endif
 
 
-const char *filename= "test3.MSI";
+const char *filename= "test3";
 uint tests=10,forks=10,key_cacheing=0,use_log=0;
 
 static void get_options(int argc, char *argv[]);
@@ -363,7 +363,7 @@ int test_write(MI_INFO *file,int id,int lock_type)
   }
 
   sprintf(record.id,"%7d",getpid());
-  strmov(record.text,"Testing...");
+  strnmov(record.text,"Testing...", sizeof(record.text));
 
   tries=(uint) rnd(100)+10;
   for (i=count=0 ; i < tries ; i++)
diff --git a/myisam/mi_write.c b/myisam/mi_write.c
index e059bbb569f..303e924118f 100644
--- a/myisam/mi_write.c
+++ b/myisam/mi_write.c
@@ -165,12 +165,7 @@ err:
     {
       uint j;
       for (j=0 ; j < share->base.keys ; j++)
-      {
-        if (is_tree_inited(&info->bulk_insert[j]))
-        {
-          reset_tree(&info->bulk_insert[j]);
-        }
-      }
+        mi_flush_bulk_insert(info, j);
     }
     info->errkey= (int) i;
     while ( i-- > 0)
@@ -329,7 +324,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
   uchar *temp_buff,*keypos;
   uchar keybuff[MI_MAX_KEY_BUFF];
   my_bool was_last_key;
-  my_off_t next_page;
+  my_off_t next_page, dupp_key_pos;
   DBUG_ENTER("w_search");
   DBUG_PRINT("enter",("page: %ld",page));
 
@@ -349,9 +344,9 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
 	/* get position to record with duplicated key */
     tmp_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&keypos,keybuff);
     if (tmp_key_length)
-      info->dupp_key_pos=_mi_dpos(info,0,keybuff+tmp_key_length);
+      dupp_key_pos=_mi_dpos(info,0,keybuff+tmp_key_length);
     else
-      info->dupp_key_pos= HA_OFFSET_ERROR;
+      dupp_key_pos= HA_OFFSET_ERROR;
     if (keyinfo->flag & HA_FULLTEXT)
     {
       uint off;
@@ -370,7 +365,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
       else
       {
         /* popular word. two-level tree. going down */
-        my_off_t root=info->dupp_key_pos;
+        my_off_t root=dupp_key_pos;
         keyinfo=&info->s->ft2_keyinfo;
         get_key_full_length_rdonly(off, key);
         key+=off;
@@ -389,6 +384,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
     }
     else /* not HA_FULLTEXT, normal HA_NOSAME key */
     {
+      info->dupp_key_pos= dupp_key_pos;
       my_afree((byte*) temp_buff);
       my_errno=HA_ERR_FOUND_DUPP_KEY;
       DBUG_RETURN(-1);
diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result
index cff43a821b3..7acc8a2d23f 100644
--- a/mysql-test/r/fulltext.result
+++ b/mysql-test/r/fulltext.result
@@ -399,3 +399,9 @@ select count(*) from t1;
 count(*)
 1
 drop table t1;
+create table t1 (a int primary key, b text, fulltext(b));
+create table t2 (a int, b text);
+insert t1 values (1, "aaaa"), (2, "bbbb");
+insert t2 values (10, "aaaa"), (2, "cccc");
+replace t1 select * from t2;
+drop table t1, t2;
diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test
index 41fbf3f27ac..008e965297f 100644
--- a/mysql-test/t/fulltext.test
+++ b/mysql-test/t/fulltext.test
@@ -308,3 +308,16 @@ REPAIR TABLE t1;
 select count(*) from t1;
 drop table t1;
 
+#
+# bug#6784
+# mi_flush_bulk_insert (on dup key error in mi_write)
+# was mangling info->dupp_key_pos
+#
+
+create table t1 (a int primary key, b text, fulltext(b));
+create table t2 (a int, b text);
+insert t1 values (1, "aaaa"), (2, "bbbb");
+insert t2 values (10, "aaaa"), (2, "cccc");
+replace t1 select * from t2;
+drop table t1, t2;
+