[FFmpeg-devel] [PATCH] avformat: implement SChannel SSP TLS protocol
Hendrik Leppkes
h.leppkes at gmail.com
Wed Oct 28 18:31:27 CET 2015
On Wed, Oct 28, 2015 at 6:07 PM, Derek Buitenhuis
<derek.buitenhuis at gmail.com> wrote:
> Enjoy my half-assed / useless review.
>
>> +#ifndef SECBUFFER_ALERT
>> +#define SECBUFFER_ALERT 17
>> +#endif
>
> Why?
I think it was needed on some configuration, I'll verify.
>
>> + SecPkgContext_StreamSizes Sizes;
>
> Accidental capital?
>
>> + if (c->enc_buf == NULL) {
>> + c->enc_buf_offset = 0;
>> + c->enc_buf_size = SCHANNEL_INITIAL_BUFFER_SIZE;
>> + ret = av_reallocp(&c->enc_buf, c->enc_buf_size);
>> + if (ret < 0)
>> + goto fail;
>
> I can never remember if _close() is guaranteed to be called. I'll assume yes.
>
>> + while (1)
>> + {
>> + if (c->enc_buf_size - c->enc_buf_offset < SCHANNEL_FREE_BUFFER_SIZE) {
>
> Can enc_buf_offset ever end up bigger? e.. if data keeps being read, and you keep
> getting SEC_E_INCOMPLETE_MESSAGE.
Bigger than what, buf_size? it should grow that as necessary when data
is received.
>
>> + /* input buffers */
>> + InitSecBuffer(&inbuf[0], SECBUFFER_TOKEN, av_malloc(c->enc_buf_offset), c->enc_buf_offset);
>
> Is this a unchecked malloc, or is it passed into inbuf[0].pvBuffer?
Yes this ends up in inbuf[0].pvBuffer which is then checked.
I could make it explicit before if people like.
>
>> +
>> + sspi_ret = InitializeSecurityContext(&c->cred_handle, &c->ctxt_handle, s->host, c->request_flags,
>> + 0, 0, &inbuf_desc, 0, NULL, &outbuf_desc, &c->context_flags,
>> + &c->ctxt_timestamp);
>> + av_freep(&inbuf[0].pvBuffer);
>
> Double checking: is this safe?
Since this is the buffer we av_malloc'ed before, yes.
>
>
>> + /* SChannel Options */
>> + memset(&schannel_cred, 0, sizeof(schannel_cred));
>
> SCHANNEL_CRED schannel_cred = { 0 };
>
>> +cleanup:
>> + size = len < c->dec_buf_offset ? len : c->dec_buf_offset;
>> + if (size) {
>> + memcpy(buf, c->dec_buf, size);
>> + memmove(c->dec_buf, c->dec_buf + size, c->dec_buf_offset - size);
>> + c->dec_buf_offset -= size;
>> +
>> + return size;
>> + }
>> +
>> + if (ret == 0 && !c->connection_closed)
>> + ret = AVERROR(EAGAIN);
>> +
>> + return ret < 0 ? ret : 0;
>> +
>> +fail:
>> + return ret;
>
> No cleanup in case of failure?
fail is only used for serious unrecoverable failures, like socket read
failure or mem allocation failure. It could still call that code, I
suppose, just in case some valid data is stuck in the decrypted
buffer.
>
> - Derek
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list