linux/tools/testing/selftests
Kuniyuki Iwashima e739718444 net/sched: taprio: Limit TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME to INT_MAX.
syzkaller found zero division error [0] in div_s64_rem() called from
get_cycle_time_elapsed(), where sched->cycle_time is the divisor.

We have tests in parse_taprio_schedule() so that cycle_time will never
be 0, and actually cycle_time is not 0 in get_cycle_time_elapsed().

The problem is that the types of divisor are different; cycle_time is
s64, but the argument of div_s64_rem() is s32.

syzkaller fed this input and 0x100000000 is cast to s32 to be 0.

  @TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME={0xc, 0x8, 0x100000000}

We use s64 for cycle_time to cast it to ktime_t, so let's keep it and
set max for cycle_time.

While at it, we prevent overflow in setup_txtime() and add another
test in parse_taprio_schedule() to check if cycle_time overflows.

Also, we add a new tdc test case for this issue.

[0]:
divide error: 0000 [#1] PREEMPT SMP KASAN NOPTI
CPU: 1 PID: 103 Comm: kworker/1:3 Not tainted 6.5.0-rc1-00330-g60cc1f7d0605 #3
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014
Workqueue: ipv6_addrconf addrconf_dad_work
RIP: 0010:div_s64_rem include/linux/math64.h:42 [inline]
RIP: 0010:get_cycle_time_elapsed net/sched/sch_taprio.c:223 [inline]
RIP: 0010:find_entry_to_transmit+0x252/0x7e0 net/sched/sch_taprio.c:344
Code: 3c 02 00 0f 85 5e 05 00 00 48 8b 4c 24 08 4d 8b bd 40 01 00 00 48 8b 7c 24 48 48 89 c8 4c 29 f8 48 63 f7 48 99 48 89 74 24 70 <48> f7 fe 48 29 d1 48 8d 04 0f 49 89 cc 48 89 44 24 20 49 8d 85 10
RSP: 0018:ffffc90000acf260 EFLAGS: 00010206
RAX: 177450e0347560cf RBX: 0000000000000000 RCX: 177450e0347560cf
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000100000000
RBP: 0000000000000056 R08: 0000000000000000 R09: ffffed10020a0934
R10: ffff8880105049a7 R11: ffff88806cf3a520 R12: ffff888010504800
R13: ffff88800c00d800 R14: ffff8880105049a0 R15: 0000000000000000
FS:  0000000000000000(0000) GS:ffff88806cf00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f0edf84f0e8 CR3: 000000000d73c002 CR4: 0000000000770ee0
PKRU: 55555554
Call Trace:
 <TASK>
 get_packet_txtime net/sched/sch_taprio.c:508 [inline]
 taprio_enqueue_one+0x900/0xff0 net/sched/sch_taprio.c:577
 taprio_enqueue+0x378/0xae0 net/sched/sch_taprio.c:658
 dev_qdisc_enqueue+0x46/0x170 net/core/dev.c:3732
 __dev_xmit_skb net/core/dev.c:3821 [inline]
 __dev_queue_xmit+0x1b2f/0x3000 net/core/dev.c:4169
 dev_queue_xmit include/linux/netdevice.h:3088 [inline]
 neigh_resolve_output net/core/neighbour.c:1552 [inline]
 neigh_resolve_output+0x4a7/0x780 net/core/neighbour.c:1532
 neigh_output include/net/neighbour.h:544 [inline]
 ip6_finish_output2+0x924/0x17d0 net/ipv6/ip6_output.c:135
 __ip6_finish_output+0x620/0xaa0 net/ipv6/ip6_output.c:196
 ip6_finish_output net/ipv6/ip6_output.c:207 [inline]
 NF_HOOK_COND include/linux/netfilter.h:292 [inline]
 ip6_output+0x206/0x410 net/ipv6/ip6_output.c:228
 dst_output include/net/dst.h:458 [inline]
 NF_HOOK.constprop.0+0xea/0x260 include/linux/netfilter.h:303
 ndisc_send_skb+0x872/0xe80 net/ipv6/ndisc.c:508
 ndisc_send_ns+0xb5/0x130 net/ipv6/ndisc.c:666
 addrconf_dad_work+0xc14/0x13f0 net/ipv6/addrconf.c:4175
 process_one_work+0x92c/0x13a0 kernel/workqueue.c:2597
 worker_thread+0x60f/0x1240 kernel/workqueue.c:2748
 kthread+0x2fe/0x3f0 kernel/kthread.c:389
 ret_from_fork+0x2c/0x50 arch/x86/entry/entry_64.S:308
 </TASK>
Modules linked in:

Fixes: 4cfd5779bd ("taprio: Add support for txtime-assist mode")
Reported-by: syzkaller <syzkaller@googlegroups.com>
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Co-developed-by: Eric Dumazet <edumazet@google.com>
Co-developed-by: Pedro Tammela <pctammela@mojatatu.com>
Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-07-31 09:12:27 +01:00
..
alsa selftests: ALSA: Add test-pcmtest-driver to .gitignore 2023-07-19 15:25:03 +02:00
amd-pstate linux-kselftest-next-6.4-rc1 2023-04-24 12:28:34 -07:00
arm64 selftests/arm64: fix build failure during the "emit_tests" step 2023-07-14 12:33:35 -06:00
bpf selftests/bpf: Add more tests for check_max_stack_depth bug 2023-07-18 15:21:09 -07:00
breakpoints
cachestat selftests: add selftests for cachestat 2023-06-09 16:25:17 -07:00
capabilities
cgroup selftests: cgroup: fix unexpected failure on test_memcg_sock 2023-06-23 16:59:26 -07:00
clone3 selftests/clone3: test clone3 with exit signal in flags 2023-06-12 16:39:11 -06:00
core selftests: core: Fix incorrect kernel headers search path 2023-01-30 15:04:52 -07:00
cpu-hotplug
cpufreq selftests/cpufreq: Don't enable generic lock debugging options 2023-06-12 16:39:11 -06:00
damon selftests: damon: add config file 2023-06-19 16:19:11 -07:00
dma
dmabuf-heaps selftests: dmabuf-heaps: Fix incorrect kernel headers search path 2023-02-13 09:09:44 -07:00
drivers selftests: mlxsw: one_armed_router: Use port MAC for bridge address 2023-06-21 14:02:52 -07:00
efivarfs
exec
filesystems linux-kselftest-next-6.3-rc1 2023-02-23 09:37:29 -08:00
firmware
fpu
ftrace Probes updates for v6.5: 2023-06-30 10:44:53 -07:00
futex selftests: futex: Fix incorrect kernel headers search path 2023-02-13 09:09:44 -07:00
gpio gpio updates for v6.5 2023-06-29 10:11:10 -07:00
hid selftests: hid: fix vmtests.sh not running make headers 2023-07-09 12:10:04 +02:00
ia64
intel_pstate
iommu iommufd/selftest: Cover domain unmap with huge pages and access 2023-04-04 13:11:24 -03:00
ipc selftests: ipc: Fix incorrect kernel headers search path 2023-02-13 09:09:44 -07:00
ir
kcmp selftests: kcmp: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
kexec
kmod
kselftest selftests: allow runners to override the timeout 2023-06-12 16:39:11 -06:00
kvm ARM64: 2023-07-03 15:32:22 -07:00
landlock selftests/landlock: Add hostfs tests 2023-06-12 21:26:23 +02:00
lib
livepatch
lkdtm
locking
media_tests selftests: media_tests: Add new subtest to video_device_test 2023-06-12 16:39:10 -06:00
membarrier linux-kselftest-next-6.3-rc1 2023-02-23 09:37:29 -08:00
memfd selftests/memfd: fix test_sysctl 2023-04-18 16:53:52 -07:00
memory-hotplug
mincore selftests/mincore: fix skip condition for check_huge_pages test 2023-07-13 12:51:13 -06:00
mm selftests/mm: mkdirty: fix incorrect position of #endif 2023-07-17 12:53:22 -07:00
mount
mount_setattr selftests mount: Fix mount_setattr_test builds failed 2023-03-31 09:18:45 -06:00
move_mount_set_group selftests: move_mount_set_group: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
mqueue
nci
net selftests: mptcp: join: only check for ip6tables if needed 2023-07-26 16:48:54 -07:00
netfilter selftests: nft_flowtable.sh: check ingress/egress chain too 2023-05-10 09:31:07 +02:00
nolibc selftests/nolibc: make sure gcc always use little endian on MIPS 2023-06-09 11:46:10 -07:00
nsfs
ntb
openat2
perf_events selftests: perf_events: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
pid_namespace selftests: pid_namespace: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
pidfd selftest: pidfd: Omit long and repeating outputs 2023-06-12 16:39:11 -06:00
powerpc selftests/powerpc/dexcr: Add DEXCR status utility lsdexcr 2023-06-19 17:36:28 +10:00
prctl selftests: prctl: Fix spelling mistake "anonynous" -> "anonymous" 2023-06-12 16:39:10 -06:00
proc selftests/proc: Assert clock_gettime(CLOCK_BOOTTIME) VS /proc/uptime monotonicity 2023-04-18 16:35:13 +02:00
pstore
ptp ptp: Add .getmaxphase callback to ptp_clock_info 2023-06-20 09:02:33 +01:00
ptrace Update for entry and ptrace: 2023-04-25 11:05:04 -07:00
rcutorture A half-dozen late arriving docs patches. They are mostly fixes, but we 2023-07-06 22:15:38 -07:00
resctrl selftests/resctrl: Fix incorrect error return on test complete 2023-04-14 11:13:18 -06:00
riscv selftests/riscv: fix potential build failure during the "emit_tests" step 2023-07-14 12:32:42 -06:00
rlimits
rseq linux-kselftest-next-6.3-rc1 2023-02-23 09:37:29 -08:00
rtc
safesetid
sched selftests: sched: Add more core schedule prctl calls 2023-03-28 10:27:07 -06:00
seccomp LoongArch changes for v6.3 2023-03-01 09:27:00 -08:00
sgx selftests/sgx: Add "test_encl.elf" to TEST_FILES 2023-05-08 11:01:03 -06:00
sigaltstack selftests: sigaltstack: fix -Wuninitialized 2023-03-20 17:28:31 -06:00
size
sparc64
splice selftests: splice_read: Fix sysfs read cases 2022-11-29 17:28:31 -07:00
static_keys
sync selftests: sync: Fix incorrect kernel headers search path 2023-02-13 09:09:45 -07:00
syscall_user_dispatch
sysctl test_sysclt: Test for registering a mount point 2023-06-18 02:32:54 -07:00
tc-testing net/sched: taprio: Limit TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME to INT_MAX. 2023-07-31 09:12:27 +01:00
tdx selftests: tdx: Use installed kernel headers search path 2023-02-13 09:09:46 -07:00
timens
timers tools: timers: fix freq average calculation 2023-07-13 13:32:36 -06:00
tmpfs
tpm2 selftests: tpm2: remove redundant ord() 2023-02-13 09:09:46 -07:00
tty selftests: tty: add selftest for tty timestamp updates 2023-06-15 13:45:42 +02:00
uevent
user
user_events selftests/user_events: Test struct size match cases 2023-07-12 12:04:47 -04:00
vDSO kselftest: vDSO: Fix accumulation of uninitialized ret when CLOCK_REALTIME is undefined 2023-06-12 16:39:10 -06:00
watchdog
wireguard wireguard: netlink: send staged packets when setting initial private key 2023-07-03 09:17:52 +01:00
x86 Add support for new Linear Address Masking CPU feature. This is similar 2023-04-28 09:43:49 -07:00
zram
.gitignore
Makefile TTY/Serial driver updates for 6.5-rc1. 2023-07-03 13:14:58 -07:00
gen_kselftest_tar.sh
kselftest.h kselftest: Support nolibc 2023-04-11 14:10:47 -06:00
kselftest_deps.sh selftests/vm: rename selftests/vm to selftests/mm 2023-01-18 17:12:56 -08:00
kselftest_harness.h selftests/harness: allow tests to be skipped during setup 2023-06-15 22:24:01 -07:00
kselftest_install.sh
kselftest_module.h
lib.mk selftests: error out if kernel header files are not yet built 2023-06-19 16:19:03 -07:00
run_kselftest.sh kselftests: Sort the collections list to avoid duplicate tests 2023-06-12 16:39:11 -06:00