lib_pagecache Quellcode in git
Jede Funktion der Lib benutzt (spätestens über fd_touched_bytes):
fds = get_fd_status(fd);
und damit auf Speicher vom Array fd_status:
return &fd_status[fd];
allerdings kann fd_status jederzeit von einem anderem Thread umgebogen werden:
fd_status = realloc(fd_status, sizeof(*fd_status) * (fd + 1));
Stellt Euch einen Thread-Switch direkt nach get_fd_status() vor, bei dem der zweite Thread eine Vergrößerung der Tabelle fd_status mit realloc vornimmt. fds zeigt bei Rückkehr in den ersten Thread auf nicht mehr vorhandenen Speicher... pthread_mutex_lock innerhalb von get_fd_status hilft da gar nichts, weil das mutex nicht die Verwendung von &fd_status[fd] umfasst!
Lösungsansätze: Entweder Lock breiter fassen oder Speicher benutzen, der niemals frei wird (zumindest bis close).
Trotzdem einen guten Rutsch!