aboutsummaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2007-06-11 23:44:54 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2007-06-11 23:44:54 +0000
commit3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a (patch)
treef0c49eb250f5375414025a9e7022261e729ad905 /src/buffer.c
parent3074a8f56b5153f4477e662453102583d7b6f539 (diff)
downloadluasocket-3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a.tar.gz
luasocket-3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a.tar.bz2
luasocket-3cd10f5ab6cda5c4a8db829dd38f25168edcfc4a.zip
Crashy bug fixed in recvraw.
Also fixed returns on closed socket.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/buffer.c b/src/buffer.c
index df1a0bc..de817b2 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -75,12 +75,12 @@ int buffer_meth_setstats(lua_State *L, p_buffer buf) {
75\*-------------------------------------------------------------------------*/ 75\*-------------------------------------------------------------------------*/
76int buffer_meth_send(lua_State *L, p_buffer buf) { 76int buffer_meth_send(lua_State *L, p_buffer buf) {
77 int top = lua_gettop(L); 77 int top = lua_gettop(L);
78 p_timeout tm = timeout_markstart(buf->tm);
79 int err = IO_DONE; 78 int err = IO_DONE;
80 size_t size = 0, sent = 0; 79 size_t size = 0, sent = 0;
81 const char *data = luaL_checklstring(L, 2, &size); 80 const char *data = luaL_checklstring(L, 2, &size);
82 long start = (long) luaL_optnumber(L, 3, 1); 81 long start = (long) luaL_optnumber(L, 3, 1);
83 long end = (long) luaL_optnumber(L, 4, -1); 82 long end = (long) luaL_optnumber(L, 4, -1);
83 p_timeout tm = timeout_markstart(buf->tm);
84 if (start < 0) start = (long) (size+start+1); 84 if (start < 0) start = (long) (size+start+1);
85 if (end < 0) end = (long) (size+end+1); 85 if (end < 0) end = (long) (size+end+1);
86 if (start < 1) start = (long) 1; 86 if (start < 1) start = (long) 1;
@@ -108,10 +108,10 @@ int buffer_meth_send(lua_State *L, p_buffer buf) {
108\*-------------------------------------------------------------------------*/ 108\*-------------------------------------------------------------------------*/
109int buffer_meth_receive(lua_State *L, p_buffer buf) { 109int buffer_meth_receive(lua_State *L, p_buffer buf) {
110 int err = IO_DONE, top = lua_gettop(L); 110 int err = IO_DONE, top = lua_gettop(L);
111 p_timeout tm = timeout_markstart(buf->tm);
112 luaL_Buffer b; 111 luaL_Buffer b;
113 size_t size; 112 size_t size;
114 const char *part = luaL_optlstring(L, 3, "", &size); 113 const char *part = luaL_optlstring(L, 3, "", &size);
114 p_timeout tm = timeout_markstart(buf->tm);
115 /* initialize buffer with optional extra prefix 115 /* initialize buffer with optional extra prefix
116 * (useful for concatenating previous partial results) */ 116 * (useful for concatenating previous partial results) */
117 luaL_buffinit(L, &b); 117 luaL_buffinit(L, &b);
@@ -182,13 +182,14 @@ static int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent) {
182static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b) { 182static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b) {
183 int err = IO_DONE; 183 int err = IO_DONE;
184 size_t total = 0; 184 size_t total = 0;
185 while (total < wanted && err == IO_DONE) { 185 while (err == IO_DONE) {
186 size_t count; const char *data; 186 size_t count; const char *data;
187 err = buffer_get(buf, &data, &count); 187 err = buffer_get(buf, &data, &count);
188 count = MIN(count, wanted - total); 188 count = MIN(count, wanted - total);
189 luaL_addlstring(b, data, count); 189 luaL_addlstring(b, data, count);
190 buffer_skip(buf, count); 190 buffer_skip(buf, count);
191 total += count; 191 total += count;
192 if (total >= wanted) break;
192 } 193 }
193 return err; 194 return err;
194} 195}
@@ -198,14 +199,18 @@ static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b) {
198\*-------------------------------------------------------------------------*/ 199\*-------------------------------------------------------------------------*/
199static int recvall(p_buffer buf, luaL_Buffer *b) { 200static int recvall(p_buffer buf, luaL_Buffer *b) {
200 int err = IO_DONE; 201 int err = IO_DONE;
202 size_t total = 0;
201 while (err == IO_DONE) { 203 while (err == IO_DONE) {
202 const char *data; size_t count; 204 const char *data; size_t count;
203 err = buffer_get(buf, &data, &count); 205 err = buffer_get(buf, &data, &count);
206 total += count;
204 luaL_addlstring(b, data, count); 207 luaL_addlstring(b, data, count);
205 buffer_skip(buf, count); 208 buffer_skip(buf, count);
206 } 209 }
207 if (err == IO_CLOSED) return IO_DONE; 210 if (err == IO_CLOSED) {
208 else return err; 211 if (total > 0) return IO_DONE;
212 else return IO_CLOSED;
213 } else return err;
209} 214}
210 215
211/*-------------------------------------------------------------------------*\ 216/*-------------------------------------------------------------------------*\