* (If s->read_ahead is set, 'max' bytes may be stored in rbuf
* [plus s->packet_length bytes if extend == 1].)
*/
- int i,len,left,align=0;
+ int i,len,left;
+ long align=0;
unsigned char *pkt;
SSL3_BUFFER *rb;
if (n <= 0) return n;
rb = &(s->s3->rbuf);
+ if (rb->buf == NULL)
+ if (!ssl3_setup_read_buffer(s))
+ return -1;
+
left = rb->left;
#if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
- align = (int)rb->buf + SSL3_RT_HEADER_LENGTH;
+ align = (long)rb->buf + SSL3_RT_HEADER_LENGTH;
align = (-align)&(SSL3_ALIGN_PAYLOAD-1);
#endif
if (i <= 0)
{
rb->left = left;
+#ifndef OPENSSL_NO_RELEASE_BUFFERS
+ if (len+left == 0 &&
+ (s->mode & SSL_MODE_RELEASE_BUFFERS))
+ ssl3_release_read_buffer(s);
+#endif
return(i);
}
left+=i;
{
unsigned char *p,*plen;
int i,mac_size,clear=0;
- int prefix_len=0,align=0;
+ int prefix_len=0;
+ long align=0;
SSL3_RECORD *wr;
SSL3_BUFFER *wb=&(s->s3->wbuf);
SSL_SESSION *sess;
+ if (wb->buf == NULL)
+ if (!ssl3_setup_write_buffer(s))
+ return -1;
+
/* first check if there is a SSL3_BUFFER still being written
* out. This will happen with non blocking IO */
if (wb->left != 0)
* which would be multiple of SSL3_ALIGN_PAYLOAD, so
* if we want to align the real payload, then we can
* just pretent we simply have two headers. */
- align = (int)wb->buf + 2*SSL3_RT_HEADER_LENGTH;
+ align = (long)wb->buf + 2*SSL3_RT_HEADER_LENGTH;
align = (-align)&(SSL3_ALIGN_PAYLOAD-1);
#endif
p = wb->buf + align;
else
{
#if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
- align = (int)wb->buf + SSL3_RT_HEADER_LENGTH;
+ align = (long)wb->buf + SSL3_RT_HEADER_LENGTH;
align = (-align)&(SSL3_ALIGN_PAYLOAD-1);
#endif
p = wb->buf + align;
{
wb->left=0;
wb->offset+=i;
+#ifndef OPENSSL_NO_RELEASE_BUFFERS
+ if (s->mode & SSL_MODE_RELEASE_BUFFERS)
+ ssl3_release_write_buffer(s);
+#endif
s->rwstate=SSL_NOTHING;
return(s->s3->wpend_ret);
}
void (*cb)(const SSL *ssl,int type2,int val)=NULL;
if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
- if (!ssl3_setup_buffers(s))
+ if (!ssl3_setup_read_buffer(s))
return(-1);
if ((type && (type != SSL3_RT_APPLICATION_DATA) && (type != SSL3_RT_HANDSHAKE) && type) ||
{
s->rstate=SSL_ST_READ_HEADER;
rr->off=0;
+#ifndef OPENSSL_NO_RELEASE_BUFFERS
+ if ((s->mode & SSL_MODE_RELEASE_BUFFERS))
+ ssl3_release_read_buffer(s);
+#endif
}
}
return(n);