Initialize client rate and channel ranges. Fixes crashes when the

client doesn't set the rate and/or channel ranges. Problem reported
and analyzed by Dimitri Sokolyuk <sokolyuk at gmail.com>. Thanks!
This commit is contained in:
Alexandre Ratchov 2013-05-09 16:40:16 +02:00
parent 343af5e469
commit 0f2025bd71
2 changed files with 15 additions and 15 deletions

View File

@ -1560,21 +1560,22 @@ found:
return 0; return 0;
} }
s->mode = mode; s->mode = mode;
s->par = d->par; aparams_init(&s->par);
if (s->mode & MODE_PLAY) { if (s->mode & MODE_PLAY) {
s->mix.slot_cmin = 0; s->mix.slot_cmin = s->mix.dev_cmin = 0;
s->mix.slot_cmax = d->pchan - 1; s->mix.slot_cmax = s->mix.dev_cmax = d->pchan - 1;
} }
if (s->mode & MODE_RECMASK) { if (s->mode & MODE_RECMASK) {
s->sub.slot_cmin = 0; s->sub.slot_cmin = s->sub.dev_cmin = 0;
s->sub.slot_cmax = ((s->mode & MODE_MON) ? s->sub.slot_cmax = s->sub.dev_cmax =
d->pchan : d->rchan) - 1; ((s->mode & MODE_MON) ? d->pchan : d->rchan) - 1;
} }
s->xrun = XRUN_IGNORE; s->xrun = XRUN_IGNORE;
s->dup = 0; s->dup = 0;
s->appbufsz = d->bufsz; s->appbufsz = d->bufsz;
s->round = d->round; s->round = d->round;
s->rate = d->rate; s->rate = d->rate;
s->mix.maxweight = ADATA_UNIT;
dev_midi_slotdesc(d, s); dev_midi_slotdesc(d, s);
dev_midi_vol(d, s); dev_midi_vol(d, s);
return s; return s;

View File

@ -670,13 +670,13 @@ sock_setpar(struct sock *f)
if (log_level >= 3) { if (log_level >= 3) {
sock_log(f); sock_log(f);
log_puts(": recording channels "); log_puts(": recording channels ");
log_putu(s->sub.slot_cmin);
log_puts(":");
log_putu(s->sub.slot_cmax);
log_puts(" -> ");
log_putu(s->sub.dev_cmin); log_putu(s->sub.dev_cmin);
log_puts(":"); log_puts(":");
log_putu(s->sub.dev_cmax); log_putu(s->sub.dev_cmax);
log_puts(" -> ");
log_putu(s->sub.slot_cmin);
log_puts(":");
log_putu(s->sub.slot_cmax);
log_puts("\n"); log_puts("\n");
} }
#endif #endif
@ -907,14 +907,13 @@ sock_hello(struct sock *f)
if (s == NULL) if (s == NULL)
return 0; return 0;
f->midi = NULL; f->midi = NULL;
aparams_init(&s->par);
if (s->mode & MODE_PLAY) { if (s->mode & MODE_PLAY) {
s->mix.slot_cmin = f->opt->pmin; s->mix.slot_cmin = s->mix.dev_cmin = f->opt->pmin;
s->mix.slot_cmax = f->opt->pmax; s->mix.slot_cmax = s->mix.dev_cmax = f->opt->pmax;
} }
if (s->mode & MODE_RECMASK) { if (s->mode & MODE_RECMASK) {
s->sub.slot_cmin = f->opt->rmin; s->sub.slot_cmin = s->sub.dev_cmin = f->opt->rmin;
s->sub.slot_cmax = f->opt->rmax; s->sub.slot_cmax = s->sub.dev_cmax = f->opt->rmax;
} }
if (f->opt->mmc) { if (f->opt->mmc) {
s->xrun = XRUN_SYNC; s->xrun = XRUN_SYNC;