Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Sep 1999 20:46:44 -0400 (EDT)
From:      aa8vb@ipass.net
To:        FreeBSD-gnats-submit@freebsd.org
Cc:        aa8vb@ipass.net
Subject:   kern/13587: Voxware MIXER_READ ioctl corrupts memory
Message-ID:  <199909060046.UAA13229@stealth.ipass.net.>

next in thread | raw e-mail | index | archive | help

>Number:         13587
>Category:       kern
>Synopsis:       Voxware MIXER_READ ioctl corrupts memory
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Sep  5 17:50:01 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator:     Randall Hopper
>Release:        FreeBSD 3.2-RELEASE i386
>Organization:
self
>Environment:

	Stock 3.2-RELEASE.  Voxware sound drivers.  Sound Blaster 32.

        controller      snd0   
        device pas0     at isa? port 0x388 irq 10 drq 3
        device sb0      at isa? port 0x220 irq 5 drq 1
        device sbxvi0   at isa? drq 5
        device sbmidi0  at isa? port 0x330
        device opl0     at isa? port 0x388
        device awe0     at isa? port 0x620

>Description:

        int stomp_me = 0x12345678;
        unsigned char  vol[2];

        ioctl( mixer_fd, MIXER_READ( SOUND_MIXER_LINE ), vol )

        The ioctl overwrites the lower two bytes of 'stomp_me'.  This is
        how Linux apps like xmix declare vol, so apparently this is a bug
        in our Voxware drivers.  xmix may be saved from memory corruption
        only by the structure alignment policy of FreeBSD.

>How-To-Repeat:

        The output of the following program is:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <machine/soundcard.h>
#include <assert.h>

int main( int argc, char *argv[] )
{
  int mixer_fd, ret, ctrls;
  int stomp_me = 0x12345678;
  unsigned char  vol[2];

  mixer_fd = open( "/dev/mixer0", O_RDWR, 0 );
  assert( mixer_fd >= 0 );

  ret = ioctl( mixer_fd, SOUND_MIXER_READ_DEVMASK, &ctrls );
  assert( ret >= 0 );

  assert( ctrls & SOUND_MASK_LINE );

  ret = ioctl( mixer_fd, MIXER_READ( SOUND_MIXER_LINE ), vol );
  assert( ret >= 0 );

  printf( "Volume is %d,%d\n", vol[0], vol[1] );

  if ( stomp_me != 0x12345678 ) {
    fprintf( stderr, "\n\nWhooah!  Sound ioctl() stomped memory!\n"
                     "Value was 0x12345678, now it's 0x%.8x\n",
             stomp_me );
    exit(1);
  }

  close( mixer_fd );

  return 0;
}

>Fix:

        

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199909060046.UAA13229>