diff options
author | ariff <ariff@FreeBSD.org> | 2007-01-26 19:14:41 +0000 |
---|---|---|
committer | ariff <ariff@FreeBSD.org> | 2007-01-26 19:14:41 +0000 |
commit | dcde6ce44f0e31dbc88ac0d91335d056755aa224 (patch) | |
tree | 54bbbe18461103b5b68a78250b7746ff82b15412 /sys/dev/sound | |
parent | 796b51b951d824549856c4c5b9fb05782c5991ca (diff) | |
download | FreeBSD-src-dcde6ce44f0e31dbc88ac0d91335d056755aa224.zip FreeBSD-src-dcde6ce44f0e31dbc88ac0d91335d056755aa224.tar.gz |
Fix forever broken ua_chan_setblocksize() uninitialized return value
which causing divide by zero panic in other places (notably chn_sync()).
Diffstat (limited to 'sys/dev/sound')
-rw-r--r-- | sys/dev/sound/usb/uaudio_pcm.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/sys/dev/sound/usb/uaudio_pcm.c b/sys/dev/sound/usb/uaudio_pcm.c index 42eaa57..b81d94e 100644 --- a/sys/dev/sound/usb/uaudio_pcm.c +++ b/sys/dev/sound/usb/uaudio_pcm.c @@ -149,15 +149,21 @@ ua_chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) device_t pa_dev; struct ua_chinfo *ch = data; struct ua_info *ua = ch->parent; + u_int32_t blkcnt; + + RANGE(blocksize, 128, ua->bufsz / 2); + blkcnt = ua->bufsz / blocksize; + + if ((sndbuf_getblksz(ch->buffer) != blocksize || + sndbuf_getblkcnt(ch->buffer) != blkcnt) && + sndbuf_resize(ch->buffer, blkcnt, blocksize) != 0) + device_printf(ua->sc_dev, "%s: failed blksz=%u blkcnt=%u\n", + __func__, blocksize, blkcnt); + + ch->blksz = sndbuf_getblksz(ch->buffer); - if (blocksize) { - RANGE(blocksize, 128, ua->bufsz / 2); - if (sndbuf_resize(ch->buffer, ua->bufsz/blocksize, blocksize) != 0) { - ch->blksz = blocksize; - } - } pa_dev = device_get_parent(ua->sc_dev); - uaudio_chan_set_param_blocksize(pa_dev, blocksize, ch->dir); + uaudio_chan_set_param_blocksize(pa_dev, ch->blksz, ch->dir); return ch->blksz; } |