⬢ DragonFlyBSD Kernel Audit
DF-3358 / rtget_plain.c
← back to finding ↓ download raw
/* control: plain RTM_GET (RTA_DST only) must NOT be EPERM post-fix */
#include <sys/types.h>
#include <sys/socket.h>
#include <net/route.h>
#include <netinet/in.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(void) {
    struct { struct rt_msghdr rtm; struct sockaddr_in dst; } m;
    int s = socket(PF_ROUTE, SOCK_RAW, 0), n;
    if (s < 0) { perror("socket"); return 1; }
    memset(&m, 0, sizeof(m));
    m.rtm.rtm_msglen = sizeof(m);
    m.rtm.rtm_version = RTM_VERSION;
    m.rtm.rtm_type = RTM_GET;
    m.rtm.rtm_addrs = RTA_DST;
    m.dst.sin_len = sizeof(m.dst);
    m.dst.sin_family = AF_INET;
    m.dst.sin_addr.s_addr = htonl(0x0a000203);
    n = write(s, &m, sizeof(m));
    printf("write=%d errno=%d (%s)\n", n, errno, strerror(errno));
    return (errno == EPERM);
}