Fix BIO_f_buffer().

Submitted by: Adam Langley
Reviewed by: Bodo Moeller
This commit is contained in:
Bodo Möller 2011-12-02 12:25:03 +00:00
parent 0798170966
commit 390c579568
3 changed files with 25 additions and 7 deletions

View File

@ -490,6 +490,10 @@
Changes between 1.0.0e and 1.0.0f [xx XXX xxxx] Changes between 1.0.0e and 1.0.0f [xx XXX xxxx]
*) Fix the BIO_f_buffer() implementation (which was mixing different
interpretations of the '..._len' fields).
[Adam Langley (Google)]
*) Fix handling of BN_BLINDING: now BN_BLINDING_invert_ex (rather than *) Fix handling of BN_BLINDING: now BN_BLINDING_invert_ex (rather than
BN_BLINDING_invert_ex) calls BN_BLINDING_update, ensuring that concurrent BN_BLINDING_invert_ex) calls BN_BLINDING_update, ensuring that concurrent
threads won't reuse the same blinding coefficients. threads won't reuse the same blinding coefficients.
@ -1410,6 +1414,10 @@
Changes between 0.9.8r and 0.9.8s [xx XXX xxxx] Changes between 0.9.8r and 0.9.8s [xx XXX xxxx]
*) Fix the BIO_f_buffer() implementation (which was mixing different
interpretations of the '..._len' fields).
[Adam Langley (Google)]
*) Fix handling of BN_BLINDING: now BN_BLINDING_invert_ex (rather than *) Fix handling of BN_BLINDING: now BN_BLINDING_invert_ex (rather than
BN_BLINDING_invert_ex) calls BN_BLINDING_update, ensuring that concurrent BN_BLINDING_invert_ex) calls BN_BLINDING_update, ensuring that concurrent
threads won't reuse the same blinding coefficients. threads won't reuse the same blinding coefficients.

View File

@ -209,7 +209,7 @@ start:
/* add to buffer and return */ /* add to buffer and return */
if (i >= inl) if (i >= inl)
{ {
memcpy(&(ctx->obuf[ctx->obuf_len]),in,inl); memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,inl);
ctx->obuf_len+=inl; ctx->obuf_len+=inl;
return(num+inl); return(num+inl);
} }
@ -219,7 +219,7 @@ start:
{ {
if (i > 0) /* lets fill it up if we can */ if (i > 0) /* lets fill it up if we can */
{ {
memcpy(&(ctx->obuf[ctx->obuf_len]),in,i); memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,i);
in+=i; in+=i;
inl-=i; inl-=i;
num+=i; num+=i;
@ -294,9 +294,9 @@ static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr)
case BIO_C_GET_BUFF_NUM_LINES: case BIO_C_GET_BUFF_NUM_LINES:
ret=0; ret=0;
p1=ctx->ibuf; p1=ctx->ibuf;
for (i=ctx->ibuf_off; i<ctx->ibuf_len; i++) for (i=0; i<ctx->ibuf_len; i++)
{ {
if (p1[i] == '\n') ret++; if (p1[ctx->ibuf_off + i] == '\n') ret++;
} }
break; break;
case BIO_CTRL_WPENDING: case BIO_CTRL_WPENDING:
@ -399,17 +399,18 @@ static long buffer_ctrl(BIO *b, int cmd, long num, void *ptr)
for (;;) for (;;)
{ {
BIO_clear_retry_flags(b); BIO_clear_retry_flags(b);
if (ctx->obuf_len > ctx->obuf_off) if (ctx->obuf_len > 0)
{ {
r=BIO_write(b->next_bio, r=BIO_write(b->next_bio,
&(ctx->obuf[ctx->obuf_off]), &(ctx->obuf[ctx->obuf_off]),
ctx->obuf_len-ctx->obuf_off); ctx->obuf_len);
#if 0 #if 0
fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_off,r); fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len,r);
#endif #endif
BIO_copy_next_retry(b); BIO_copy_next_retry(b);
if (r <= 0) return((long)r); if (r <= 0) return((long)r);
ctx->obuf_off+=r; ctx->obuf_off+=r;
ctx->obuf_len-=r;
} }
else else
{ {

View File

@ -306,6 +306,15 @@ DECLARE_STACK_OF(BIO)
typedef struct bio_f_buffer_ctx_struct typedef struct bio_f_buffer_ctx_struct
{ {
/* Buffers are setup like this:
*
* <---------------------- size ----------------------->
* +---------------------------------------------------+
* | consumed | remaining | free space |
* +---------------------------------------------------+
* <-- off --><------- len ------->
*/
/* BIO *bio; */ /* this is now in the BIO struct */ /* BIO *bio; */ /* this is now in the BIO struct */
int ibuf_size; /* how big is the input buffer */ int ibuf_size; /* how big is the input buffer */
int obuf_size; /* how big is the output buffer */ int obuf_size; /* how big is the output buffer */