lib_pagecache ist nicht thread-safe!

  • 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 :exclamation_mark: 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!