fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering/***
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering This file is part of systemd.
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering Copyright 2014 Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering systemd is free software; you can redistribute it and/or modify it
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering under the terms of the GNU Lesser General Public License as published by
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering (at your option) any later version.
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering systemd is distributed in the hope that it will be useful, but
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering Lesser General Public License for more details.
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering You should have received a copy of the GNU Lesser General Public License
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering***/
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering#include <sys/mman.h>
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering#include "fd-util.h"
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering#include "sigbus.h"
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering#include "util.h"
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poetteringint main(int argc, char *argv[]) {
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering _cleanup_close_ int fd = -1;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering char template[] = "/tmp/sigbus-test-XXXXXX";
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering void *addr = NULL;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering uint8_t *p;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering sigbus_install();
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
0c0cdb06c139b52ff103287f6909b3daa5b2dc54Ronny Chevalier assert_se(sigbus_pop(&addr) == 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se((fd = mkostemp(template, O_RDWR|O_CREAT|O_EXCL)) >= 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(unlink(template) >= 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(fallocate(fd, 0, 0, page_size() * 8) >= 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering p = mmap(NULL, page_size() * 16, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(p != MAP_FAILED);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(sigbus_pop(&addr) == 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering p[0] = 0xFF;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(sigbus_pop(&addr) == 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering p[page_size()] = 0xFF;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(sigbus_pop(&addr) == 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering p[page_size()*8] = 0xFF;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering p[page_size()*8+1] = 0xFF;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering p[page_size()*10] = 0xFF;
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(sigbus_pop(&addr) > 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(addr == p + page_size() * 8);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(sigbus_pop(&addr) > 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(addr == p + page_size() * 10);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering assert_se(sigbus_pop(&addr) == 0);
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering sigbus_reset();
fa6ac76083b8ffc1309876459f54f9f0e2843731Lennart Poettering}