/* * Seccomp BPF example using a macro-based generator. * * Copyright (c) 2012 The Chromium OS Authors * Author: Will Drewry * * The code may be used by anyone for any purpose, * and can serve as a starting point for developing * applications using prctl(PR_ATTACH_SECCOMP_FILTER). */ #include #include #include #include #include #include #include #include "bpf-helper.h" #ifndef PR_SET_NO_NEW_PRIVS #define PR_SET_NO_NEW_PRIVS 38 #endif int main(int argc, char **argv) { struct bpf_labels l = { .count = 0, }; static const char msg1[] = "Please type something: "; static const char msg2[] = "You typed: "; char buf[256]; struct sock_filter filter[] = { /* TODO: LOAD_SYSCALL_NR(arch) and enforce an arch */ LOAD_SYSCALL_NR, SYSCALL(__NR_exit, ALLOW), SYSCALL(__NR_exit_group, ALLOW), SYSCALL(__NR_write, JUMP(&l, write_fd)), SYSCALL(__NR_read, JUMP(&l, read)), DENY, /* Don't passthrough into a label */ LABEL(&l, read), ARG(0), JNE(STDIN_FILENO, DENY), ARG(1), JNE((unsigned long)buf, DENY), ARG(2), JGE(sizeof(buf), DENY), ALLOW, LABEL(&l, write_fd), ARG(0), JEQ(STDOUT_FILENO, JUMP(&l, write_buf)), JEQ(STDERR_FILENO, JUMP(&l, write_buf)), DENY, LABEL(&l, write_buf), ARG(1), JEQ((unsigned long)msg1, JUMP(&l, msg1_len)), JEQ((unsigned long)msg2, JUMP(&l, msg2_len)), JEQ((unsigned long)buf, JUMP(&l, buf_len)), DENY, LABEL(&l, msg1_len), ARG(2), JLT(sizeof(msg1), ALLOW), DENY, LABEL(&l, msg2_len), ARG(2), JLT(sizeof(msg2), ALLOW), DENY, LABEL(&l, buf_len), ARG(2), JLT(sizeof(buf), ALLOW), DENY, }; struct sock_fprog prog = { .filter = filter, .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), }; ssize_t bytes; bpf_resolve_jumps(&l, filter, sizeof(filter)/sizeof(*filter)); if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { perror("prctl(NO_NEW_PRIVS)"); return 1; } if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) { perror("prctl(SECCOMP)"); return 1; } syscall(__NR_write, STDOUT_FILENO, msg1, strlen(msg1)); bytes = syscall(__NR_read, STDIN_FILENO, buf, sizeof(buf)-1); bytes = (bytes > 0 ? bytes : 0); syscall(__NR_write, STDERR_FILENO, msg2, strlen(msg2)); syscall(__NR_write, STDERR_FILENO, buf, bytes); /* Now get killed */ syscall(__NR_write, STDERR_FILENO, msg2, strlen(msg2)+2); return 0; } c29900a636c2d0d'/>
option value='25'>25
AgeCommit message (Expand)AuthorFilesLines
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2017-01-27 15:00:45 -0600
committerBjorn Helgaas <bhelgaas@google.com>2017-01-27 15:00:45 -0600
commit030305d69fc6963c16003f50d7e8d74b02d0a143 (patch)
tree363a4e34d199178769b7e7eeb26ea2620a55847b /sound/oss/CHANGELOG
parent4d191b1b63c209e37bf27938ef365244d3c41084 (diff)
PCI/ASPM: Handle PCI-to-PCIe bridges as roots of PCIe hierarchies
In a struct pcie_link_state, link->root points to the pcie_link_state of the root of the PCIe hierarchy. For the topmost link, this points to itself (link->root = link). For others, we copy the pointer from the parent (link->root = link->parent->root). Previously we recognized that Root Ports originated PCIe hierarchies, but we treated PCI/PCI-X to PCIe Bridges as being in the middle of the hierarchy, and when we tried to copy the pointer from link->parent->root, there was no parent, and we dereferenced a NULL pointer: BUG: unable to handle kernel NULL pointer dereference at 0000000000000090 IP: [<ffffffff9e424350>] pcie_aspm_init_link_state+0x170/0x820 Recognize that PCI/PCI-X to PCIe Bridges originate PCIe hierarchies just like Root Ports do, so link->root for these devices should also point to itself. Fixes: 51ebfc92b72b ("PCI: Enumerate switches below PCI-to-PCIe bridges") Link: https://bugzilla.kernel.org/show_bug.cgi?id=193411 Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1022181 Tested-by: lists@ssl-mail.com Tested-by: Jayachandran C. <jnair@caviumnetworks.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> CC: stable@vger.kernel.org # v4.2+
Diffstat (limited to 'sound/oss/CHANGELOG')