Do I need to free the next pointer in this_user? It points to the next user struct in the linked list.
typedef struct user {
    char name[MAX_NAME];
    char profile_pic[MAX_NAME];  // This is a *filename*, not the file contents.
    struct post *first_post;
    struct user *friends[MAX_FRIENDS];
    struct user *next;
} User;

typedef struct post {
    char author[MAX_NAME];
    char *contents;
    time_t *date;
    struct post *next;
} Post;

Post *curr_post = this_user->first_post;
    while (curr_post != NULL) {
        Post* next_post = curr_post->next;
        free(curr_post->contents);
        free(curr_post->date);
        free(curr_post);
        curr_post = next_post;
    }
    free(this_user->next);
    free(this_user);