Reading arbitrarily long lines from a file that is redirected as input
What can I do to reduce my code as I feel that it is getting too bloated.


No need for test.  Just call free();.  It handles free(NULL);

// if(strDate != NULL) {
//  free(strDate);
// }
free(strDate);

Minor: Style: I found the vertical spacing excessive creating challenges seeing the overall flow.  YMMV


What did I forget to do, what didn't I do right and what did I do that was unnecessary.


Certain functional error, lines is assigned a value that is not used.  Need to pass a "reference".

int expand(char **lines, size_t *lineMax) {
  char **tmp = realloc (...);
  ...
  lines = tmp;
  ... 
  return SUCCESS;
}

Functional error (possible part of your "One small problem." comment).  If fgets() returns NULL, code should only dispose of the buffer if this is the first fgets() in readLine().  Or: if the reason for NULL is due to ferror() and not feof().  
Functional corner case: strchr(buffer searches the buffer and can get fooled by fgets() reading a null charter and then a end-of-line such as "\0\n".  No true way to solve this and still use fgets().  

  newLineFound = strchr(buffer + size, '\n');
}
while(!newLineFound &amp;&amp; (size += BUFSIZ - 1)); 

Minor: Format to the presentation width.  

// avoid
int allEntries = FALSE, errorStatus = FALSE; // errorStatus is so I can report memory failures.

// better
// errorStatus is so I can report memory failures.
int allEntries = FALSE, errorStatus = FALSE; 

Use bool.  It is standard and well defined.

#include &lt;stdbool.h&gt;
// int allEntries = FALSE, errorStatus = FALSE;
bool allEntries = false, errorStatus = false;

Not all stderr are unbuffered. Suggest appending '\n' to your print to insure timely display.  Note either call below may make the same code with smart compilers.  2nd has the advantage of no problems with '%'

// fprintf (stderr,"Error, couldn't allocate any more memory.");
fprintf(stderr,"Error, couldn't allocate any more memory.\n");
// or 
fputs("Error, couldn't allocate any more memory.\n", stderr);

Confusing code: simplification suggestion

// char **tmp = realloc (lines, (*lineMax) * 2 * sizeof(*lines));
size_t newsize = *lineMax * 2;
void *tmp = realloc (lines, sizeof(*lines) * newsize);
....
*lineMax = newsize;

Lost memory

char **tmp = realloc (lines, (*lineMax) * 2 * sizeof(*lines));

if(!tmp) {

  // Add
  free(lines);

  return MEMFAILURE;
}

Functional corner case:  If *lineMax could ever be 0.  Returning NULL is OK when the size of 0 and not a MEMFAILURE.

char **tmp = realloc (lines, (*lineMax) * 2 * sizeof(*lines));

// if(!tmp) {
if(!tmp &amp;&amp; *lineMax) {
      return MEMFAILURE;
}

Functional: To be more resilient, check size before using the array.  getDates() does not control input of the count/size.

// move here
if((*numOfLines) &gt;= (*lineMax)) ...

lines[*numOfLines] = strDate;
(*numOfLines)++; 

// if((*numOfLines) == (*lineMax)) ...



Performance tips are welcome.


I/O is often a candidate for speed improvements.  For this code, if there is no other calls to stdin, I would use fread() and then process the lines  myself, reading large blocks.
On systems that use '\n' translation, improvement can be had by reading in binary mode. 
When a file ends without a final '\n', code is probably faster  appending one, insuring the rest of code does not have to check for that expectation.


GTG