summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorariff <ariff@FreeBSD.org>2007-01-26 19:14:41 +0000
committerariff <ariff@FreeBSD.org>2007-01-26 19:14:41 +0000
commitdcde6ce44f0e31dbc88ac0d91335d056755aa224 (patch)
tree54bbbe18461103b5b68a78250b7746ff82b15412 /sys/dev/sound
parent796b51b951d824549856c4c5b9fb05782c5991ca (diff)
downloadFreeBSD-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.c20
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;
}
OpenPOWER on IntegriCloud