Bug#772877: oggenc fails when using '--advanced-encode-option disable_coupling' switch and CBR encoding

Martin Steghöfer martin at steghoefer.eu
Fri Oct 9 19:10:11 UTC 2015


reassign 772877 libvorbisenc2
retitle 772877 libvorbis: Segmentation fault when disabling channel coupling
thanks

Actually the oggenc code about setting the "disable_coupling" option 
seems to be fine, but the relevant libvorbis encoding code not so much. 
So I'm reassigning this to libvorbisenc2.

The code can be reproduced without oggenc in a simple example by calling 
"vorbis_encode_ctl" with action "OV_ECTL_COUPLING_SET" and argument 
being a pointer to an int variable with value 0.

I've found the following two problems with the encoding library.

First of all, the segmentation fault seems to occur due to poor return 
code checking:

/
| new_template = get_setup_template(.....);
| if(!hi->setup)return OV_EIMPL;
| hi->setup=new_template;
| hi->base_setting=new_base;
| vorbis_encode_setup_setting(vi,vi->channels,vi->rate);
\

If "get_setup_template" returns NULL, which it is allowed to in general, 
and which it does in this specific scenario, then "hi->setup" will be 
NULL - which "vorbis_encode_setup_setting" cannot cope with. The NULL 
check should either come *after* assigning the new value to "hi->setup" 
(that's the way it is done in "vorbis_encode_setup_vbr" and 
"vorbis_encode_setup_managed"), or the NULL check should refer to 
"new_template".

The second question is, why "get_setup_template" actually returns NULL. 
In this case, it should be able to find a matching setup template. The 
answer is in the following line at the beginning of "get_setup_template":

/
| if(q_or_bitrate)req/=ch;
\

This line is supposed to divide the total desired bitrate up into 
bitrates for each channel. However, in the specific case of disabling 
the coupling, the parameter "ch" is set to -1. The desired effect of 
this is to accept only setups that don't couple channels, which is 
achieved. However, as a side effect this also screws up the mentioned 
bitrate division. The bitrate is then divided by "-1" and we end up with 
a negative desired bitrate, which can never be fulfilled. Fixing this 
requires a signature change of "get_setup_template", otherwise the real 
number of channels cannot be known in this case.

Since the function "get_setup_template" doesn't appear in any header 
file at all, this signature change doesn't affect the ABI nor API and is 
therefore safe.

I will provide a patch, when I find the time to do a thorough testing of 
the fix.

Cheers,
Martin



More information about the pkg-xiph-maint mailing list