⬢ DragonFlyBSD Kernel Audit
DF-2752 / pipefinal.c
← back to finding ↓ download raw
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(void) {
    int p[2];
    if (pipe(p)) return 1;
    size_t sz = 20480;
    unsigned char out[65536], in[65536];
    for (size_t i = 0; i < sz; i++) out[i] = (unsigned char)(i % 251);
    ssize_t w = write(p[1], out, sz);
    ssize_t r = read(p[0], in, sz);
    printf("w=%zd r=%zd\n", w, r);
    long bad = 0; long first = -1, last = -1;
    for (ssize_t i = 0; i < r; i++)
        if (in[i] != out[i]) { bad++; if (first<0) first=i; last=i; }
    printf("corrupted bytes: %ld / %zd  range [%ld..%ld]\n", bad, r, first, last);
    printf("%s\n", bad ? "FAIL: non-pow2 kern.pipe.size aliases FIFO slots and corrupts in-flight pipe data"
                       : "PASS: no corruption");
    return bad ? 2 : 0;
}