Salut !
A priori la fonction strncpy marche très bien, elle est utilisée un peu partout depuis belle lurette. Donc si elle arrête la copie après 8 caractères, c'est qu'elle rencontre un caractère nul... quelle longueur as-tu passée en paramètre ?
Sinon pour ta solution alternative, je pense que le problème est que tu copies tout le buffer1 à chaque fois, sans t'arrêter au caractère nul. Donc si ton buffer1 fait aussi 5000 mais ne contient que 50 "vrais" caractères par exemple, ton buffer2 sera plein dès la première copie... d'où le débordement mémoire !
En tous cas je pense que tu ferais mieux d'utiliser strncpy, qui a fait ses preuves. Si ça ne fonctionne pas, c'est probablement que tu ne l'utilises pas de la bonne manière.
[EDIT] j'y pense tous d'un coup, est-ce que ton buffer1 ne serait pas déclaré en char* ? si c'est le cas, et que tu passes sizeof(buffer1) comme longueur à strncpy, c'est la taille du pointeur qui est passée, soit 8 octets si tu es en 64 bits...