{"action":"created","comment":{"url":"https://api.github.com/repos/google/syzkaller/pulls/comments/234416561","pull_request_review_id":176062400,"id":234416561,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNDQxNjU2MQ==","diff_hunk":"@@ -41,6 +81,192 @@ static uintptr_t syz_open_pts(void)\n \treturn slave;\n }\n \n+#endif // SYZ_EXECUTOR || __NR_syz_open_pts\n+\n+#if SYZ_EXECUTOR || SYZ_TUN_ENABLE\n+\n+#include <fcntl.h>\n+#include <net/if_tun.h>\n+#include <sys/types.h>\n+\n+static int tunfd = -1;\n+\n+// We just need this to be large enough to hold headers that we parse (ethernet/ip/tcp).\n+// Rest of the packet (if any) will be silently truncated which is fine.\n+#define SYZ_TUN_MAX_PACKET_SIZE 1000\n+\n+// Maximum number of tun devices in the default install.\n+#define MAX_TUN 4\n+\n+// All patterns are non-expanding given values < MAX_TUN.\n+#define TUN_IFACE \"tap%d\"\n+#define TUN_DEVICE \"/dev/tap%d\"\n+\n+#define LOCAL_IPV4 \"172.20.%d.170\"\n+#define LOCAL_IPV6 \"fe80::%02hxaa\"\n+\n+static void initialize_tun(int tun_id)\n+{\n+#if SYZ_EXECUTOR\n+\tif (!flag_enable_tun)\n+\t\treturn;\n+#endif // SYZ_EXECUTOR\n+\n+\tif (tun_id < 0 || tun_id >= MAX_TUN) {\n+\t\tfail(\"tun_id out of range %d\\n\", tun_id);\n+\t}\n+\n+\tchar tun_device[sizeof(TUN_DEVICE)];\n+\tsnprintf_check(tun_device, sizeof(tun_device), TUN_DEVICE, tun_id);\n+\n+\ttunfd = open(tun_device, O_RDWR | O_NONBLOCK);\n+\tif (tunfd == -1) {\n+#if SYZ_EXECUTOR\n+\t\tfail(\"tun: can't open %s\\n\", tun_device);\n+#else\n+\t\tprintf(\"tun: can't open %s: errno=%d\\n\", tun_device, errno);\n+\t\treturn;\n+#endif // SYZ_EXECUTOR\n+\t}\n+\t// Remap tun onto higher fd number to hide it from fuzzer and to keep\n+\t// fd numbers stable regardless of whether tun is opened or not (also see kMaxFd).\n+\tconst int kTunFd = 240;\n+\tif (dup2(tunfd, kTunFd) < 0)\n+\t\tfail(\"dup2(tunfd, kTunFd) failed\");\n+\tclose(tunfd);\n+\ttunfd = kTunFd;\n+\n+\tchar tun_iface[sizeof(TUN_IFACE)];\n+\tsnprintf_check(tun_iface, sizeof(tun_iface), TUN_IFACE, tun_id);\n+\n+\tchar local_ipv4[sizeof(LOCAL_IPV4)];\n+\tsnprintf_check(local_ipv4, sizeof(local_ipv4), LOCAL_IPV4, tun_id);\n+\texecute_command(1, \"ifconfig %s inet %s\", tun_iface, local_ipv4);\n+\n+\tchar local_ipv6[sizeof(LOCAL_IPV6)];\n+\tsnprintf_check(local_ipv6, sizeof(local_ipv6), LOCAL_IPV6, tun_id);\n+\texecute_command(1, \"ifconfig %s inet6 %s\", tun_iface, local_ipv6);\n+}\n+\n+#endif // SYZ_EXECUTOR || SYZ_TUN_ENABLE\n+\n+#if SYZ_EXECUTOR || __NR_syz_emit_ethernet && SYZ_TUN_ENABLE\n+#include <stdbool.h>\n+#include <sys/uio.h>\n+\n+static long syz_emit_ethernet(long a0, long a1)\n+{\n+\t// syz_emit_ethernet(len len[packet], packet ptr[in, eth_packet])\n+\tif (tunfd < 0)\n+\t\treturn (uintptr_t)-1;\n+\n+\tsize_t length = a0;\n+\tconst char* data = (char*)a1;\n+\tdebug_dump_data(data, length);\n+\n+\treturn write(tunfd, data, length);\n+}\n #endif\n \n+#if SYZ_EXECUTOR || SYZ_TUN_ENABLE && (__NR_syz_extract_tcp_res || SYZ_REPEAT)\n+#include <errno.h>\n+\n+static int read_tun(char* data, int size)\n+{\n+\tif (tunfd < 0)\n+\t\treturn -1;\n+\n+\tint rv = read(tunfd, data, size);\n+\tif (rv < 0) {\n+\t\tif (errno == EAGAIN)\n+\t\t\treturn -1;\n+\t\tfail(\"tun: read failed with %d\", rv);\n+\t}\n+\treturn rv;\n+}\n #endif\n+\n+#if SYZ_EXECUTOR || __NR_syz_extract_tcp_res && SYZ_TUN_ENABLE\n+\n+struct tcp_resources {\n+\tuint32 seq;\n+\tuint32 ack;\n+};\n+\n+// clang-format off\n+// Include order matters below.\n+#include <net/ethertypes.h>\n+#include <net/if.h>\n+#include <net/if_arp.h>\n+#include <netinet/in.h>\n+#include <netinet/ip.h>\n+#include <netinet/ip6.h>\n+#include <netinet/tcp.h>\n+#include <netinet/if_ether.h>\n+// clang-format on\n+\n+static long syz_extract_tcp_res(long a0, long a1, long a2)\n+{\n+\t// syz_extract_tcp_res(res ptr[out, tcp_resources], seq_inc int32, ack_inc int32)\n+\n+\tif (tunfd < 0)\n+\t\treturn (uintptr_t)-1;\n+\n+\tchar data[SYZ_TUN_MAX_PACKET_SIZE];\n+\tint rv = read_tun(&data[0], sizeof(data));\n+\tif (rv == -1)\n+\t\treturn (uintptr_t)-1;\n+\tsize_t length = rv;\n+\tdebug_dump_data(data, length);\n+\n+\tstruct tcphdr* tcphdr;\n+\n+\tif (length < sizeof(struct ether_header))\n+\t\treturn (uintptr_t)-1;\n+\tstruct ether_header* ethhdr = (struct ether_header*)&data[0];\n+\n+\tif (ethhdr->ether_type == htons(ETHERTYPE_IP)) {\n+\t\tif (length < sizeof(struct ether_header) + sizeof(struct ip))\n+\t\t\treturn (uintptr_t)-1;\n+\t\tstruct ip* iphdr = (struct ip*)&data[sizeof(struct ether_header)];\n+\t\tif (iphdr->ip_p != IPPROTO_TCP)\n+\t\t\treturn (uintptr_t)-1;\n+\t\tif (length < sizeof(struct ether_header) + iphdr->ip_hl * 4 + sizeof(struct tcphdr))\n+\t\t\treturn (uintptr_t)-1;\n+\t\ttcphdr = (struct tcphdr*)&data[sizeof(struct ether_header) + iphdr->ip_hl * 4];\n+\t} else {\n+\t\tif (length < sizeof(struct ether_header) + sizeof(struct ip6_hdr))\n+\t\t\treturn (uintptr_t)-1;\n+\t\tstruct ip6_hdr* ipv6hdr = (struct ip6_hdr*)&data[sizeof(struct ether_header)];\n+\t\t// TODO: parse and skip extension headers.\n+\t\tif (ipv6hdr->ip6_nxt != IPPROTO_TCP)\n+\t\t\treturn (uintptr_t)-1;\n+\t\tif (length < sizeof(struct ether_header) + sizeof(struct ip6_hdr) + sizeof(struct tcphdr))\n+\t\t\treturn (uintptr_t)-1;\n+\t\ttcphdr = (struct tcphdr*)&data[sizeof(struct ether_header) + sizeof(struct ip6_hdr)];\n+\t}\n+\n+\tstruct tcp_resources* res = (struct tcp_resources*)a0;\n+\tNONFAILING(res->seq = htonl((ntohl(tcphdr->th_seq) + (uint32)a1)));\n+\tNONFAILING(res->ack = htonl((ntohl(tcphdr->th_ack) + (uint32)a2)));\n+\n+\tdebug(\"extracted seq: %08x\\n\", res->seq);\n+\tdebug(\"extracted ack: %08x\\n\", res->ack);\n+\n+\treturn 0;\n+}\n+#endif\n+\n+#if SYZ_EXECUTOR || SYZ_SANDBOX_NONE\n+static void loop();\n+static int do_sandbox_none(uint64 pid)","path":"executor/common_bsd.h","position":252,"original_position":252,"commit_id":"ee3c4a121325f1fd239b1af0ed1c1467cad7723c","original_commit_id":"ee3c4a121325f1fd239b1af0ed1c1467cad7723c","user":{"login":"dvyukov","id":1095328,"node_id":"MDQ6VXNlcjEwOTUzMjg=","avatar_url":"https://avatars3.githubusercontent.com/u/1095328?v=4","gravatar_id":"","url":"https://api.github.com/users/dvyukov","html_url":"https://github.com/dvyukov","followers_url":"https://api.github.com/users/dvyukov/followers","following_url":"https://api.github.com/users/dvyukov/following{/other_user}","gists_url":"https://api.github.com/users/dvyukov/gists{/gist_id}","starred_url":"https://api.github.com/users/dvyukov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dvyukov/subscriptions","organizations_url":"https://api.github.com/users/dvyukov/orgs","repos_url":"https://api.github.com/users/dvyukov/repos","events_url":"https://api.github.com/users/dvyukov/events{/privacy}","received_events_url":"https://api.github.com/users/dvyukov/received_events","type":"User","site_admin":false},"body":"Re pid, check how linux uses procid:\r\nhttps://github.com/google/syzkaller/blob/master/executor/common_linux.h#L702\r\nhttps://github.com/google/syzkaller/blob/master/executor/common.h#L40\r\n\r\n","created_at":"2018-11-17T18:12:34Z","updated_at":"2018-11-17T18:12:34Z","html_url":"https://github.com/google/syzkaller/pull/789#discussion_r234416561","pull_request_url":"https://api.github.com/repos/google/syzkaller/pulls/789","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/google/syzkaller/pulls/comments/234416561"},"html":{"href":"https://github.com/google/syzkaller/pull/789#discussion_r234416561"},"pull_request":{"href":"https://api.github.com/repos/google/syzkaller/pulls/789"}}},"pull_request":{"url":"https://api.github.com/repos/google/syzkaller/pulls/789","id":228204518,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI4MjA0NTE4","html_url":"https://github.com/google/syzkaller/pull/789","diff_url":"https://github.com/google/syzkaller/pull/789.diff","patch_url":"https://github.com/google/syzkaller/pull/789.patch","issue_url":"https://api.github.com/repos/google/syzkaller/issues/789","number":789,"state":"open","locked":false,"title":"OpenBSD network package injection","user":{"login":"blackgnezdo","id":8768818,"node_id":"MDQ6VXNlcjg3Njg4MTg=","avatar_url":"https://avatars3.githubusercontent.com/u/8768818?v=4","gravatar_id":"","url":"https://api.github.com/users/blackgnezdo","html_url":"https://github.com/blackgnezdo","followers_url":"https://api.github.com/users/blackgnezdo/followers","following_url":"https://api.github.com/users/blackgnezdo/following{/other_user}","gists_url":"https://api.github.com/users/blackgnezdo/gists{/gist_id}","starred_url":"https://api.github.com/users/blackgnezdo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blackgnezdo/subscriptions","organizations_url":"https://api.github.com/users/blackgnezdo/orgs","repos_url":"https://api.github.com/users/blackgnezdo/repos","events_url":"https://api.github.com/users/blackgnezdo/events{/privacy}","received_events_url":"https://api.github.com/users/blackgnezdo/received_events","type":"User","site_admin":false},"body":"This is a really rough and entirely untested attempt to get packet injection working on OpenBSD.  `gmake executor TARGETOS=openbsd` can be made to compile but that's about it. The next stumbling block is getting constant extraction to work for `vnet.txt` which shapes up to be a massive pile of detailed work unless there's an easy way to reuse the constants extracted on Linux. I see no reason to not do it considering network packets are platform independent. Help @dvyukov @mptre ?\r\n\r\nTo be more specific, I can't use the linux headers off the bat. I suppose I could make them available by fusing them into SOURCEDIR somehow (maybe support : separated lists?), is that desirable?\r\n\r\n```\r\n-*- mode: compilation; default-directory: \"~/s/syzkaller/\" -*-\r\nCompilation started at Sun Nov  4 13:37:14\r\n\r\ngmake extract SOURCEDIR=/usr/src && gmake generate\r\nexport HOSTOS=openbsd\r\nexport HOSTARCH=amd64\r\nexport TARGETOS=openbsd\r\nexport TARGETARCH=amd64\r\nexport TARGETVMARCH=amd64\r\nexport CC=c++\r\nexport ADDCFLAGS=-m64 -static -lutil\r\nexport NCORES=2\r\nexport EXE=\r\n\r\nGOOS=openbsd GOARCH=amd64 go build \"-ldflags=-s -w -X github.com/google/syzkaller/sys.GitRevision=f4d801b1fc79e5b0bd16ca3714cd39de833be31f+\" -o bin/syz-extract ./sys/syz-extract\r\nbin/syz-extract -build -os=openbsd -sourcedir=/usr/src \r\ngenerating openbsd/amd64...\r\nextracting from fs.txt\r\nextracting from ipc.txt\r\nextracting from kqueue.txt\r\nextracting from mm.txt\r\nextracting from socket.txt\r\nextracting from socket_inet.txt\r\nextracting from socket_inet6.txt\r\nextracting from socket_unix.txt\r\nextracting from sys.txt\r\nextracting from tty.txt\r\nextracting from vnet.txt\r\n\tfailed to run compiler: exit status 1\r\n<stdin>:5:25: error: linux/types.h: No such file or directory\r\n<stdin>:7:37: error: linux/byteorder/generic.h: No such file or directory\r\n<stdin>:9:27: error: uapi/linux/if.h: No such file or directory\r\n<stdin>:11:33: error: uapi/linux/if_ether.h: No such file or directory\r\n<stdin>:13:31: error: uapi/linux/if_arp.h: No such file or directory\r\n<stdin>:15:28: error: uapi/linux/llc.h: No such file or directory\r\n<stdin>:17:21: error: net/ipx.h: No such file or directory\r\n<stdin>:19:31: error: uapi/linux/if_x25.h: No such file or directory\r\n<stdin>:21:21: error: net/x25.h: No such file or directory\r\n<stdin>:23:27: error: uapi/linux/in.h: No such file or directory\r\n<stdin>:25:27: error: uapi/linux/ip.h: No such file or directory\r\n<stdin>:27:29: error: uapi/linux/l2tp.h: No such file or directory\r\n<stdin>:29:28: error: net/cipso_ipv4.h: No such file or directory\r\n<stdin>:31:28: error: uapi/linux/in6.h: No such file or directory\r\n<stdin>:33:29: error: uapi/linux/ipv6.h: No such file or directory\r\n<stdin>:35:29: error: uapi/linux/seg6.h: No such file or directory\r\n<stdin>:37:35: error: uapi/linux/ip6_tunnel.h: No such file or directory\r\n<stdin>:39:22: error: net/ipv6.h: No such file or directory\r\n<stdin>:41:21: error: net/tcp.h: No such file or directory\r\n<stdin>:43:28: error: uapi/linux/tcp.h: No such file or directory\r\n<stdin>:45:21: error: net/gue.h: No such file or directory\r\n<stdin>:47:24: error: net/erspan.h: No such file or directory\r\n<stdin>:49:31: error: uapi/linux/erspan.h: No such file or directory\r\n<stdin>:51:29: error: uapi/linux/icmp.h: No such file or directory\r\n<stdin>:53:31: error: uapi/linux/icmpv6.h: No such file or directory\r\n<stdin>:55:29: error: uapi/linux/dccp.h: No such file or directory\r\n<stdin>:57:29: error: uapi/linux/igmp.h: No such file or directory\r\n\r\n\r\ngmake: *** [Makefile:157: extract] Error 1\r\n\r\nCompilation exited abnormally with code 2 at Sun Nov  4 13:37:17\r\n\r\n```","created_at":"2018-11-04T21:33:49Z","updated_at":"2018-11-17T18:12:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3a26fa43c0cacb91a612e824104ec9c9cec5be47","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/google/syzkaller/pulls/789/commits","review_comments_url":"https://api.github.com/repos/google/syzkaller/pulls/789/comments","review_comment_url":"https://api.github.com/repos/google/syzkaller/pulls/comments{/number}","comments_url":"https://api.github.com/repos/google/syzkaller/issues/789/comments","statuses_url":"https://api.github.com/repos/google/syzkaller/statuses/ee3c4a121325f1fd239b1af0ed1c1467cad7723c","head":{"label":"blackgnezdo:openbsd-tap","ref":"openbsd-tap","sha":"ee3c4a121325f1fd239b1af0ed1c1467cad7723c","user":{"login":"blackgnezdo","id":8768818,"node_id":"MDQ6VXNlcjg3Njg4MTg=","avatar_url":"https://avatars3.githubusercontent.com/u/8768818?v=4","gravatar_id":"","url":"https://api.github.com/users/blackgnezdo","html_url":"https://github.com/blackgnezdo","followers_url":"https://api.github.com/users/blackgnezdo/followers","following_url":"https://api.github.com/users/blackgnezdo/following{/other_user}","gists_url":"https://api.github.com/users/blackgnezdo/gists{/gist_id}","starred_url":"https://api.github.com/users/blackgnezdo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blackgnezdo/subscriptions","organizations_url":"https://api.github.com/users/blackgnezdo/orgs","repos_url":"https://api.github.com/users/blackgnezdo/repos","events_url":"https://api.github.com/users/blackgnezdo/events{/privacy}","received_events_url":"https://api.github.com/users/blackgnezdo/received_events","type":"User","site_admin":false},"repo":{"id":147773514,"node_id":"MDEwOlJlcG9zaXRvcnkxNDc3NzM1MTQ=","name":"syzkaller","full_name":"blackgnezdo/syzkaller","private":false,"owner":{"login":"blackgnezdo","id":8768818,"node_id":"MDQ6VXNlcjg3Njg4MTg=","avatar_url":"https://avatars3.githubusercontent.com/u/8768818?v=4","gravatar_id":"","url":"https://api.github.com/users/blackgnezdo","html_url":"https://github.com/blackgnezdo","followers_url":"https://api.github.com/users/blackgnezdo/followers","following_url":"https://api.github.com/users/blackgnezdo/following{/other_user}","gists_url":"https://api.github.com/users/blackgnezdo/gists{/gist_id}","starred_url":"https://api.github.com/users/blackgnezdo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blackgnezdo/subscriptions","organizations_url":"https://api.github.com/users/blackgnezdo/orgs","repos_url":"https://api.github.com/users/blackgnezdo/repos","events_url":"https://api.github.com/users/blackgnezdo/events{/privacy}","received_events_url":"https://api.github.com/users/blackgnezdo/received_events","type":"User","site_admin":false},"html_url":"https://github.com/blackgnezdo/syzkaller","description":"syzkaller is an unsupervised, coverage-guided kernel fuzzer","fork":true,"url":"https://api.github.com/repos/blackgnezdo/syzkaller","forks_url":"https://api.github.com/repos/blackgnezdo/syzkaller/forks","keys_url":"https://api.github.com/repos/blackgnezdo/syzkaller/keys{/key_id}","collaborators_url":"https://api.github.com/repos/blackgnezdo/syzkaller/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/blackgnezdo/syzkaller/teams","hooks_url":"https://api.github.com/repos/blackgnezdo/syzkaller/hooks","issue_events_url":"https://api.github.com/repos/blackgnezdo/syzkaller/issues/events{/number}","events_url":"https://api.github.com/repos/blackgnezdo/syzkaller/events","assignees_url":"https://api.github.com/repos/blackgnezdo/syzkaller/assignees{/user}","branches_url":"https://api.github.com/repos/blackgnezdo/syzkaller/branches{/branch}","tags_url":"https://api.github.com/repos/blackgnezdo/syzkaller/tags","blobs_url":"https://api.github.com/repos/blackgnezdo/syzkaller/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/blackgnezdo/syzkaller/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/blackgnezdo/syzkaller/git/refs{/sha}","trees_url":"https://api.github.com/repos/blackgnezdo/syzkaller/git/trees{/sha}","statuses_url":"https://api.github.com/repos/blackgnezdo/syzkaller/statuses/{sha}","languages_url":"https://api.github.com/repos/blackgnezdo/syzkaller/languages","stargazers_url":"https://api.github.com/repos/blackgnezdo/syzkaller/stargazers","contributors_url":"https://api.github.com/repos/blackgnezdo/syzkaller/contributors","subscribers_url":"https://api.github.com/repos/blackgnezdo/syzkaller/subscribers","subscription_url":"https://api.github.com/repos/blackgnezdo/syzkaller/subscription","commits_url":"https://api.github.com/repos/blackgnezdo/syzkaller/commits{/sha}","git_commits_url":"https://api.github.com/repos/blackgnezdo/syzkaller/git/commits{/sha}","comments_url":"https://api.github.com/repos/blackgnezdo/syzkaller/comments{/number}","issue_comment_url":"https://api.github.com/repos/blackgnezdo/syzkaller/issues/comments{/number}","contents_url":"https://api.github.com/repos/blackgnezdo/syzkaller/contents/{+path}","compare_url":"https://api.github.com/repos/blackgnezdo/syzkaller/compare/{base}...{head}","merges_url":"https://api.github.com/repos/blackgnezdo/syzkaller/merges","archive_url":"https://api.github.com/repos/blackgnezdo/syzkaller/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/blackgnezdo/syzkaller/downloads","issues_url":"https://api.github.com/repos/blackgnezdo/syzkaller/issues{/number}","pulls_url":"https://api.github.com/repos/blackgnezdo/syzkaller/pulls{/number}","milestones_url":"https://api.github.com/repos/blackgnezdo/syzkaller/milestones{/number}","notifications_url":"https://api.github.com/repos/blackgnezdo/syzkaller/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/blackgnezdo/syzkaller/labels{/name}","releases_url":"https://api.github.com/repos/blackgnezdo/syzkaller/releases{/id}","deployments_url":"https://api.github.com/repos/blackgnezdo/syzkaller/deployments","created_at":"2018-09-07T05:11:31Z","updated_at":"2018-10-22T17:54:19Z","pushed_at":"2018-11-14T04:59:44Z","git_url":"git://github.com/blackgnezdo/syzkaller.git","ssh_url":"git@github.com:blackgnezdo/syzkaller.git","clone_url":"https://github.com/blackgnezdo/syzkaller.git","svn_url":"https://github.com/blackgnezdo/syzkaller","homepage":"","size":57187,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"google:master","ref":"master","sha":"5f5f6d14e80b8bd6b42db961118e902387716bcb","user":{"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":44087204,"node_id":"MDEwOlJlcG9zaXRvcnk0NDA4NzIwNA==","name":"syzkaller","full_name":"google/syzkaller","private":false,"owner":{"login":"google","id":1342004,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDIwMDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/google/syzkaller","description":"syzkaller is an unsupervised, coverage-guided kernel fuzzer","fork":false,"url":"https://api.github.com/repos/google/syzkaller","forks_url":"https://api.github.com/repos/google/syzkaller/forks","keys_url":"https://api.github.com/repos/google/syzkaller/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/syzkaller/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/syzkaller/teams","hooks_url":"https://api.github.com/repos/google/syzkaller/hooks","issue_events_url":"https://api.github.com/repos/google/syzkaller/issues/events{/number}","events_url":"https://api.github.com/repos/google/syzkaller/events","assignees_url":"https://api.github.com/repos/google/syzkaller/assignees{/user}","branches_url":"https://api.github.com/repos/google/syzkaller/branches{/branch}","tags_url":"https://api.github.com/repos/google/syzkaller/tags","blobs_url":"https://api.github.com/repos/google/syzkaller/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/syzkaller/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/syzkaller/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/syzkaller/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/syzkaller/statuses/{sha}","languages_url":"https://api.github.com/repos/google/syzkaller/languages","stargazers_url":"https://api.github.com/repos/google/syzkaller/stargazers","contributors_url":"https://api.github.com/repos/google/syzkaller/contributors","subscribers_url":"https://api.github.com/repos/google/syzkaller/subscribers","subscription_url":"https://api.github.com/repos/google/syzkaller/subscription","commits_url":"https://api.github.com/repos/google/syzkaller/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/syzkaller/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/syzkaller/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/syzkaller/issues/comments{/number}","contents_url":"https://api.github.com/repos/google/syzkaller/contents/{+path}","compare_url":"https://api.github.com/repos/google/syzkaller/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/syzkaller/merges","archive_url":"https://api.github.com/repos/google/syzkaller/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/syzkaller/downloads","issues_url":"https://api.github.com/repos/google/syzkaller/issues{/number}","pulls_url":"https://api.github.com/repos/google/syzkaller/pulls{/number}","milestones_url":"https://api.github.com/repos/google/syzkaller/milestones{/number}","notifications_url":"https://api.github.com/repos/google/syzkaller/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/syzkaller/labels{/name}","releases_url":"https://api.github.com/repos/google/syzkaller/releases{/id}","deployments_url":"https://api.github.com/repos/google/syzkaller/deployments","created_at":"2015-10-12T06:05:05Z","updated_at":"2018-11-17T09:35:49Z","pushed_at":"2018-11-17T10:04:40Z","git_url":"git://github.com/google/syzkaller.git","ssh_url":"git@github.com:google/syzkaller.git","clone_url":"https://github.com/google/syzkaller.git","svn_url":"https://github.com/google/syzkaller","homepage":"","size":57912,"stargazers_count":1888,"watchers_count":1888,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":415,"mirror_url":null,"archived":false,"open_issues_count":90,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":415,"open_issues":90,"watchers":1888,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/syzkaller/pulls/789"},"html":{"href":"https://github.com/google/syzkaller/pull/789"},"issue":{"href":"https://api.github.com/repos/google/syzkaller/issues/789"},"comments":{"href":"https://api.github.com/repos/google/syzkaller/issues/789/comments"},"review_comments":{"href":"https://api.github.com/repos/google/syzkaller/pulls/789/comments"},"review_comment":{"href":"https://api.github.com/repos/google/syzkaller/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/google/syzkaller/pulls/789/commits"},"statuses":{"href":"https://api.github.com/repos/google/syzkaller/statuses/ee3c4a121325f1fd239b1af0ed1c1467cad7723c"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"dvyukov"}}