Hi, For a few hours I went grepping for MOD FPE conditions in the source code. I did this systematically examining them and here is my recommendations in form of patches for these spots. It's half the effort but I'm really wasted right now, and can't go on. Perhaps another time I'll continue.
grep Logfile with comments below my signature. It is 20 patches, goes to ENDHERE Best Regards, -peter -- Over thirty years experience on Unix-like Operating Systems starting with QNX. from: 56 grep -r "%\ [0a-z]" * > /tmp/divide.txt STARTHERE: arch/alpha/stand/installboot.c: if ((minor(disksb.st_rdev) % getmaxpartitions()) != getrawpartition()) getmaxpartitions can return 0, but since it is an installboot, it's unlikely. arch/alpha/tc/ioasic.c: (led_blink_state.patpos + 1) % sizeof(led_pattern8); *safe arch/amd64/amd64/acpi_wakecode.S: .word 0x0fff, (ACPI_TRAMPOLINE % 0x10000) *safe arch/amd64/amd64/identcpu.c: ci->ci_smt_id = thread_id % nthreads; *safe (nthreads is > 1) arch/amd64/stand/efi32/efidev.c: i_lblks = ((off % blks) == 0)? 0 : blks - (off % blks); *safe if (blks == 0) arch/amd64/stand/efi32/efidev.c: i_tblks = (nsect > i_lblks)? (off + nsect) % blks : 0; arch/amd64/stand/efi64/efidev.c: i_lblks = ((off % blks) == 0)? 0 : blks - (off % blks); arch/amd64/stand/efi64/efidev.c: i_tblks = (nsect > i_lblks)? (off + nsect) % blks : 0; arch/amd64/stand/efiboot/efidev.c: if (off % blks != 0 || nsect % blks != 0) { *safe blks == 0 check arch/arm/mainbus/mainbus.c: if (sc->sc_rangeslen > 0 && !(sc->sc_rangeslen % sizeof(uint32_t))) { *safe arch/arm/mainbus/mainbus.c: if (len > 0 && (len % line) == 0) { --- mainbus.c Sat Mar 12 15:40:41 2022 +++ /tmp/tfile Sat Jul 29 12:02:00 2023 @@ -171,7 +171,7 @@ len = OF_getproplen(node, "reg"); line = (sc->sc_acells + sc->sc_scells) * sizeof(uint32_t); - if (len > 0 && (len % line) == 0) { + if (len > 0 && line > 0 && (len % line) == 0) { reg = malloc(len, M_TEMP, M_WAITOK); OF_getpropintarray(node, "reg", reg, len); arch/arm/mainbus/mainbus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { *safe arch/arm/simplebus/simplebus.c: (sc->sc_rangeslen % sizeof(uint32_t)) == 0) { arch/arm/simplebus/simplebus.c: (sc->sc_dmarangeslen % sizeof(uint32_t)) == 0) { *safe arch/arm/simplebus/simplebus.c: if (len > 0 && line > 0 && (len % line) == 0) { arch/arm/simplebus/simplebus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { *safe arch/arm64/arm64/intr.c: if (len <= 0 || (len % sizeof(uint32_t) != 0)) *safe arch/arm64/dev/aplpcie.c: (sc->sc_msi_rangelen % sizeof(uint32_t)) || arch/arm64/dev/aplpcie.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || *safe arch/arm64/dev/mainbus.c: if (sc->sc_rangeslen > 0 && !(sc->sc_rangeslen % sizeof(uint32_t))) { *safe arch/arm64/dev/mainbus.c: if (len > 0 && (len % line) == 0) { --- mainbus.c Tue Apr 11 06:29:15 2023 +++ /tmp/tfile Sat Jul 29 12:07:20 2023 @@ -228,7 +228,7 @@ len = OF_getproplen(node, "reg"); line = (sc->sc_acells + sc->sc_scells) * sizeof(uint32_t); - if (len > 0 && (len % line) == 0) { + if (len > 0 && line > 0 && (len % line) == 0) { reg = malloc(len, M_TEMP, M_WAITOK); OF_getpropintarray(node, "reg", reg, len); arch/arm64/dev/mainbus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { *safe arch/arm64/dev/simplebus.c: (sc->sc_rangeslen % sizeof(uint32_t)) == 0) { arch/arm64/dev/simplebus.c: (sc->sc_dmarangeslen % sizeof(uint32_t)) == 0) { *safe arch/arm64/dev/simplebus.c: if (len > 0 && line > 0 && (len % line) == 0) { arch/arm64/dev/simplebus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { *safe arch/arm64/stand/efiboot/efiboot.c: buf[i] ^= random[i % len]; arch/arm64/stand/efiboot/efiboot.c: buf[i] ^= random[i % len]; *safe arch/arm64/stand/efiboot/efidev.c: if (off % blks != 0 || nsect % blks != 0) { *safe arch/arm64/stand/efiboot/fdt.c: if ((cnt % sizeof(uint32_t)) == 0) *safe arch/armv7/armv7/intr.c: if (len <= 0 || (len % sizeof(uint32_t) != 0)) *safe arch/armv7/marvell/mvmbus.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t))) arch/armv7/marvell/mvpcie.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || *safe arch/armv7/omap/ommmc.c: if (cmd->c_datalen % blksize > 0) { --- ommmc.c Sun Oct 24 19:52:27 2021 +++ /tmp/tfile Sat Jul 29 12:19:48 2023 @@ -936,7 +936,7 @@ */ /* Fragment the data into proper blocks. */ - if (cmd->c_datalen > 0) { + if (cmd->c_datalen > 0 && cmd->c_blklen > 0) { blksize = MIN(cmd->c_datalen, cmd->c_blklen); blkcount = cmd->c_datalen / blksize; if (cmd->c_datalen % blksize > 0) { arch/armv7/stand/efiboot/efiboot.c: buf[i] ^= random[i % len]; arch/armv7/stand/efiboot/efiboot.c: buf[i] ^= random[i % len]; *safe arch/armv7/stand/efiboot/efidev.c: if (off % blks != 0 || nsect % blks != 0) { *safe arch/armv7/stand/efiboot/fdt.c: if ((cnt % sizeof(uint32_t)) == 0) *safe arch/armv7/vexpress/pciecam.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || *safe arch/hppa/hppa/pmap.c: pmap_sdir_get(space); space = (space + 1) % hppa_sid_max); *safe arch/hppa/stand/mkboot/mkboot.c: n = sizeof(int) - total % sizeof(int); arch/hppa/stand/mkboot/mkboot.c: if (total % sizeof(int)) { arch/hppa/stand/mkboot/mkboot.c: n = sizeof(buf) - total % sizeof(buf); *safe arch/luna88k/cbus/nec86hw.c: if ((cc % bpf) != 0) { arch/luna88k/cbus/nec86hw.c: if ((cc % bpf) != 0) { --- nec86hw.c Tue Apr 11 06:29:40 2023 +++ /tmp/tfile Sat Jul 29 12:32:46 2023 @@ -488,6 +488,10 @@ int bpf; bpf = (sc->channels * sc->precision) / NBBY; /* bytes per frame */ + if (bpf == 0) { + DPRINTF(("nec86hw_pdma_output: FPE avoided\n")); + return EIO; + } if ((cc % bpf) != 0) { DPRINTF(("nec86hw_pdma_output: odd bytes\n")); return EIO; @@ -545,6 +549,10 @@ int bpf; bpf = (sc->channels * sc->precision) / NBBY; /* bytes per frame */ + if (bpf == 0) { + DPRINTF(("nec86hw_pdma_input: FPE avoided\n")); + return EIO; + } if ((cc % bpf) != 0) { DPRINTF(("nec86hw_pdma_input: odd bytes\n")); return EIO; arch/macppc/dev/apm.c: printf("%d%% charged\n", ((info.cur_charge * 100) / info.max_charge)); --- apm.c Tue Apr 11 06:29:45 2023 +++ /tmp/tfile Sat Jul 29 12:39:24 2023 @@ -130,7 +130,10 @@ pm_battery_info(0, &info); printf(": battery flags 0x%X, ", info.flags); - printf("%d%% charged\n", ((info.cur_charge * 100) / info.max_charge)); + if (info.max_charge != 0) + printf("%d%% charged\n", ((info.cur_charge * 100) / info.max_charge)); + else + printf("NA%% charged\n"); #ifdef SUSPEND device_register_wakeup(self); @@ -256,8 +259,13 @@ power->ac_state = ((batt.flags & PMU_PWR_AC_PRESENT) ? APM_AC_ON : APM_AC_OFF); - power->battery_life = - ((batt.cur_charge * 100) / batt.max_charge); + + if (batt.max_charge != 0) { + power->battery_life = + ((batt.cur_charge * 100) / batt.max_charge); + } else { + power->battery_life = 0; + } /* * If the battery is charging, return the minutes left until arch/octeon/dev/amdcf.c: sc->sc_wrofs = ofs - (ofs - rofs) % sc->sc_wrbufsz; *safe sc_wrbufsz cannot be 0 or else EFAULT higher up arch/octeon/dev/octciu.c: cpuid = irq % ncpus; arch/octeon/dev/octciu.c: ci = get_cpu_info(ih->ih_irq % ncpus); *safe arch/octeon/dev/octmmc.c: cmd->c_datalen % sizeof(uint64_t) != 0) { *safe arch/octeon/dev/simplebus.c: if (sc->sc_rangeslen > 0 && !(sc->sc_rangeslen % sizeof(uint32_t))) { arch/octeon/dev/simplebus.c: if (len > 0 && line > 0 && (len % line) == 0) { arch/octeon/dev/simplebus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { *safe arch/powerpc64/dev/mainbus.c: if (sc->sc_rangeslen > 0 && !(sc->sc_rangeslen % sizeof(uint32_t))) { *safe arch/powerpc64/dev/mainbus.c: if (len > 0 && (len % line) == 0) { --- mainbus.c Fri Oct 21 07:20:38 2022 +++ /tmp/tfile Sat Jul 29 13:07:19 2023 @@ -225,7 +225,7 @@ len = OF_getproplen(node, "reg"); line = (sc->sc_acells + sc->sc_scells) * sizeof(uint32_t); - if (len > 0 && (len % line) == 0) { + if (len > 0 && line > 0 && (len % line) == 0) { reg = malloc(len, M_TEMP, M_WAITOK); OF_getpropintarray(node, "reg", reg, len); arch/powerpc64/dev/mainbus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { *safe arch/powerpc64/dev/opal.c: if (len > 0 && (len % sizeof(uint32_t)) != 0) { arch/powerpc64/dev/opal.c: if (flen <= 0 || flen % sizeof(flags[0]) != 0) arch/powerpc64/dev/opal.c: if (len <= 0 || len % sizeof(int) != 0 || *safe arch/powerpc64/dev/phb.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || arch/powerpc64/dev/phb.c: if (len <= 0 || (len % sizeof(uint32_t))) *safe arch/powerpc64/powerpc64/intr.c: if (len <= 0 || (len % sizeof(uint32_t) != 0)) *safe arch/riscv64/dev/mainbus.c: if (sc->sc_rangeslen > 0 && !(sc->sc_rangeslen % sizeof(uint32_t))) { arch/riscv64/dev/mainbus.c: if (len > 0 && (len % line) == 0) { --- mainbus.c Sun Jun 20 18:51:37 2021 +++ /tmp/tfile Sat Jul 29 13:11:45 2023 @@ -210,7 +210,7 @@ len = OF_getproplen(node, "reg"); line = (sc->sc_acells + sc->sc_scells) * sizeof(uint32_t); - if (len > 0 && (len % line) == 0) { + if (len > 0 && line > 0 && (len % line) == 0) { reg = malloc(len, M_TEMP, M_WAITOK); OF_getpropintarray(node, "reg", reg, len); arch/riscv64/dev/mainbus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { arch/riscv64/dev/simplebus.c: (sc->sc_rangeslen % sizeof(uint32_t)) == 0) { arch/riscv64/dev/simplebus.c: (sc->sc_dmarangeslen % sizeof(uint32_t)) == 0) { arch/riscv64/dev/simplebus.c: if (len > 0 && line > 0 && (len % line) == 0) { arch/riscv64/dev/simplebus.c: if (len > 0 && (len % sizeof(uint32_t)) == 0) { *safe arch/riscv64/riscv64/intr.c: if (len <= 0 || (len % sizeof(uint32_t) != 0)) *safe arch/riscv64/stand/efiboot/efidev.c: if (off % blks != 0 || nsect % blks != 0) { *safe arch/riscv64/stand/efiboot/fdt.c: if ((cnt % sizeof(uint32_t)) == 0) *safe arch/sparc64/dev/fd.c: sec = fd->sc_blkno % type->seccyl; *unsure about this (leaning towards safe) arch/sparc64/dev/vdsp.c: sc->sc_vd_ring[sc->sc_vd_prod % sc->sc_num_descriptors] = vd; arch/sparc64/dev/vdsp.c: vd = sc->sc_vd_ring[sc->sc_vd_cons++ % sc->sc_num_descriptors]; *seems safe (not sure) arch/sparc64/dev/vpci.c: eq = CPU_INFO_UNIT(cpu) % pbm->vp_neq; *safe arch/sparc64/sparc64/autoconf.c: if ((len % size) != 0) *safe arch/sparc64/sparc64/clock.c: if (1000000 % hz) { *safe arch/sparc64/sparc64/disksubr.c: if (DL_GETPOFFSET(npp) % secpercyl) arch/sparc64/sparc64/disksubr.c: if (DL_GETPOFFSET(npp) % secpercyl) *see arch/sparc64/dev/fd.c, seems safe crypto/arc4.c: x = (x + 1) % klen; --- arc4.c Tue Sep 11 14:07:05 2007 +++ /tmp/tfile Sat Jul 29 13:47:25 2023 @@ -32,6 +32,9 @@ u_int8_t x, y; u_int32_t i; + if (klen == 0) + return; + x = y = 0; for (i = 0; i < RC4STATE; i++) ctx->state[i] = i; crypto/cryptosoft.c: if (crd->crd_len % blks) --- cryptosoft.c Sun Oct 24 12:26:22 2021 +++ /tmp/tfile Sat Jul 29 13:50:37 2023 @@ -111,7 +111,7 @@ ivlen = exf->ivsize; /* Check for non-padded data */ - if (crd->crd_len % blks) + if (blks != 0 && crd->crd_len % blks) return EINVAL; if (outtype == CRYPTO_BUF_MBUF) crypto/siphash.c: used = ctx->bytes % sizeof(ctx->buf); crypto/siphash.c: used = ctx->bytes % sizeof(ctx->buf); *safe ddb/db_dwarf.c: line += line_base + diff % line_range; line_range could be 0 here, but I don't know how to fix this. dev/audio.c: r = a % b; dev/audio.c: todo -= todo % nblk; dev/audio.c: todo -= todo % nblk; dev/audio.c: max -= max % mult; dev/audio.c: min -= min % mult; dev/audio.c: sc->round -= sc->round % mult; dev/audio.c: sc->play.used -= sc->play.used % bpf; --- audio.c Tue Apr 11 06:30:25 2023 +++ /tmp/tfile Sat Jul 29 14:07:33 2023 @@ -502,7 +502,7 @@ sc->offs--; nblk = sc->rec.len / sc->rec.blksz; todo = -sc->offs; - if (todo >= nblk) { + if (nblk != 0 && todo >= nblk) { todo -= todo % nblk; DPRINTFN(1, "%s: rec ptr wrapped, moving %d blocks\n", DEVNAME(sc), todo); @@ -581,7 +581,7 @@ sc->offs++; nblk = sc->play.len / sc->play.blksz; todo = sc->offs; - if (todo >= nblk) { + if (nblk != 0 && todo >= nblk) { todo -= todo % nblk; DPRINTFN(1, "%s: play ptr wrapped, moving %d blocks\n", DEVNAME(sc), todo); @@ -809,6 +809,11 @@ np = nr; } max = np < nr ? np : nr; + if (mult == 0) { + printf("%s: avoiding divide by zero in %s %d\n", DEVNAME(sc) + , __FILE__, __LINE__); + return EIO; + } max -= max % mult; min = sc->rate / 1000 + mult - 1; min -= min % mult; @@ -1524,6 +1529,10 @@ /* discard partial samples, required by audio_fill_sil() */ mtx_enter(&audio_lock); bpf = sc->pchan * sc->bps; + if (bpf == 0) { + mtx_leave(&audio_lock); + return 0; + } sc->play.used -= sc->play.used % bpf; if (sc->play.used == 0) { mtx_leave(&audio_lock); dev/rnd.c: * returned is outside the range [0, 2**32 % upper_bound). This dev/rnd.c: * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) dev/rnd.c: /* 2**32 % x == (2**32 - x) % x */ dev/rnd.c: min = -upper_bound % upper_bound; dev/rnd.c: return r % upper_bound; dev/rnd.c: while (n % sizeof(u_int32_t)) *safe dev/softraid_raid0.c: chunk = strip_no % no_chunk; --- softraid_raid0.c Wed Mar 25 22:29:04 2020 +++ /tmp/tfile Sat Jul 29 14:12:00 2023 @@ -132,6 +132,8 @@ strip_size = sd->sd_meta->ssdi.ssd_strip_size; strip_bits = sd->mds.mdd_raid0.sr0_strip_bits; no_chunk = sd->sd_meta->ssdi.ssd_chunk_no; + if (no_chunk == 0) + goto bad; DNPRINTF(SR_D_DIS, "%s: %s: front end io: blkno %lld size %d\n", DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, dev/softraid_raid5.c: chunk = strip_no % no_chunk; --- softraid_raid5.c Sun May 16 17:12:37 2021 +++ /tmp/tfile Sat Jul 29 14:19:55 2023 @@ -394,6 +394,10 @@ strip_size = sd->sd_meta->ssdi.ssd_strip_size; strip_bits = sd->mds.mdd_raid5.sr5_strip_bits; no_chunk = sd->sd_meta->ssdi.ssd_chunk_no - 1; + + if (no_chunk == 0 || no_chunk == -1) + goto bad; + row_size = (no_chunk << strip_bits) >> DEV_BSHIFT; data = xs->data; dev/softraid_raid6.c: chunk = strip_no % no_chunk; dev/softraid_raid6.c: /* use 2N pow table to avoid using % in multiply */ --- softraid_raid6.c Sun May 16 17:12:37 2021 +++ /tmp/tfile Sat Jul 29 14:26:31 2023 @@ -390,6 +390,10 @@ strip_size = sd->sd_meta->ssdi.ssd_strip_size; strip_bits = sd->mds.mdd_raid6.sr6_strip_bits; no_chunk = sd->sd_meta->ssdi.ssd_chunk_no - 2; + + if (no_chunk == 0 || no_chunk == -2) + goto bad; + row_size = (no_chunk << strip_bits) >> DEV_BSHIFT; data = xs->data; dev/acpi/acpi.c: KASSERT((len % access_size) == 0); --- acpi.c Tue Apr 11 06:30:26 2023 +++ /tmp/tfile Sat Jul 29 14:31:15 2023 @@ -247,7 +247,7 @@ dnprintf(50, "gasio: %.2x 0x%.8llx %s\n", iospace, address, (iodir == ACPI_IOWRITE) ? "write" : "read"); - KASSERT((len % access_size) == 0); + KASSERT(access_size != 0 && (len % access_size) == 0); pb = (uint8_t *)buffer; switch (iospace) { dev/acpi/acpidmar.c: fri = (fri + 1) % nfr; *safe dev/acpi/dsdt.c: rv += (val % iradix) * pwr; dev/acpi/dsdt.c: res = (lhs % rhs); dev/acpi/dsdt.c: KASSERT((len % access_size) == 0); --- dsdt.c Thu Dec 9 21:21:35 2021 +++ /tmp/tfile Sat Jul 29 14:39:17 2023 @@ -1130,7 +1130,10 @@ res = (lhs / rhs); break; case AMLOP_MOD: - res = (lhs % rhs); + if (rhs == 0) /* XXX bad AMLOP mod with rhs == 0 */ + res = 0; + else + res = (lhs % rhs); break; case AMLOP_SHL: res = (lhs << rhs); @@ -2336,7 +2339,7 @@ dnprintf(50, "genio: %.2x 0x%.8llx %s\n", iospace, address, (iodir == ACPI_IOWRITE) ? "write" : "read"); - KASSERT((len % access_size) == 0); + KASSERT(access_size != 0 && (len % access_size) == 0); pb = (uint8_t *)buffer; for (reg = 0; reg < len; reg += access_size) { dev/ata/ata_wdc.c: sect = blkno % ata_bio->lp->d_nsectors; dev/ata/ata_wdc.c: head = blkno % ata_bio->lp->d_ntracks; --- ata_wdc.c Fri Nov 2 10:59:36 2018 +++ /tmp/tfile Sat Jul 29 14:45:51 2023 @@ -300,6 +300,13 @@ head |= WDSD_LBA; } else { int blkno = ata_bio->blkno; + + if (ata_bio->lp->d_ntracks == 0 || \ + ata_bio->lp->d_nsectors) { + wdc_ata_bio_done(chp, xfer); + return; + } + sect = blkno % ata_bio->lp->d_nsectors; sect++; /* Sectors begin with 1, not 0. */ blkno /= ata_bio->lp->d_nsectors; * this could be wrong too in wdc_ata_bio_done()... dev/ata/wd.c: if ((size % lp->d_secsize) != 0) --- wd.c Tue Apr 11 06:30:26 2023 +++ /tmp/tfile Sat Jul 29 14:48:03 2023 @@ -921,7 +921,7 @@ /* Convert to disk sectors. Request must be a multiple of size. */ lp = wd->sc_dk.dk_label; - if ((size % lp->d_secsize) != 0) + if (lp->d_secsize != 0 && (size % lp->d_secsize) != 0) return EFAULT; nblks = size / lp->d_secsize; blkno = blkno / (lp->d_secsize / DEV_BSIZE); dev/fdt/bcm2711_pcie.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || dev/fdt/bcm2711_pcie.c: if ((rangeslen % sizeof(uint32_t)) || *safe dev/fdt/bcm2835_sdhost.c: if (nblks == 0 || (cmd->c_datalen % cmd->c_blklen) != 0) --- bcm2835_sdhost.c Fri Oct 21 07:20:46 2022 +++ /tmp/tfile Sat Jul 29 14:51:25 2023 @@ -436,7 +436,7 @@ cmdval |= SDCMD_WRITE; nblks = cmd->c_datalen / cmd->c_blklen; - if (nblks == 0 || (cmd->c_datalen % cmd->c_blklen) != 0) + if (nblks == 0 || (cmd->c_blklen != 0 && (cmd->c_datalen % cmd->c_blklen) != 0)) ++nblks; bcmsdhost_write(sc, SDHBCT, cmd->c_blklen); dev/fdt/dwmmc.c: if (blklen % sc->sc_fifo_width == 0) *safe dev/fdt/dwpcie.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || *safe dev/fdt/imxesdhc.c: if (cmd->c_datalen % blksize > 0) { --- imxesdhc.c Sun Jan 9 06:42:37 2022 +++ /tmp/tfile Sat Jul 29 14:55:34 2023 @@ -882,7 +882,7 @@ */ /* Fragment the data into proper blocks. */ - if (cmd->c_datalen > 0) { + if (cmd->c_datalen > 0 && cmd->c_blklen > 0) { blksize = MIN(cmd->c_datalen, cmd->c_blklen); blkcount = cmd->c_datalen / blksize; if (cmd->c_datalen % blksize > 0) { dev/fdt/mvkpcie.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || dev/fdt/pciecam.c: if (rangeslen <= 0 || (rangeslen % sizeof(uint32_t)) || *safe dev/fdt/rkclock.c: d = n % d; *safe dev/fdt/simpleaudio.c: if (len % sizeof(uint32_t) != 0) *safe dev/ic/aic79xx.c: if ((sg_prefetch_align % sg_size) != 0 *safe dev/ic/anvar.h:#define AN_INC(x, y) (x) = (x + 1) % y *safe dev/ic/atw.c: * (uint32_t)((((uint64_t)tsfth << 32) | tsftl) % ival) dev/ic/atw.c: * (0x100000000 * H + L) % m dev/ic/atw.c: * = ((0x100000000 % m) * H + L) % m dev/ic/atw.c: * = (((0xffffffff + 1) % m) * H + L) % m dev/ic/atw.c: * = ((0xffffffff % m + 1 % m) * H + L) % m dev/ic/atw.c: * = ((0xffffffff % m + 1) * H + L) % m dev/ic/atw.c: return ((0xFFFFFFFF % ival + 1) * tsfth + tsftl) % ival; dev/ic/atw.c: remainder = (bitlen * 2) % rate; dev/ic/atw.c: lastlen0 = paylen % fraglen; --- atw.c Fri Oct 21 07:20:47 2022 +++ /tmp/tfile Sat Jul 29 15:10:27 2023 @@ -2397,6 +2397,10 @@ * = ((0xffffffff % m + 1 % m) * H + L) % m * = ((0xffffffff % m + 1) * H + L) % m */ + + if (ival == (uint32_t)-1 || ival == 0) /* XXX */ + ival = 1; + return ((0xFFFFFFFF % ival + 1) * tsfth + tsftl) % ival; } @@ -3468,6 +3472,9 @@ { int ack, rc; int firstlen, hdrlen, lastlen, lastlen0, npkt, overlen, paylen; + + if (fraglen == 0) + return -1; if (ieee80211_has_addr4(wh)) hdrlen = sizeof(struct ieee80211_frame_addr4); dev/ic/ciss.c: bd->bd_target = ldp->tgts[pd] % sc->ndrives; *safe? dev/ic/dcreg.h:#define DC_INC(x, y) (x) = (x + 1) % y *safe dev/ic/dp8390.c: if ((sc->txb_next_tx + sc->txb_inuse) % sc->txb_cnt != sc->txb_new) --- dp8390.c Sun Jan 9 06:42:38 2022 +++ /tmp/tfile Sat Jul 29 15:15:17 2023 @@ -373,6 +373,9 @@ u_short len; #ifdef DIAGNOSTIC + if (sc->txb_cnt == 0) + panic("dp8390_xmit: fix my FP exception!"); + if ((sc->txb_next_tx + sc->txb_inuse) % sc->txb_cnt != sc->txb_new) panic("dp8390_xmit: desync, next_tx=%d inuse=%d cnt=%d new=%d", sc->txb_next_tx, sc->txb_inuse, sc->txb_cnt, sc->txb_new); ENDHERE, LATERMORE