Mercurial > octave
changeset 21693:2c6d1ef071d1 stable
avoid crash in audiowrite argument processing (bug #47875)
* audioread.cc (Faudiowrite): Avoid out of bounds array access.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 13 May 2016 15:00:02 -0400 |
parents | 44f7664689f2 |
children | 2cb0dbd5154f 3c09cff7fa06 |
files | libinterp/dldfcn/audioread.cc |
diffstat | 1 files changed, 17 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/dldfcn/audioread.cc Fri May 06 17:02:31 2016 -0400 +++ b/libinterp/dldfcn/audioread.cc Fri May 13 15:00:02 2016 -0400 @@ -384,10 +384,16 @@ // float quality = 0.75; for (int i = 3; i < nargin; i += 2) { - if (args(i).string_value () == "BitsPerSample") + if (i >= nargin - 1) + error ("audiowrite: invalid number of arguments"); + + std::string keyword = args(i).string_value (); + octave_value value_arg = args(i+1); + + if (keyword == "BitsPerSample") { info.format &= ~SF_FORMAT_SUBMASK; - int bits = args(i + 1).int_value (); + int bits = value_arg.int_value (); if (bits == 8) { if ((info.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV) @@ -407,18 +413,18 @@ return retval; } } - else if (args(i).string_value () == "BitRate") + else if (keyword == "BitRate") ; // Quality is currently unused? // - // else if (args(i).string_value () == "Quality") - // quality = args(i + 1).int_value () * 0.01; - else if (args(i).string_value () == "Title") - title = args(i + 1).string_value (); - else if (args(i).string_value () == "Artist") - artist = args(i + 1).string_value (); - else if (args(i).string_value () == "Comment") - comment = args(i + 1).string_value (); + // else if (keyword == "Quality") + // quality = value_arg.int_value () * 0.01; + else if (keyword == "Title") + title = value_arg.string_value (); + else if (keyword == "Artist") + artist = value_arg.string_value (); + else if (keyword == "Comment") + comment = value_arg.string_value (); else { error ("audiowrite: wrong argument name");