comparison circbuffer.c @ 1167:1397a677cb5c

lazy allocation of circbuffer
author Matt Johnston <matt@ucc.asn.au>
date Thu, 19 Nov 2015 23:52:11 +0800
parents acf444bcb115
children 06d52bcb8094
comparison
equal deleted inserted replaced
1166:b0f351edf370 1167:1397a677cb5c
35 if (size > MAX_CBUF_SIZE) { 35 if (size > MAX_CBUF_SIZE) {
36 dropbear_exit("Bad cbuf size"); 36 dropbear_exit("Bad cbuf size");
37 } 37 }
38 38
39 cbuf = (circbuffer*)m_malloc(sizeof(circbuffer)); 39 cbuf = (circbuffer*)m_malloc(sizeof(circbuffer));
40 if (size > 0) { 40 /* data is malloced on first write */
41 cbuf->data = (unsigned char*)m_malloc(size); 41 cbuf->data = NULL;
42 }
43 cbuf->used = 0; 42 cbuf->used = 0;
44 cbuf->readpos = 0; 43 cbuf->readpos = 0;
45 cbuf->writepos = 0; 44 cbuf->writepos = 0;
46 cbuf->size = size; 45 cbuf->size = size;
47 46
48 return cbuf; 47 return cbuf;
49 } 48 }
50 49
51 void cbuf_free(circbuffer * cbuf) { 50 void cbuf_free(circbuffer * cbuf) {
52 51
53 m_burn(cbuf->data, cbuf->size); 52 if (cbuf->data) {
54 m_free(cbuf->data); 53 m_burn(cbuf->data, cbuf->size);
54 m_free(cbuf->data);
55 }
55 m_free(cbuf); 56 m_free(cbuf);
56 } 57 }
57 58
58 unsigned int cbuf_getused(circbuffer * cbuf) { 59 unsigned int cbuf_getused(circbuffer * cbuf) {
59 60
104 105
105 if (len > cbuf_writelen(cbuf)) { 106 if (len > cbuf_writelen(cbuf)) {
106 dropbear_exit("Bad cbuf write"); 107 dropbear_exit("Bad cbuf write");
107 } 108 }
108 109
110 if (!cbuf->data) {
111 /* lazy allocation */
112 cbuf->data = (unsigned char*)m_malloc(cbuf->size);
113 }
114
109 return &cbuf->data[cbuf->writepos]; 115 return &cbuf->data[cbuf->writepos];
110 } 116 }
111 117
112 void cbuf_incrwrite(circbuffer *cbuf, unsigned int len) { 118 void cbuf_incrwrite(circbuffer *cbuf, unsigned int len) {
113 if (len > cbuf_writelen(cbuf)) { 119 if (len > cbuf_writelen(cbuf)) {