[FFmpeg-devel] [PATCH 1/3] avformat/mov: Increase support for common encryption.
Carl Eugen Hoyos
ceffmpeg at gmail.com
Tue Jan 9 03:19:08 EET 2018
2018-01-08 23:16 GMT+01:00 Jacob Trimble <modmaker-at-google.com at ffmpeg.org>:
>> You can't remove API just like that without a deprecation period.
>> Add a new av_aes_ctr_set_full_iv() function, and either leave
>> av_aes_ctr_set_iv() alone or deprecate it if it effectively becomes
>> superfluous after adding the new function.
>>
>> Also, this patch needs to be split in three. One for the aes_crt
>> changes, one for the encryption_info changes, and one for mov changes,
>> with a minor libavutil version bump for the former two, and the
>> corresponding APIChanges entry.
>> Alternatively, you could also squash the new encryption_info API from
>> this patch into the one that actually introduces the entire feature.
>
> Whoops, I thought that was internal-only. Done and split into its own change.
>
> On Sat, Jan 6, 2018 at 7:30 AM, Carl Eugen Hoyos <ceffmpeg at gmail.com> wrote:
>> 2018-01-05 20:49 GMT+01:00 Jacob Trimble <modmaker-at-google.com at ffmpeg.org>:
>>
>>> + if (!frag_stream_info->encryption_index) {
>>> + frag_stream_info->encryption_index = av_mallocz(sizeof(MOVEncryptionIndex));
>>
>> sizeof(variable), please.
Do you disagree?
I have no strong opinion, but I thought it makes the code more robust...
>> [...]
>>
>>> + sample_count = avio_rb32(pb);
>>> +
>>> + encryption_index->encrypted_samples =
>>> av_mallocz_array(sizeof(AVEncryptionInfo*), sample_count);
>>
>> This should be avoided if possible, see below.
>>
>>> + if (!encryption_index->encrypted_samples) {
>>> return AVERROR(ENOMEM);
>>> }
>>> + encryption_index->nb_encrypted_samples = sample_count;
>>>
>>> - return av_aes_ctr_init(sc->cenc.aes_ctr, c->decryption_key);
>>> + for (i = 0; i < sample_count; i++) {
>>
>> Please check here for eof...
>>
>>> + ret = mov_read_sample_encryption_info(c, pb, sc,
>>> &encryption_index->encrypted_samples[i], use_subsamples);
>>
>> ... and insert a realloc here to avoid the large allocation above, see 1112ba01.
>
> Done.
> + if (use_subsamples) {
> + subsample_count = avio_rb16(pb);
> + for (i = 0; i < subsample_count && !pb->eof_reached; i++) {
> + unsigned int min_subsamples = FFMIN(FFMAX(i, 1024 * 1024), subsample_count);
> + subsamples = av_fast_realloc((*sample)->subsamples, &alloc_size,
> + min_subsamples * sizeof(*subsamples));
The reason I did not comment on this block in the last mail is that
iiuc, the maximum allocation here is INT16_MAX * 8 which seems
acceptable (and there cannot be a realloc with the chosen initial
limit).
> + sample_count = avio_rb32(pb);
You have to check here...
+ for (i = 0; i < sample_count && !pb->eof_reached; i++) {
+ unsigned int min_samples = FFMIN(FFMAX(i, 1024 * 1024), sample_count);
+ encrypted_samples =
av_fast_realloc(encryption_index->encrypted_samples, &alloc_size,
+ min_samples *
sizeof(*encrypted_samples));
... if this product could overflow for the final reallocation, see 1112ba01.
Thank you, Carl Eugen
More information about the ffmpeg-devel
mailing list