1eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin/* 2eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * Check decoding of ICMP_FILTER. 3eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * 4eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org> 539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2016-2017 The strace developers. 6eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * All rights reserved. 7eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * 8eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 9eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * modification, are permitted provided that the following conditions 10eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * are met: 11eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 12eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 13eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 14eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 15eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * documentation and/or other materials provided with the distribution. 16eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 17eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * derived from this software without specific prior written permission. 18eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * 19eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin */ 30eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 31eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin#include "tests.h" 32eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin#include <stdio.h> 33eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin#include <sys/socket.h> 34eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin#include <linux/icmp.h> 35eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 36eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levinint 37eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levinmain(void) 38eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin{ 39eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin getsockopt(-1, SOL_RAW, ICMP_FILTER, 0, 0); 40484326dbd8f8e02983e37498b4b5fa990d16b536Dmitry V. Levin printf("getsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, NULL) = -1 %s (%m)\n", 41eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin errno2name()); 42eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 43eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin setsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, 0); 44eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, 0) = -1 %s (%m)\n", 45eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin errno2name()); 46eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 4739bac055674d23770b9a724221b728e443196ea7Elliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, plen); 48eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin void *const efault = plen + 1; 4939bac055674d23770b9a724221b728e443196ea7Elliott Hughes TAIL_ALLOC_OBJECT_CONST_PTR(struct icmp_filter, f); 50eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 51eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin getsockopt(-1, SOL_RAW, ICMP_FILTER, f, plen); 52eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin printf("getsockopt(-1, SOL_RAW, ICMP_FILTER, %p, %p) = -1 %s (%m)\n", 53eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin f, plen, errno2name()); 54eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 55eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin setsockopt(-1, SOL_RAW, ICMP_FILTER, efault, sizeof(*f)); 56eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %p, %u) = -1 %s (%m)\n", 57eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin efault, (unsigned) sizeof(*f), errno2name()); 58eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 59eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin f->data = ~( 60eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 1<<ICMP_ECHOREPLY | 61eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 1<<ICMP_DEST_UNREACH | 62eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 1<<ICMP_SOURCE_QUENCH | 63eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 1<<ICMP_REDIRECT | 64eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 1<<ICMP_TIME_EXCEEDED | 65eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 1<<ICMP_PARAMETERPROB); 66eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 67eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin setsockopt(-1, SOL_RAW, ICMP_FILTER, f, -2); 68eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %p, -2) = -1 %s (%m)\n", 69eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin f, errno2name()); 70eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 71eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f)); 72eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %s, %u) = -1 %s (%m)\n", 73eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin "~(1<<ICMP_ECHOREPLY|1<<ICMP_DEST_UNREACH|1<<ICMP_SOURCE_QUENCH" 74eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin "|1<<ICMP_REDIRECT|1<<ICMP_TIME_EXCEEDED|1<<ICMP_PARAMETERPROB)", 75eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin (unsigned) sizeof(*f), errno2name()); 76eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 77eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f) * 2); 78eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %s, %u) = -1 %s (%m)\n", 79eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin "~(1<<ICMP_ECHOREPLY|1<<ICMP_DEST_UNREACH|1<<ICMP_SOURCE_QUENCH" 80eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin "|1<<ICMP_REDIRECT|1<<ICMP_TIME_EXCEEDED|1<<ICMP_PARAMETERPROB)", 81eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin (unsigned) sizeof(*f) * 2, errno2name()); 82eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin 83eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin puts("+++ exited with 0 +++"); 84eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin return 0; 85eb5c233d99b210e2e74472c27fd196f3fdb1c059Dmitry V. Levin} 86