I sent the below via sendbug yesterday, but have not received any
automatic ack as I did in the past I believe, so wonder if perhaps
it was lost somewhere?
I checked the maillog, and see it was accepted by some mailserver,
so the problem does not seem to be on this end:

Jul 12 13:54:49 jensen qmail: 1342094089.476514 delivery 74877:
success: 192.43.244.163_accepted_message./Remote_host_said:
_250_2.0.0_q6CBsljV002798_Message_accepted_for_delivery/


I've also tried using http://www.openbsd.org/query-pr.html to look
for the pr, but only get a "The requested URL /cgi-bin/query-pr-wrapper
was not found on this server." error when I try to query something.

With kind regards, 


SENDBUG: -*- sendbug -*-
SENDBUG: Lines starting with `SENDBUG' will be removed automatically.
SENDBUG:
SENDBUG: Choose from the following categories:
SENDBUG:
SENDBUG: system user library documentation kernel alpha amd64 arm hppa i386 
m68k m88k mips64 powerpc sh sparc sparc64 vax
SENDBUG:
SENDBUG:
Organization: Inferno Nettverk A/S, Oslo, Norway; http://www.inet.no
To: [email protected]
Subject: 
From: [email protected]
Cc: [email protected]
Reply-To: [email protected]

>Synopsis:      mmap(2)'ed memory is not the same it was before unmap(2)
>Category:      kernel
>Environment:
        System      : OpenBSD 5.1
        Details     : OpenBSD 5.1 (GENERIC.MP) #188: Sun Feb 12 09:55:11 MST 
2012
                         
[email protected]:/usr/src/sys/arch/i386/compile/GENERIC.MP

        Architecture: OpenBSD.i386
        Machine     : i386
>Description:
      /*
       * The test mmap(2)s a file, moves some of the mmap(2)-ed memory
       * around, unmap(2)s, and then truncate(2)s the file to a smaller size.
       *
       * Afterwards it again mmap(2)'s the same file using the smaller
       * (truncated) size and checks that the contents, up to the smaller
       * truncated size, is correct and the same as it was before the unmap(2).
       *
       * On OpenBSD this for some reason fails and we end up with
       * old data from the previous iteration in the remapped array. :-/
       */

Regards,
        
>How-To-Repeat:

Save the below info mmap_open-close.c and run:
$ gcc -ggdb -W -Wall mmap_open-close.c && ./a.out

#include <sys/types.h>
#include <sys/uio.h>
#include <sys/mman.h>

#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>

#ifndef MAP_FAILED
#define MAP_FAILED (-1)
#endif

#define ELEMENTS(array) (sizeof(array) / sizeof(array[0]))
#define FILENAME        ".tmpfile"
#define TESTITERATIONS  (128)

int
main(void)
{
   FILE *fp;
   size_t testi, i;
   int array[2];

   assert(ELEMENTS(array) % 2 == 0);

   if ((fp = fopen(FILENAME, "w+")) == NULL) {
      fprintf(stderr, "fopen(%s) failed: %s", FILENAME, strerror(errno));
      exit(1);
   }

   if (ftruncate(fileno(fp), (off_t)sizeof(array)) == -1) {
      perror("ftruncate()");
      exit(1);
   }

   printf("created file %s of size %lu, mmap()'ing it  ...\n", 
          FILENAME, (unsigned long)sizeof(array));

   fclose(fp);
   
   for (testi = 0; testi < TESTITERATIONS; ++testi) {
      /*
       * This test mmap(2)'s a file, moves some of the mmap(2)-ed memory
       * around, unmap(2)s, and then truncate(2)s the file to a smaller size.
       *
       * Afterwards it again mmap(2)'s the same file using the smaller
       * (truncated) size and checks that the contents, up to the smaller
       * truncated size, is correct and the same as it was before the unmap(2).
       *
       * On OpenBSD this for some reason fails and we end up with 
       * old data from the previous iteration in the remapped array. :-/
       */
      off_t truncatedsize;
      int *map, beforeunmap[ELEMENTS(array)], afterremap[ELEMENTS(array)];

      /* just to make sure user does not change one but not the other. */
      assert(sizeof(*map) == sizeof(*array));

      for (i = 0; i < ELEMENTS(array); ++i)
         array[i] = (int)random();

      if ((fp = fopen(FILENAME, "r+")) == NULL) {
         fprintf(stderr, "fopen(%s) failed: %s", FILENAME, strerror(errno));
         exit(1);
      }

      if ((map = mmap(NULL,
                      sizeof(array),
                      PROT_READ | PROT_WRITE,
                      MAP_SHARED,
                      fileno(fp),
                      (off_t)0)) == MAP_FAILED) {
         perror("mmap()");
         exit(1);
      }

      fclose(fp);

      memcpy(map,         array, sizeof(array));
      memcpy(beforeunmap, map,   sizeof(array));

      assert(memcmp(map,         array, sizeof(array)) == 0);
      assert(memcmp(beforeunmap, array, sizeof(array)) == 0);

      /* using a constant here makes things works on OpenBSD too however. */
      array[0] = array[1]; /* 0xdeadbeef */
      map[0]   = array[1]; /* 0xdeadbeef */

      memcpy(beforeunmap, map, sizeof(array));

      assert(memcmp(map,         array, sizeof(array)) == 0);
      assert(memcmp(beforeunmap, array, sizeof(array)) == 0);

#if 1 /*
       * this breaks things on OpenBSD, at least release 5.0 and 5.1.
       */

      truncatedsize = (off_t)(sizeof(array) / 2);
      assert(memcmp(map,         array, (size_t)truncatedsize) == 0);
      assert(memcmp(beforeunmap, array, (size_t)truncatedsize) == 0);

      if (munmap(map, sizeof(array)) == -1) {
         perror("munmap()");
         exit(1);
      }

      if (truncate(FILENAME, truncatedsize) == -1) {
         perror("truncate()");
         exit(1);
      }

#else /* no truncation; works on OpenBSD too. */

      truncatedsize = (off_t)sizeof(array);
#endif

      if ((fp = fopen(FILENAME, "r+")) == NULL) {
         fprintf(stderr, "fopen(%s) failed: %s", FILENAME, strerror(errno));
         exit(1);
      }

      if ((map = mmap(NULL,
                      truncatedsize,
                      PROT_READ | PROT_WRITE,
                      MAP_SHARED,
                      fileno(fp),
                      (off_t)0)) == MAP_FAILED) {
         perror("mmap()");
         exit(1);
      }

      fclose(fp);

      bzero(afterremap, sizeof(afterremap));
      memcpy(afterremap, map, (size_t)truncatedsize);

      /* OpenBSD fails here. */
      if (beforeunmap[0] != afterremap[0]) {
         printf("on iteration %lu re-mapped() array index 0 of size %lu "
                "does not match what we unmapped() previously\n",
                (unsigned long)testi + 1,
                (unsigned long)sizeof(beforeunmap[0])); 

         assert(beforeunmap[0] == afterremap[0]);
      }

      if (memcmp(beforeunmap, afterremap, (size_t)truncatedsize) != 0) {
         printf("on iteration %lu re-mapped() data of size %lu (%s) "
                "does not match what we unmapped() previously\n",
                (unsigned long)testi + 1,
                (unsigned long)truncatedsize, 
                truncatedsize == sizeof(array) ? "not truncated" : "truncated");

         assert(memcmp(beforeunmap, afterremap, (size_t)truncatedsize) == 0);
      }

      if (truncate(FILENAME, (size_t)sizeof(array)) == -1) {
         perror("truncate()");
         exit(1);
      }
   }

   printf("tested through %lu iterations, all ok\n", (unsigned long)testi);

   if (unlink(FILENAME) != 0) {
      perror("unlink()");
      exit(1);
   }

   return 0;
}
>Fix:
        <how to correct or work around the problem, if known (multiple lines)>

SENDBUG: Run sendbug as root if this is an ACPI report!
SENDBUG: dmesg and usbdevs are attached.
SENDBUG: Feel free to delete or use the -D flag if they contain sensitive 
information.

dmesg:
OpenBSD 5.1 (GENERIC.MP) #188: Sun Feb 12 09:55:11 MST 2012
    [email protected]:/usr/src/sys/arch/i386/compile/GENERIC.MP
cpu0: Intel(R) Xeon(R) CPU X3430 @ 2.40GHz ("GenuineIntel" 686-class) 2.40 GHz
cpu0: 
FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,NXE,LONG,SSE3,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,LAHF
real mem  = 2138230784 (2039MB)
avail mem = 2093129728 (1996MB)
mainbus0 at root
bios0 at mainbus0: AT/286+ BIOS, date 12/31/99, BIOS32 rev. 0 @ 0xfdb80, SMBIOS 
rev. 2.6 @ 0xdf010 (55 entries)
bios0: vendor HP version "O26" date 01/26/2010
bios0: HP ProLiant DL120 G6
acpi0 at bios0: rev 2
acpi0: sleep states S0 S4 S5
acpi0: tables DSDT FACP TCPA SSDT SPMI EINJ HEST BERT SSDT ERST APIC MCFG HPET 
BOOT SPCR
acpi0: wakeup devices PEG_(S4) P0P3(S4) P0P5(S4) PEX1(S4) PEX2(S4) PEX3(S4) 
PEX4(S4) PEX5(S4) PEX6(S4) PEX7(S4) PEX8(S4)
acpitimer0 at acpi0: 3579545 Hz, 24 bits
acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: apic clock running at 132MHz
cpu1 at mainbus0: apid 2 (application processor)
cpu1: Intel(R) Xeon(R) CPU X3430 @ 2.40GHz ("GenuineIntel" 686-class) 2.40 GHz
cpu1: 
FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,NXE,LONG,SSE3,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,LAHF
cpu2 at mainbus0: apid 4 (application processor)
cpu2: Intel(R) Xeon(R) CPU X3430 @ 2.40GHz ("GenuineIntel" 686-class) 2.40 GHz
cpu2: 
FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,NXE,LONG,SSE3,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,LAHF
cpu3 at mainbus0: apid 6 (application processor)
cpu3: Intel(R) Xeon(R) CPU X3430 @ 2.40GHz ("GenuineIntel" 686-class) 2.40 GHz
cpu3: 
FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,NXE,LONG,SSE3,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,LAHF
ioapic0 at mainbus0: apid 1 pa 0xfec00000, version 20, 24 pins
acpimcfg0 at acpi0 addr 0xe0000000, bus 0-47
acpihpet0 at acpi0: 14318179 Hz
acpiprt0 at acpi0: bus -1 (PEG_)
acpiprt1 at acpi0: bus -1 (PEG2)
acpiprt2 at acpi0: bus 1 (P0P3)
acpiprt3 at acpi0: bus -1 (P0P5)
acpiprt4 at acpi0: bus 0 (PCI0)
acpiprt5 at acpi0: bus 16 (PEX1)
acpiprt6 at acpi0: bus -1 (PEX2)
acpiprt7 at acpi0: bus -1 (PEX3)
acpiprt8 at acpi0: bus -1 (PEX4)
acpiprt9 at acpi0: bus 32 (PEX5)
acpiprt10 at acpi0: bus 34 (PEX6)
acpiprt11 at acpi0: bus 36 (PEX7)
acpiprt12 at acpi0: bus 38 (PEX8)
acpicpu0 at acpi0: PSS
acpicpu1 at acpi0: PSS
acpicpu2 at acpi0: PSS
acpicpu3 at acpi0: PSS
acpibtn0 at acpi0: PWRB
bios0: ROM list: 0xc0000/0x8000 0xc8000/0x1e00 0xca000/0x1000 0xdf000/0x1000!
ipmi at mainbus0 not configured
cpu0: Enhanced SpeedStep 2394 MHz: speeds: 2394, 2261, 2128, 1995, 1862, 1729, 
1596, 1463, 1330, 1197 MHz
pci0 at mainbus0 bus 0: configuration mode 1 (bios)
pchb0 at pci0 dev 0 function 0 "Intel Core DMI" rev 0x11
ppb0 at pci0 dev 3 function 0 "Intel Core PCIE" rev 0x11
pci1 at ppb0 bus 1
"Intel Core Management" rev 0x11 at pci0 dev 8 function 0 not configured
"Intel Core Scratch" rev 0x11 at pci0 dev 8 function 1 not configured
"Intel Core Control" rev 0x11 at pci0 dev 8 function 2 not configured
"Intel Core Misc" rev 0x11 at pci0 dev 8 function 3 not configured
"Intel Core QPI Link" rev 0x11 at pci0 dev 16 function 0 not configured
"Intel Core QPI Routing" rev 0x11 at pci0 dev 16 function 1 not configured
ehci0 at pci0 dev 26 function 0 "Intel 3400 USB" rev 0x05: apic 1 int 16
usb0 at ehci0: USB revision 2.0
uhub0 at usb0 "Intel EHCI root hub" rev 2.00/1.00 addr 1
ppb1 at pci0 dev 28 function 0 "Intel 3400 PCIE" rev 0x05: apic 1 int 17
pci2 at ppb1 bus 16
ppb2 at pci0 dev 28 function 4 "Intel 3400 PCIE" rev 0x05: apic 1 int 17
pci3 at ppb2 bus 32
bge0 at pci3 dev 0 function 0 "Broadcom BCM5723" rev 0x10, BCM5784 A1 
(0x5784100): apic 1 int 16, address d4:85:64:38:ad:64
brgphy0 at bge0 phy 1: BCM5784 10/100/1000baseT PHY, rev. 4
ppb3 at pci0 dev 28 function 5 "Intel 3400 PCIE" rev 0x05: apic 1 int 16
pci4 at ppb3 bus 34
bge1 at pci4 dev 0 function 0 "Broadcom BCM5723" rev 0x10, BCM5784 A1 
(0x5784100): apic 1 int 17, address d4:85:64:38:ad:65
brgphy1 at bge1 phy 1: BCM5784 10/100/1000baseT PHY, rev. 4
ppb4 at pci0 dev 28 function 6 "Intel 3400 PCIE" rev 0x05: apic 1 int 18
pci5 at ppb4 bus 36
vga1 at pci5 dev 0 function 0 "Matrox MGA G200e (ServerEngines)" rev 0x02
wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
ppb5 at pci0 dev 28 function 7 "Intel 3400 PCIE" rev 0x05: apic 1 int 19
pci6 at ppb5 bus 38
ehci1 at pci0 dev 29 function 0 "Intel 3400 USB" rev 0x05: apic 1 int 23
usb1 at ehci1: USB revision 2.0
uhub1 at usb1 "Intel EHCI root hub" rev 2.00/1.00 addr 1
ppb6 at pci0 dev 30 function 0 "Intel 82801BA Hub-to-PCI" rev 0xa5
pci7 at ppb6 bus 48
pcib0 at pci0 dev 31 function 0 "Intel 3420 LPC" rev 0x05
pciide0 at pci0 dev 31 function 2 "Intel 3400 SATA" rev 0x05: DMA, channel 0 
configured to native-PCI, channel 1 configured to native-PCI
pciide0: using apic 1 int 18 for native-PCI interrupt
wd0 at pciide0 channel 0 drive 0: <ST3500418AS>
wd0: 16-sector PIO, LBA48, 476940MB, 976773168 sectors
wd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 6
ichiic0 at pci0 dev 31 function 3 "Intel 3400 SMBus" rev 0x05: apic 1 int 18
iic0 at ichiic0
pciide1 at pci0 dev 31 function 5 "Intel 3400 SATA" rev 0x05: DMA, channel 0 
wired to native-PCI, channel 1 wired to native-PCI
pciide1: using apic 1 int 17 for native-PCI interrupt
isa0 at pcib0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
pckbc0 at isa0 port 0x60/5
kbc: cmd word write error
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
npx0 at isa0 port 0xf0/16: reported by CPUID; using exception 16
mtrr: Pentium Pro MTRR support
uhub2 at uhub0 port 1 "Intel Rate Matching Hub" rev 2.00/0.00 addr 2
uhub3 at uhub1 port 1 "Intel Rate Matching Hub" rev 2.00/0.00 addr 2
uhidev0 at uhub3 port 1 configuration 1 interface 0 "ServerEngines SE USB 
Device" rev 1.10/0.01 addr 3
uhidev0: iclass 3/1
ukbd0 at uhidev0: 8 modifier keys, 6 key codes
wskbd0 at ukbd0 mux 1
wskbd0: connecting to wsdisplay0
uhidev1 at uhub3 port 1 configuration 1 interface 1 "ServerEngines SE USB 
Device" rev 1.10/0.01 addr 3
uhidev1: iclass 3/1
ums0 at uhidev1: 8 buttons, Z dir
wsmouse0 at ums0 mux 0
vscsi0 at root
scsibus0 at vscsi0: 256 targets
softraid0 at root
scsibus1 at softraid0: 256 targets
root on wd0a swap on wd0b dump on wd0b

usbdevs:
Controller /dev/usb0:
addr 1: high speed, self powered, config 1, EHCI root hub(0x0000), 
Intel(0x8086), rev 1.00
 port 1 addr 2: high speed, self powered, config 1, Rate Matching Hub(0x0020), 
Intel(0x8087), rev 0.00
  port 1 powered
  port 2 powered
  port 3 powered
  port 4 powered
  port 5 powered
  port 6 addr 3: high speed, self powered, config 1, Rikiki USB 3(0x1057), 
LaCie(0x059f), rev 0.00, iSerialNumber 00000000f33f604d00f0
 port 2 powered
Controller /dev/usb1:
addr 1: high speed, self powered, config 1, EHCI root hub(0x0000), 
Intel(0x8086), rev 1.00
 port 1 addr 2: high speed, self powered, config 1, Rate Matching Hub(0x0020), 
Intel(0x8087), rev 0.00
  port 1 addr 3: full speed, self powered, config 1, SE USB Device(0x0000), 
ServerEngines(0x0000), rev 0.01, iSerialNumber 60196D5744A104
  port 2 powered
  port 3 powered
  port 4 powered
  port 5 powered
  port 6 powered
  port 7 powered
  port 8 powered
 port 2 powered

-- 
  _ // 
  \X/ -- Michael Shuldman 

Reply via email to