Non ho capito una parte del tuo codice:
codice:
size_t mem_nec = (end_str1 + strlen(str2))*sizeof(char);

if (mem_nec > mem_str1) {
   return (NULL);		
}
Dato che mem_str1 è la lunghezza di str1 sarà sempre minore della somma data da se stesso + la lunghezza di un'altra stringa (a meno che la seconda stringa non sia nulla). Tantopiù che confronti il valore di una lunghezza di una stringa con un valore di [i]memoria occupata[/b] da una stringa, nettamente più lunga.

Il byte in più che ti viene restituito, probabilmente, è il terminatore NULL, che viene sottointeso nelle stringhe fisse:
codice:
char *miaStringa = "Ciao";

equivale a

|--------------------|
| C | I | A | O | \0 |
|--------------------|
Ciao.