When you call realloc, either the returned pointer is the same as the original, or a new pointer is returned and the original pointer becomes invalid.  In the first case, calling free on both string1 and string2 results in a double-free since the pointers are equal.  In the second case, calling free on string1 is a double-free since it was already freed.
So either way you have a double-free which results in undefined behavior.
From the man page for realloc:
void *realloc(void *ptr, size_t size);
The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged in the range
  from the start of the region up to the minimum of the old and new
  sizes. If the new size is larger than the old size, the added memory
  will not be initialized. If ptr is NULL, then the call is equivalent
  to malloc(size), for all values of size; if size is equal to zero, and
  ptr is not NULL, then the call is equivalent to free(ptr). Unless ptr
  is NULL, it must have been returned by an earlier call to malloc(),
  calloc() or realloc(). If the area pointed to was moved, a free(ptr)
  is done.
The realloc() function returns a pointer to the newly allocated
  memory, which is suitably aligned for any kind of variable and may be
  different from ptr, or NULL if the request fails.
Also from the man page for free:
The free() function frees the memory space pointed to by ptr, which
  must have been returned by a previous call to malloc(), calloc() or
  realloc(). Otherwise, or if free(ptr) has already been called before,
  undefined behavior occurs. If ptr is NULL, no operation is performed.
You only need to free(string2).