Not really sure why you're using a do { ... } while() loop here, when you could use: <code>
for (struct QueueNode * current = queue->queue; current; current = current->next) { copy current into a new node }
</code> It's not like you're deleting current in the loop body, or anything crazy like that.