@@ -100,15 +100,20 @@ void dbuf_init(DynBuf *s)
100100 dbuf_init2 (s , NULL , NULL );
101101}
102102
103- /* return < 0 if error */
104- int dbuf_realloc (DynBuf * s , size_t new_size )
103+ /* Try to allocate 'len' more bytes. return < 0 if error */
104+ int dbuf_claim (DynBuf * s , size_t len )
105105{
106- size_t size ;
106+ size_t new_size , size ;
107107 uint8_t * new_buf ;
108+ new_size = s -> size + len ;
109+ if (new_size < len )
110+ return -1 ; /* overflow case */
108111 if (new_size > s -> allocated_size ) {
109112 if (s -> error )
110113 return -1 ;
111- size = s -> allocated_size * 3 / 2 ;
114+ size = s -> allocated_size + (s -> allocated_size / 2 );
115+ if (size < s -> allocated_size )
116+ return -1 ; /* overflow case */
112117 if (size > new_size )
113118 new_size = size ;
114119 new_buf = s -> realloc_func (s -> opaque , s -> buf , new_size );
@@ -122,22 +127,10 @@ int dbuf_realloc(DynBuf *s, size_t new_size)
122127 return 0 ;
123128}
124129
125- int dbuf_write (DynBuf * s , size_t offset , const uint8_t * data , size_t len )
126- {
127- size_t end ;
128- end = offset + len ;
129- if (dbuf_realloc (s , end ))
130- return -1 ;
131- memcpy (s -> buf + offset , data , len );
132- if (end > s -> size )
133- s -> size = end ;
134- return 0 ;
135- }
136-
137130int dbuf_put (DynBuf * s , const uint8_t * data , size_t len )
138131{
139- if (unlikely ((s -> size + len ) > s -> allocated_size )) {
140- if (dbuf_realloc (s , s -> size + len ))
132+ if (unlikely ((s -> allocated_size - s -> size ) < len )) {
133+ if (dbuf_claim (s , len ))
141134 return -1 ;
142135 }
143136 memcpy_no_ub (s -> buf + s -> size , data , len );
@@ -147,20 +140,35 @@ int dbuf_put(DynBuf *s, const uint8_t *data, size_t len)
147140
148141int dbuf_put_self (DynBuf * s , size_t offset , size_t len )
149142{
150- if (unlikely ((s -> size + len ) > s -> allocated_size )) {
151- if (dbuf_realloc (s , s -> size + len ))
143+ if (unlikely ((s -> allocated_size - s -> size ) < len )) {
144+ if (dbuf_claim (s , len ))
152145 return -1 ;
153146 }
154147 memcpy (s -> buf + s -> size , s -> buf + offset , len );
155148 s -> size += len ;
156149 return 0 ;
157150}
158151
159- int dbuf_putc (DynBuf * s , uint8_t c )
152+ int __dbuf_putc (DynBuf * s , uint8_t c )
160153{
161154 return dbuf_put (s , & c , 1 );
162155}
163156
157+ int __dbuf_put_u16 (DynBuf * s , uint16_t val )
158+ {
159+ return dbuf_put (s , (uint8_t * )& val , 2 );
160+ }
161+
162+ int __dbuf_put_u32 (DynBuf * s , uint32_t val )
163+ {
164+ return dbuf_put (s , (uint8_t * )& val , 4 );
165+ }
166+
167+ int __dbuf_put_u64 (DynBuf * s , uint64_t val )
168+ {
169+ return dbuf_put (s , (uint8_t * )& val , 8 );
170+ }
171+
164172int dbuf_putstr (DynBuf * s , const char * str )
165173{
166174 return dbuf_put (s , (const uint8_t * )str , strlen (str ));
@@ -182,7 +190,7 @@ int __attribute__((format(printf, 2, 3))) dbuf_printf(DynBuf *s,
182190 /* fast case */
183191 return dbuf_put (s , (uint8_t * )buf , len );
184192 } else {
185- if (dbuf_realloc (s , s -> size + len + 1 ))
193+ if (dbuf_claim (s , len + 1 ))
186194 return -1 ;
187195 va_start (ap , fmt );
188196 vsnprintf ((char * )(s -> buf + s -> size ), s -> allocated_size - s -> size ,
0 commit comments