Module Name: src Committed By: christos Date: Thu Mar 27 18:22:56 UTC 2014
Modified Files: src/sys/arch/dreamcast/dev/maple: maple.c src/sys/arch/ia64/disasm: disasm_format.c src/sys/arch/ia64/stand/efi/libefi: devicename.c src/sys/arch/ia64/stand/ia64/ski: devicename.c src/sys/arch/next68k/dev: esp.c src/sys/arch/prep/prep: autoconf.c residual.c src/sys/arch/sparc/sparc: cpu.c src/sys/arch/x86/acpi: acpi_cpu_md.c src/sys/arch/x86/x86: est.c odcm.c procfs_machdep.c src/sys/arch/xen/xen: pciback.c src/sys/arch/xen/xenbus: xenbus_client.c Log Message: correct/add protection against snprintf overflow. To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/sys/arch/dreamcast/dev/maple/maple.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/ia64/disasm/disasm_format.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/ia64/stand/efi/libefi/devicename.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/ia64/stand/ia64/ski/devicename.c cvs rdiff -u -r1.61 -r1.62 src/sys/arch/next68k/dev/esp.c cvs rdiff -u -r1.26 -r1.27 src/sys/arch/prep/prep/autoconf.c cvs rdiff -u -r1.17 -r1.18 src/sys/arch/prep/prep/residual.c cvs rdiff -u -r1.242 -r1.243 src/sys/arch/sparc/sparc/cpu.c cvs rdiff -u -r1.75 -r1.76 src/sys/arch/x86/acpi/acpi_cpu_md.c cvs rdiff -u -r1.28 -r1.29 src/sys/arch/x86/x86/est.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/x86/x86/odcm.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/x86/x86/procfs_machdep.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/xen/xen/pciback.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/xen/xenbus/xenbus_client.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/dreamcast/dev/maple/maple.c diff -u src/sys/arch/dreamcast/dev/maple/maple.c:1.49 src/sys/arch/dreamcast/dev/maple/maple.c:1.50 --- src/sys/arch/dreamcast/dev/maple/maple.c:1.49 Wed Mar 26 12:08:45 2014 +++ src/sys/arch/dreamcast/dev/maple/maple.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: maple.c,v 1.49 2014/03/26 16:08:45 christos Exp $ */ +/* $NetBSD: maple.c,v 1.50 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: maple.c,v 1.49 2014/03/26 16:08:45 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: maple.c,v 1.50 2014/03/27 18:22:56 christos Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -353,7 +353,9 @@ maple_run_polling(device_t dev) static char * maple_unit_name(char *buf, size_t len, int port, int subunit) { - int l = snprintf(buf, len, "maple%c", port + 'A'); + size_t l = snprintf(buf, len, "maple%c", port + 'A'); + if (l > len) + l = len; if (subunit) snprintf(buf + l, len - l, "%d", subunit); Index: src/sys/arch/ia64/disasm/disasm_format.c diff -u src/sys/arch/ia64/disasm/disasm_format.c:1.2 src/sys/arch/ia64/disasm/disasm_format.c:1.3 --- src/sys/arch/ia64/disasm/disasm_format.c:1.2 Tue Mar 25 14:35:32 2014 +++ src/sys/arch/ia64/disasm/disasm_format.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: disasm_format.c,v 1.2 2014/03/25 18:35:32 christos Exp $ */ +/* $NetBSD: disasm_format.c,v 1.3 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 2000-2003 Marcel Moolenaar @@ -277,6 +277,8 @@ asm_operand(const struct asm_oper *o, ch } if (n[0] != '\0') { l = snprintf(buf, buflen, "%s[", n); + if (l > buflen) + l = buflen; buf += l; buflen -= l; } @@ -284,7 +286,11 @@ asm_operand(const struct asm_oper *o, ch case 1: l = strlcpy(buf, "gp", buflen); break; case 12: l = strlcpy(buf, "sp", buflen); break; case 13: l = strlcpy(buf, "tp", buflen); break; - default: l += snprintf(buf, buflen, "r%d", (int)o->o_value); break; + default: + l += snprintf(buf, buflen, "r%d", (int)o->o_value); + if (l > buflen) + l = buflen; + break; } buf += l; buflen -= l; Index: src/sys/arch/ia64/stand/efi/libefi/devicename.c diff -u src/sys/arch/ia64/stand/efi/libefi/devicename.c:1.6 src/sys/arch/ia64/stand/efi/libefi/devicename.c:1.7 --- src/sys/arch/ia64/stand/efi/libefi/devicename.c:1.6 Tue Mar 25 14:35:33 2014 +++ src/sys/arch/ia64/stand/efi/libefi/devicename.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: devicename.c,v 1.6 2014/03/25 18:35:33 christos Exp $ */ +/* $NetBSD: devicename.c,v 1.7 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 1998 Michael Smith <msm...@freebsd.org> @@ -208,7 +208,7 @@ efi_fmtdev(void *vdev) { struct efi_devdesc *dev = (struct efi_devdesc *)vdev; static char buf[128]; /* XXX device length constant? */ - size_t len; + size_t len, buflen = sizeof(buf); switch(dev->d_type) { case DEVT_NONE: @@ -216,16 +216,24 @@ efi_fmtdev(void *vdev) break; case DEVT_DISK: - len = snprintf(buf, sizeof(buf), "%s%d", dev->d_dev->dv_name, dev->d_kind.efidisk.unit); - if (dev->d_kind.efidisk.slice > 0) - len += snprintf(buf + len, sizeof(buf) - len, "s%d", dev->d_kind.efidisk.slice); - if (dev->d_kind.efidisk.partition >= 0) - len += snprintf(buf + len, sizeof(buf) - len, "%c", dev->d_kind.efidisk.partition + 'a'); + len = snprintf(buf, buflen, "%s%d", dev->d_dev->dv_name, dev->d_kind.efidisk.unit); + if (len > buflen) + len = buflen; + if (dev->d_kind.efidisk.slice > 0) { + len += snprintf(buf + len, buflen - len, "s%d", dev->d_kind.efidisk.slice); + if (len > buflen) + len = buflen; + } + if (dev->d_kind.efidisk.partition >= 0) { + len += snprintf(buf + len, buflen - len, "%c", dev->d_kind.efidisk.partition + 'a'); + if (len > buflen) + } + len = buflen; strlcat(buf, ":", sizeof(buf) - len); break; case DEVT_NET: - snprintf(buf, sizeof(buf), "%s%d:", dev->d_dev->dv_name, dev->d_kind.netif.unit); + snprintf(buf, buflen, "%s%d:", dev->d_dev->dv_name, dev->d_kind.netif.unit); break; } return(buf); Index: src/sys/arch/ia64/stand/ia64/ski/devicename.c diff -u src/sys/arch/ia64/stand/ia64/ski/devicename.c:1.5 src/sys/arch/ia64/stand/ia64/ski/devicename.c:1.6 --- src/sys/arch/ia64/stand/ia64/ski/devicename.c:1.5 Tue Mar 25 14:35:33 2014 +++ src/sys/arch/ia64/stand/ia64/ski/devicename.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: devicename.c,v 1.5 2014/03/25 18:35:33 christos Exp $ */ +/* $NetBSD: devicename.c,v 1.6 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 1998 Michael Smith <msm...@freebsd.org> @@ -203,24 +203,32 @@ ski_fmtdev(void *vdev) { struct ski_devdesc *dev = (struct ski_devdesc *)vdev; static char buf[128]; /* XXX device length constant? */ - size_t len; + size_t len, buflen = sizeof(buf); switch(dev->d_type) { case DEVT_NONE: - strcpy(buf, "(no device)"); + strlcpy(buf, "(no device)", buflen); break; case DEVT_DISK: - len = snprintf(buf, sizeof(buf), "%s%d", dev->d_dev->dv_name, dev->d_kind.skidisk.unit); - if (dev->d_kind.skidisk.slice > 0) - len = snprintf(buf, sizeof(buf) - len, "s%d", dev->d_kind.skidisk.slice); - if (dev->d_kind.skidisk.partition >= 0) - len = snprintf(buf, sizeof(buf) - len, "%c", dev->d_kind.skidisk.partition + 'a'); - strlcat(cp, ":", sizeof(buf) - len); + len = snprintf(buf, buflen, "%s%d", dev->d_dev->dv_name, dev->d_kind.skidisk.unit); + if (len > buflen) + len = buflen; + if (dev->d_kind.skidisk.slice > 0) { + len += snprintf(buf + len, buflen - len, "s%d", dev->d_kind.skidisk.slice); + if (len > buflen) + len = buflen; + } + if (dev->d_kind.skidisk.partition >= 0) { + len += snprintf(buf + len, buflen - len, "%c", dev->d_kind.skidisk.partition + 'a'); + if (len > buflen) + len = buflen; + } + strlcat(cp, ":", buflen - len); break; case DEVT_NET: - snprintf(buf, sizeof(buf) - len, "%s%d:", dev->d_dev->dv_name, dev->d_kind.netif.unit); + snprintf(buf, buflen - len, "%s%d:", dev->d_dev->dv_name, dev->d_kind.netif.unit); break; } return(buf); Index: src/sys/arch/next68k/dev/esp.c diff -u src/sys/arch/next68k/dev/esp.c:1.61 src/sys/arch/next68k/dev/esp.c:1.62 --- src/sys/arch/next68k/dev/esp.c:1.61 Tue Mar 25 15:41:32 2014 +++ src/sys/arch/next68k/dev/esp.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: esp.c,v 1.61 2014/03/25 19:41:32 christos Exp $ */ +/* $NetBSD: esp.c,v 1.62 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -75,7 +75,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: esp.c,v 1.61 2014/03/25 19:41:32 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: esp.c,v 1.62 2014/03/27 18:22:56 christos Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -1155,8 +1155,12 @@ esp_dma_store(struct ncr53c9x_softc *sc) l += snprintf(p + l, len - l, "%s: sc_datain=%d\n", device_xname(sc->sc_dev), esc->sc_datain); + if (l > len) + return; l += snprintf(p + l, len - l, "%s: sc_loaded=0x%08x\n", device_xname(sc->sc_dev), esc->sc_loaded); + if (l > len) + return; if (esc->sc_dmaaddr) { l += snprintf(p + l, len - l, "%s: sc_dmaaddr=%p\n", @@ -1165,6 +1169,8 @@ esp_dma_store(struct ncr53c9x_softc *sc) l += snprintf(p + l, len - l, "%s: sc_dmaaddr=NULL\n", device_xname(sc->sc_dev)); } + if (l > len) + return; if (esc->sc_dmalen) { l += snprintf(p + l, len - l, "%s: sc_dmalen=0x%08x\n", device_xname(sc->sc_dev), *esc->sc_dmalen); @@ -1172,19 +1178,29 @@ esp_dma_store(struct ncr53c9x_softc *sc) l += snprintf(p + l, len - l, "%s: sc_dmalen=NULL\n", device_xname(sc->sc_dev)); } + if (l > len) + return; l += snprintf(p + l, len - l, "%s: sc_dmasize=0x%08x\n", device_xname(sc->sc_dev), esc->sc_dmasize); + if (l > len) + return; l += snprintf(p + l, len - l, "%s: sc_begin = %p, sc_begin_size = 0x%08x\n", + if (l > len) + return; device_xname(sc->sc_dev), esc->sc_begin, esc->sc_begin_size); l += snprintf(p + l, len - l, "%s: sc_main = %p, sc_main_size = 0x%08x\n", device_xname(sc->sc_dev), esc->sc_main, esc->sc_main_size); + if (l > len) + return; /* if (esc->sc_main) */ { int i; bus_dmamap_t map = esc->sc_main_dmamap; l += snprintf(p + l, len - l, "%s: sc_main_dmamap." " mapsize = 0x%08lx, nsegs = %d\n", device_xname(sc->sc_dev), map->dm_mapsize, map->dm_nsegs); + if (l > len) + return; for(i = 0; i < map->dm_nsegs; i++) { l += snprintf(p + l, len - l, "%s:" " map->dm_segs[%d].ds_addr = 0x%08lx," @@ -1192,16 +1208,22 @@ esp_dma_store(struct ncr53c9x_softc *sc) device_xname(sc->sc_dev), i, map->dm_segs[i].ds_addr, map->dm_segs[i].ds_len); + if (l > len) + return; } } l += snprintf(p + l, len - l, "%s: sc_tail = %p, sc_tail_size = 0x%08x\n", device_xname(sc->sc_dev), esc->sc_tail, esc->sc_tail_size); + if (l > len) + return; /* if (esc->sc_tail) */ { int i; bus_dmamap_t map = esc->sc_tail_dmamap; l += snprintf(p + l, len - l, "%s: sc_tail_dmamap." " mapsize = 0x%08lx, nsegs = %d\n", device_xname(sc->sc_dev), map->dm_mapsize, map->dm_nsegs); + if (l > len) + return; for (i = 0; i < map->dm_nsegs; i++) { l += snprintf(p + l, len - l, "%s:" " map->dm_segs[%d].ds_addr = 0x%08lx," @@ -1209,6 +1231,8 @@ esp_dma_store(struct ncr53c9x_softc *sc) device_xname(sc->sc_dev), i, map->dm_segs[i].ds_addr, map->dm_segs[i].ds_len); + if (l > len) + return; } } } Index: src/sys/arch/prep/prep/autoconf.c diff -u src/sys/arch/prep/prep/autoconf.c:1.26 src/sys/arch/prep/prep/autoconf.c:1.27 --- src/sys/arch/prep/prep/autoconf.c:1.26 Fri Jun 28 10:42:31 2013 +++ src/sys/arch/prep/prep/autoconf.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.26 2013/06/28 14:42:31 christos Exp $ */ +/* $NetBSD: autoconf.c,v 1.27 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.26 2013/06/28 14:42:31 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.27 2014/03/27 18:22:56 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -167,11 +167,15 @@ device_register(device_t dev, void *aux) n = snprintf(devpath, sizeof(devpath), "%s@", pna->pna_devid); io = SIMPLEQ_FIRST(&pna->pna_res.io); + if (n > sizeof(devpath)) + n = sizeof(devpath); if (io != NULL) n += snprintf(devpath + n, sizeof(devpath) - n, "%x", io->minbase); } + if (n > sizeof(devpath)) + n = sizeof(devpath); /* we can't trust the device tag on the ethernet, because * the spec lies about how it is formed. Therefore we will leave it * blank, and trim the end off any ethernet stuff. */ @@ -190,8 +194,12 @@ device_register(device_t dev, void *aux) struct scsipibus_attach_args *sa = aux; /* periph_target is target for scsi, drive # for atapi */ + if (n > sizeof(devpath)) + n = sizeof(devpath); n += snprintf(devpath + n, sizeof(devpath) - n, "%d", sa->sa_periph->periph_target); + if (n > sizeof(devpath)) + n = sizeof(devpath); if (device_is_a(parent, "scsibus")) n += snprintf(devpath + n, sizeof(devpath) - n, ",%d", sa->sa_periph->periph_lun); @@ -199,9 +207,13 @@ device_register(device_t dev, void *aux) device_is_a(parent, "pciide")) { struct ata_device *adev = aux; + if (n > sizeof(devpath)) + n = sizeof(devpath); n += snprintf(devpath + n, sizeof(devpath) - n, "%d", adev->adev_drv_data->drive); } else if (device_is_a(dev, "fd")) { + if (n > sizeof(devpath)) + n = sizeof(devpath); /* XXX device_unit() abuse */ n += snprintf(devpath + n, sizeof(devpath) - n, "%d", device_unit(dev)); Index: src/sys/arch/prep/prep/residual.c diff -u src/sys/arch/prep/prep/residual.c:1.17 src/sys/arch/prep/prep/residual.c:1.18 --- src/sys/arch/prep/prep/residual.c:1.17 Wed Mar 26 12:01:43 2014 +++ src/sys/arch/prep/prep/residual.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: residual.c,v 1.17 2014/03/26 16:01:43 christos Exp $ */ +/* $NetBSD: residual.c,v 1.18 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: residual.c,v 1.17 2014/03/26 16:01:43 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: residual.c,v 1.18 2014/03/27 18:22:56 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -965,6 +965,8 @@ large_vendor_pcibridge_subr(struct _L4_P l += snprintf(tmpstr + l, sizeof(tmpstr) - l, "%s%d(%c)", l == 0 ? "/" : "", line & 0x7fff, line & 0x8000 ? 'E' : 'L'); + if (l > sizeof(tmpstr)) + break; } } printf("%s\n", tmpstr); Index: src/sys/arch/sparc/sparc/cpu.c diff -u src/sys/arch/sparc/sparc/cpu.c:1.242 src/sys/arch/sparc/sparc/cpu.c:1.243 --- src/sys/arch/sparc/sparc/cpu.c:1.242 Wed Mar 26 11:55:43 2014 +++ src/sys/arch/sparc/sparc/cpu.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.242 2014/03/26 15:55:43 christos Exp $ */ +/* $NetBSD: cpu.c,v 1.243 2014/03/27 18:22:56 christos Exp $ */ /* * Copyright (c) 1996 @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.242 2014/03/26 15:55:43 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.243 2014/03/27 18:22:56 christos Exp $"); #include "opt_multiprocessor.h" #include "opt_lockdebug.h" @@ -744,6 +744,8 @@ xcall(xcall_func_t func, xcall_trap_t tr "xcall(cpu%d,%p) from %p: couldn't ping cpus:", cpu_number(), fasttrap ? trap : func, __builtin_return_address(0)); + if (wrsz > bufsz) + break; bufsz -= wrsz; bufp += wrsz; } @@ -757,11 +759,10 @@ xcall(xcall_func_t func, xcall_trap_t tr if (i < 0) { wrsz = snprintf(bufp, bufsz, " cpu%d", cpi->ci_cpuid); + if (wrsz > bufsz) + break; bufsz -= wrsz; bufp += wrsz; - /* insanity */ - if (bufsz < 0) - break; } else { done = 0; break; Index: src/sys/arch/x86/acpi/acpi_cpu_md.c diff -u src/sys/arch/x86/acpi/acpi_cpu_md.c:1.75 src/sys/arch/x86/acpi/acpi_cpu_md.c:1.76 --- src/sys/arch/x86/acpi/acpi_cpu_md.c:1.75 Tue Dec 10 21:14:08 2013 +++ src/sys/arch/x86/acpi/acpi_cpu_md.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_cpu_md.c,v 1.75 2013/12/11 02:14:08 msaitoh Exp $ */ +/* $NetBSD: acpi_cpu_md.c,v 1.76 2014/03/27 18:22:56 christos Exp $ */ /*- * Copyright (c) 2010, 2011 Jukka Ruohonen <jruoho...@iki.fi> @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.75 2013/12/11 02:14:08 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.76 2014/03/27 18:22:56 christos Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -1153,6 +1153,8 @@ acpicpu_md_pstate_sysctl_all(SYSCTLFN_AR len += snprintf(buf + len, sizeof(buf) - len, "%u%s", sc->sc_pstate[i].ps_freq, i < (sc->sc_pstate_count - 1) ? " " : ""); + if (len > sizeof(buf)) + break; } mutex_exit(&sc->sc_mtx); Index: src/sys/arch/x86/x86/est.c diff -u src/sys/arch/x86/x86/est.c:1.28 src/sys/arch/x86/x86/est.c:1.29 --- src/sys/arch/x86/x86/est.c:1.28 Fri Nov 15 03:47:55 2013 +++ src/sys/arch/x86/x86/est.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: est.c,v 1.28 2013/11/15 08:47:55 msaitoh Exp $ */ +/* $NetBSD: est.c,v 1.29 2014/03/27 18:22:56 christos Exp $ */ /* * Copyright (c) 2003 Michael Eriksson. * All rights reserved. @@ -76,7 +76,7 @@ * http://www.codemonkey.org.uk/projects/cpufreq/cpufreq-2.4.22-pre6-1.gz */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: est.c,v 1.28 2013/11/15 08:47:55 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: est.c,v 1.29 2014/03/27 18:22:56 christos Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -1276,6 +1276,8 @@ est_tables(device_t self) len += snprintf(sc->sc_freqs + len, sc->sc_freqs_len - len, "%d%s", MSR2MHZ(sc->sc_fqlist->table[i], sc->sc_bus_clock), i < sc->sc_fqlist->n - 1 ? " " : ""); + if (len > sc->sc_freqs_len) + break; } aprint_debug_dev(self, "%d mV, %d (MHz): %s\n", mv, Index: src/sys/arch/x86/x86/odcm.c diff -u src/sys/arch/x86/x86/odcm.c:1.3 src/sys/arch/x86/x86/odcm.c:1.4 --- src/sys/arch/x86/x86/odcm.c:1.3 Fri Nov 15 03:47:55 2013 +++ src/sys/arch/x86/x86/odcm.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: odcm.c,v 1.3 2013/11/15 08:47:55 msaitoh Exp $ */ +/* $NetBSD: odcm.c,v 1.4 2014/03/27 18:22:56 christos Exp $ */ /* $OpenBSD: p4tcc.c,v 1.13 2006/12/20 17:50:40 gwk Exp $ */ /* @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: odcm.c,v 1.3 2013/11/15 08:47:55 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: odcm.c,v 1.4 2014/03/27 18:22:56 christos Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -208,6 +208,8 @@ odcm_init(device_t self) len += snprintf(sc->sc_names + len, sc->sc_names_len - len, "%d%s", state[i].level, i < __arraycount(state) ? " " : ""); + if (len > sc->sc_names_len) + break; } /* Index: src/sys/arch/x86/x86/procfs_machdep.c diff -u src/sys/arch/x86/x86/procfs_machdep.c:1.4 src/sys/arch/x86/x86/procfs_machdep.c:1.5 --- src/sys/arch/x86/x86/procfs_machdep.c:1.4 Mon Mar 24 16:06:33 2014 +++ src/sys/arch/x86/x86/procfs_machdep.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_machdep.c,v 1.4 2014/03/24 20:06:33 christos Exp $ */ +/* $NetBSD: procfs_machdep.c,v 1.5 2014/03/27 18:22:56 christos Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_machdep.c,v 1.4 2014/03/24 20:06:33 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_machdep.c,v 1.5 2014/03/27 18:22:56 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -151,10 +151,10 @@ procfs_getonecpu(int xcpu, struct cpu_in for (i = 0; i < 32; i++) { if ((ci->ci_feat_val[0] & (1 << i)) && x86_features[i]) { l = snprintf(p, left, "%s ", x86_features[i]); + if (l > left) + return 0; left -= l; p += l; - if (left <= 0) - break; } } @@ -174,20 +174,20 @@ procfs_getonecpu(int xcpu, struct cpu_in cpu_brand_string ); + if (l > left) + return 0; left -= l; p += l; - if (left <= 0) - return 0; if (cpuid_level >= 0) l = snprintf(p, left, "%d\n", ci->ci_signature & 15); else l = snprintf(p, left, "unknown\n"); + if (l > left) + return 0; left -= l; p += l; - if (left <= 0) - return 0; if (ci->ci_data.cpu_cc_freq != 0) { uint64_t freq, fraq; @@ -199,10 +199,10 @@ procfs_getonecpu(int xcpu, struct cpu_in } else l = snprintf(p, left, "cpu MHz\t\t: unknown\n"); + if (l > left) + return 0; left -= l; p += l; - if (left <= 0) - return 0; l = snprintf(p, left, "fdiv_bug\t: %s\n" Index: src/sys/arch/xen/xen/pciback.c diff -u src/sys/arch/xen/xen/pciback.c:1.7 src/sys/arch/xen/xen/pciback.c:1.8 --- src/sys/arch/xen/xen/pciback.c:1.7 Thu Feb 2 14:43:01 2012 +++ src/sys/arch/xen/xen/pciback.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pciback.c,v 1.7 2012/02/02 19:43:01 tls Exp $ */ +/* $NetBSD: pciback.c,v 1.8 2014/03/27 18:22:56 christos Exp $ */ /* * Copyright (c) 2009 Manuel Bouyer. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.7 2012/02/02 19:43:01 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.8 2014/03/27 18:22:56 christos Exp $"); #include "opt_xen.h" @@ -311,23 +311,31 @@ pciback_kernfs_read(void *v) off = uio->uio_offset; len = 0; - len += snprintf(&buf[len], PCIBACK_KERNFS_SIZE - len, + len += snprintf(&buf[len], sizeof(buf) - len, "vendor: 0x%04x\nproduct: 0x%04x\n", PCI_VENDOR(sc->sc_id), PCI_PRODUCT(sc->sc_id)); - len += snprintf(&buf[len], PCIBACK_KERNFS_SIZE - len, + if (len > sizeof(buf)) + return ENOSPC; + len += snprintf(&buf[len], sizeof(buf) - len, "subsys_vendor: 0x%04x\nsubsys_product: 0x%04x\n", PCI_VENDOR(sc->sc_subid), PCI_PRODUCT(sc->sc_subid)); + if (len > sizeof(buf)) + return ENOSPC; for(i = 0; i < PCI_NBARS; i++) { if (sc->sc_bars[i].b_valid) { - len += snprintf(&buf[len], PCIBACK_KERNFS_SIZE - len, + len += snprintf(&buf[len], sizeof(buf) - len, "%s: 0x%08jx - 0x%08jx\n", (sc->sc_bars[i].b_type == PCI_MAPREG_TYPE_IO) ? "I/O" : "mem", (uintmax_t)sc->sc_bars[i].b_addr, (uintmax_t)(sc->sc_bars[i].b_addr + sc->sc_bars[i].b_size)); + if (len > sizeof(buf)) + return ENOSPC; } } - len += snprintf(&buf[len], PCIBACK_KERNFS_SIZE - len, + if (len > sizeof(buf)) + return ENOSPC; + len += snprintf(&buf[len], sizeof(buf) - len, "irq: %d\n", sc->sc_irq); if (off >= len) { error = uiomove(buf, 0, uio); Index: src/sys/arch/xen/xenbus/xenbus_client.c diff -u src/sys/arch/xen/xenbus/xenbus_client.c:1.11 src/sys/arch/xen/xenbus/xenbus_client.c:1.12 --- src/sys/arch/xen/xenbus/xenbus_client.c:1.11 Sun Jul 17 16:54:49 2011 +++ src/sys/arch/xen/xenbus/xenbus_client.c Thu Mar 27 14:22:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: xenbus_client.c,v 1.11 2011/07/17 20:54:49 joerg Exp $ */ +/* $NetBSD: xenbus_client.c,v 1.12 2014/03/27 18:22:56 christos Exp $ */ /****************************************************************************** * Client-facing interface for the Xenbus driver. In other words, the * interface between the Xenbus and the device-specific code, be it the @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xenbus_client.c,v 1.11 2011/07/17 20:54:49 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xenbus_client.c,v 1.12 2014/03/27 18:22:56 christos Exp $"); #if 0 #define DPRINTK(fmt, args...) \ @@ -169,8 +169,8 @@ _dev_error(struct xenbus_device *dev, in goto fail; len = snprintf(printf_buffer, PRINTF_BUFFER_SIZE, "%i ", -err); + KASSERT(len < PRINTF_BUFFER_SIZE); ret = vsnprintf(printf_buffer+len, PRINTF_BUFFER_SIZE-len, fmt, ap); - KASSERT(len + ret < PRINTF_BUFFER_SIZE); dev->xbusd_has_error = 1;