Skip to content

Commit 1a6f826

Browse files
committed
Merge pull request #303 from llchan/master
Fix zbuffer empty string writes
2 parents 32c42d2 + 22e428b commit 1a6f826

File tree

3 files changed

+33
-16
lines changed

3 files changed

+33
-16
lines changed

include/msgpack/zbuffer.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
7070
static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf);
7171

7272

73-
bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf,
73+
static inline bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf,
7474
int level, size_t init_size)
7575
{
7676
memset(zbuf, 0, sizeof(msgpack_zbuffer));
@@ -82,13 +82,13 @@ bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf,
8282
return true;
8383
}
8484

85-
void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf)
85+
static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf)
8686
{
8787
deflateEnd(&zbuf->stream);
8888
free(zbuf->data);
8989
}
9090

91-
msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size)
91+
static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size)
9292
{
9393
msgpack_zbuffer* zbuf = (msgpack_zbuffer*)malloc(sizeof(msgpack_zbuffer));
9494
if (zbuf == NULL) return NULL;
@@ -99,14 +99,14 @@ msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size)
9999
return zbuf;
100100
}
101101

102-
void msgpack_zbuffer_free(msgpack_zbuffer* zbuf)
102+
static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf)
103103
{
104104
if(zbuf == NULL) { return; }
105105
msgpack_zbuffer_destroy(zbuf);
106106
free(zbuf);
107107
}
108108

109-
bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf)
109+
static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf)
110110
{
111111
size_t used = (char*)zbuf->stream.next_out - zbuf->data;
112112
size_t csize = used + zbuf->stream.avail_out;
@@ -124,14 +124,14 @@ bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf)
124124
return true;
125125
}
126126

127-
int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
127+
static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
128128
{
129129
msgpack_zbuffer* zbuf = (msgpack_zbuffer*)data;
130130

131131
zbuf->stream.next_in = (Bytef*)buf;
132132
zbuf->stream.avail_in = len;
133133

134-
do {
134+
while(zbuf->stream.avail_in > 0) {
135135
if(zbuf->stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) {
136136
if(!msgpack_zbuffer_expand(zbuf)) {
137137
return -1;
@@ -141,12 +141,12 @@ int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
141141
if(deflate(&zbuf->stream, Z_NO_FLUSH) != Z_OK) {
142142
return -1;
143143
}
144-
} while(zbuf->stream.avail_in > 0);
144+
}
145145

146146
return 0;
147147
}
148148

149-
char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf)
149+
static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf)
150150
{
151151
while(true) {
152152
switch(deflate(&zbuf->stream, Z_FINISH)) {
@@ -163,23 +163,23 @@ char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf)
163163
}
164164
}
165165

166-
const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf)
166+
static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf)
167167
{
168168
return zbuf->data;
169169
}
170170

171-
size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf)
171+
static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf)
172172
{
173173
return (char*)zbuf->stream.next_out - zbuf->data;
174174
}
175175

176-
void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf)
176+
static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf)
177177
{
178178
zbuf->stream.avail_out += (char*)zbuf->stream.next_out - zbuf->data;
179179
zbuf->stream.next_out = (Bytef*)zbuf->data;
180180
}
181181

182-
bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf)
182+
static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf)
183183
{
184184
if(deflateReset(&zbuf->stream) != Z_OK) {
185185
return false;
@@ -188,7 +188,7 @@ bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf)
188188
return true;
189189
}
190190

191-
char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf)
191+
static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf)
192192
{
193193
char* tmp = zbuf->data;
194194
zbuf->data = NULL;

include/msgpack/zbuffer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class zbuffer {
6565
m_stream.next_in = reinterpret_cast<Bytef*>(const_cast<char*>(buf));
6666
m_stream.avail_in = len;
6767

68-
do {
68+
while(m_stream.avail_in > 0) {
6969
if(m_stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) {
7070
if(!expand()) {
7171
throw std::bad_alloc();
@@ -75,7 +75,7 @@ class zbuffer {
7575
if(deflate(&m_stream, Z_NO_FLUSH) != Z_OK) {
7676
throw std::bad_alloc();
7777
}
78-
} while(m_stream.avail_in > 0);
78+
}
7979
}
8080

8181
char* flush()

test/buffer.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <msgpack/fbuffer.hpp>
33
#include <msgpack/fbuffer.h>
44
#include <msgpack/zbuffer.hpp>
5+
#include <msgpack/zbuffer.h>
56
#include <gtest/gtest.h>
67
#include <string.h>
78

@@ -68,11 +69,27 @@ TEST(buffer, zbuffer)
6869
zbuf.write("a", 1);
6970
zbuf.write("a", 1);
7071
zbuf.write("a", 1);
72+
zbuf.write("", 0);
7173

7274
zbuf.flush();
7375
}
7476

7577

78+
TEST(buffer, zbuffer_c)
79+
{
80+
msgpack_zbuffer zbuf;
81+
EXPECT_TRUE(msgpack_zbuffer_init(&zbuf, 1, MSGPACK_ZBUFFER_INIT_SIZE));
82+
EXPECT_EQ(0, msgpack_zbuffer_write(&zbuf, "a", 1));
83+
EXPECT_EQ(0, msgpack_zbuffer_write(&zbuf, "a", 1));
84+
EXPECT_EQ(0, msgpack_zbuffer_write(&zbuf, "a", 1));
85+
EXPECT_EQ(0, msgpack_zbuffer_write(&zbuf, "", 0));
86+
87+
EXPECT_TRUE(msgpack_zbuffer_flush(&zbuf) != NULL);
88+
89+
msgpack_zbuffer_destroy(&zbuf);
90+
}
91+
92+
7693
TEST(buffer, fbuffer)
7794
{
7895
FILE* file = tmpfile();

0 commit comments

Comments
 (0)