• Milos Vyletel's avatar
    perf tools: Fix race in build_id_cache__add_s() · 0635b0f7
    Milos Vyletel authored
    int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
                              const char *name, bool is_kallsyms, bool is_vdso)
    {
    ...
            if (access(filename, F_OK)) {
                   ^--------------------------------------------------------- [1]
                    if (is_kallsyms) {
                             if (copyfile("/proc/kallsyms", filename))
                                    goto out_free;
                    } else if (link(realname, filename) && copyfile(name, filename))
                                 ^-----------------------------^------------- [2]
                                                                \------------ [3]
                            goto out_free;
            }
    ...
    
    When multiple instances of perf record get to [1] at more or less same time and
    run access() one or more may get failure because the file does not exist yet
    (since the first instance did not have chance to link it yet).
    
    At this point the race moves to link() at [2] where first thread to get
    there links file and goes on but second one gets -EEXIST so it runs
    copyfile [3] which truncates the file.
    
    reproducer:
    
    rm -rf /root/.debug
    for cpu in $(awk '/processor/ {print $3}' /proc/cpuinfo); do
    	perf record -a -v -T -F 1000 -C $cpu \
    		-o perf-${cpu}.data sleep 5 2> /dev/null &
    done
    wait
    
    and simply search for empty files by:
    
    find /lib/modules/`uname -r`/kernel/* -size 0
    Signed-off-by: default avatarMilos Vyletel <milos@redhat.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Stephane Eranian <eranian@google.com>
    Link: http://lkml.kernel.org/r/1426847846-11112-1-git-send-email-milos@redhat.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    0635b0f7
build-id.c 11.6 KB