1.1 --- a/ucx/buffer.c Tue May 06 12:03:16 2014 +0200 1.2 +++ b/ucx/buffer.c Tue May 06 12:30:12 2014 +0200 1.3 @@ -31,22 +31,22 @@ 1.4 #include <stdlib.h> 1.5 #include <string.h> 1.6 1.7 -UcxBuffer *ucx_buffer_new(void *space, size_t size, int flags) { 1.8 +UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags) { 1.9 UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 1.10 if (buffer) { 1.11 buffer->flags = flags; 1.12 if (!space) { 1.13 - buffer->space = (char*)malloc(size); 1.14 + buffer->space = (char*)malloc(capacity); 1.15 if (!buffer->space) { 1.16 free(buffer); 1.17 return NULL; 1.18 } 1.19 - memset(buffer->space, 0, size); 1.20 + memset(buffer->space, 0, capacity); 1.21 buffer->flags |= UCX_BUFFER_AUTOFREE; 1.22 } else { 1.23 buffer->space = (char*)space; 1.24 } 1.25 - buffer->capacity = size; 1.26 + buffer->capacity = capacity; 1.27 buffer->size = 0; 1.28 1.29 buffer->pos = 0; 1.30 @@ -64,13 +64,8 @@ 1.31 1.32 UcxBuffer* ucx_buffer_extract( 1.33 UcxBuffer *src, size_t start, size_t length, int flags) { 1.34 - if(src->size == 0) { 1.35 - return NULL; 1.36 - } 1.37 - if (length == 0) { 1.38 - length = src->size - start; 1.39 - } 1.40 - if (start+length > src->size) { 1.41 + 1.42 + if (src->size == 0 || length == 0 || start+length > src->capacity) { 1.43 return NULL; 1.44 } 1.45 1.46 @@ -99,13 +94,21 @@ 1.47 case SEEK_END: 1.48 npos = buffer->size; 1.49 break; 1.50 + case SEEK_SET: 1.51 + npos = 0; 1.52 + break; 1.53 default: 1.54 - npos = 0; 1.55 + return -1; 1.56 } 1.57 1.58 + size_t opos = npos; 1.59 npos += offset; 1.60 1.61 - if (npos > buffer->size) { 1.62 + if ((offset > 0 && npos < opos) || (offset < 0 && npos > opos)) { 1.63 + return -1; 1.64 + } 1.65 + 1.66 + if (npos >= buffer->size) { 1.67 return -1; 1.68 } else { 1.69 buffer->pos = npos; 1.70 @@ -120,7 +123,17 @@ 1.71 1.72 int ucx_buffer_extend(UcxBuffer *buffer, size_t len) { 1.73 size_t newcap = buffer->capacity; 1.74 - while (buffer->pos + len > newcap) newcap <<= 1; 1.75 + 1.76 + if (buffer->capacity + len < buffer->capacity) { 1.77 + return -1; 1.78 + } 1.79 + 1.80 + while (buffer->capacity + len > newcap) { 1.81 + newcap <<= 1; 1.82 + if (newcap < buffer->capacity) { 1.83 + return -1; 1.84 + } 1.85 + } 1.86 1.87 char *newspace = (char*)realloc(buffer->space, newcap); 1.88 if (newspace) { 1.89 @@ -137,18 +150,25 @@ 1.90 size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems, 1.91 UcxBuffer *buffer) { 1.92 size_t len = size * nitems; 1.93 - if (buffer->pos + len > buffer->capacity) { 1.94 + size_t required = buffer->pos + len; 1.95 + if (buffer->pos > required) { 1.96 + return 0; 1.97 + } 1.98 + 1.99 + if (required > buffer->capacity) { 1.100 if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) { 1.101 - if(ucx_buffer_extend(buffer, len)) { 1.102 - return -1; 1.103 + if (ucx_buffer_extend(buffer, required - buffer->capacity)) { 1.104 + return 0; 1.105 } 1.106 } else { 1.107 len = buffer->capacity - buffer->pos; 1.108 - if (size > 1) len -= len%size; 1.109 + if (size > 1) { 1.110 + len -= len%size; 1.111 + } 1.112 } 1.113 } 1.114 1.115 - if (len <= 0) { 1.116 + if (len == 0) { 1.117 return len; 1.118 } 1.119