fixed issues revealed by buffer tests

Tue, 06 May 2014 12:30:12 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 06 May 2014 12:30:12 +0200
changeset 169
279dd3ca7a77
parent 168
24a012440dee
child 170
5fbb9efebe4a

fixed issues revealed by buffer tests

test/buffer_tests.c file | annotate | diff | comparison | revisions
ucx/buffer.c file | annotate | diff | comparison | revisions
ucx/buffer.h file | annotate | diff | comparison | revisions
     1.1 --- a/test/buffer_tests.c	Tue May 06 12:03:16 2014 +0200
     1.2 +++ b/test/buffer_tests.c	Tue May 06 12:30:12 2014 +0200
     1.3 @@ -363,6 +363,8 @@
     1.4  
     1.5  UCX_TEST(test_ucx_buffer_write) {
     1.6      char *buffer = (char*) malloc(32);
     1.7 +    memset(buffer, 0, 32);
     1.8 +    
     1.9      memset(buffer, 32, 8);
    1.10      for (int i = 8; i < 16 ; i++) {
    1.11          buffer[i] = 40+i;
    1.12 @@ -432,6 +434,7 @@
    1.13  
    1.14  UCX_TEST(test_ucx_buffer_write_ax) {
    1.15      char *buffer = (char*) malloc(16);
    1.16 +    memset(buffer, 0, 16);
    1.17  
    1.18      UcxBuffer *b = ucx_buffer_new(buffer, 16,
    1.19              UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE);
     2.1 --- a/ucx/buffer.c	Tue May 06 12:03:16 2014 +0200
     2.2 +++ b/ucx/buffer.c	Tue May 06 12:30:12 2014 +0200
     2.3 @@ -31,22 +31,22 @@
     2.4  #include <stdlib.h>
     2.5  #include <string.h>
     2.6  
     2.7 -UcxBuffer *ucx_buffer_new(void *space, size_t size, int flags) {
     2.8 +UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags) {
     2.9      UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer));
    2.10      if (buffer) {
    2.11          buffer->flags = flags;
    2.12          if (!space) {
    2.13 -            buffer->space = (char*)malloc(size);
    2.14 +            buffer->space = (char*)malloc(capacity);
    2.15              if (!buffer->space) {
    2.16                  free(buffer);
    2.17                  return NULL;
    2.18              }
    2.19 -            memset(buffer->space, 0, size);
    2.20 +            memset(buffer->space, 0, capacity);
    2.21              buffer->flags |= UCX_BUFFER_AUTOFREE;
    2.22          } else {
    2.23              buffer->space = (char*)space;
    2.24          }
    2.25 -        buffer->capacity = size;
    2.26 +        buffer->capacity = capacity;
    2.27          buffer->size = 0;
    2.28  
    2.29          buffer->pos = 0;
    2.30 @@ -64,13 +64,8 @@
    2.31  
    2.32  UcxBuffer* ucx_buffer_extract(
    2.33          UcxBuffer *src, size_t start, size_t length, int flags) {
    2.34 -    if(src->size == 0) {
    2.35 -        return NULL;
    2.36 -    }
    2.37 -    if (length == 0) {
    2.38 -        length = src->size - start;
    2.39 -    }
    2.40 -    if (start+length > src->size) {
    2.41 +    
    2.42 +    if (src->size == 0 || length == 0 || start+length > src->capacity) {
    2.43          return NULL;
    2.44      }
    2.45  
    2.46 @@ -99,13 +94,21 @@
    2.47      case SEEK_END:
    2.48          npos = buffer->size;
    2.49          break;
    2.50 +    case SEEK_SET:
    2.51 +        npos = 0;
    2.52 +        break;
    2.53      default:
    2.54 -        npos = 0;
    2.55 +        return -1;
    2.56      }
    2.57  
    2.58 +    size_t opos = npos;
    2.59      npos += offset;
    2.60      
    2.61 -    if (npos > buffer->size) {
    2.62 +    if ((offset > 0 && npos < opos) || (offset < 0 && npos > opos)) {
    2.63 +        return -1;
    2.64 +    }
    2.65 +    
    2.66 +    if (npos >= buffer->size) {
    2.67          return -1;
    2.68      } else {
    2.69          buffer->pos = npos;
    2.70 @@ -120,7 +123,17 @@
    2.71  
    2.72  int ucx_buffer_extend(UcxBuffer *buffer, size_t len) {
    2.73      size_t newcap = buffer->capacity;
    2.74 -    while (buffer->pos + len > newcap) newcap <<= 1;
    2.75 +    
    2.76 +    if (buffer->capacity + len < buffer->capacity) {
    2.77 +        return -1;
    2.78 +    }
    2.79 +    
    2.80 +    while (buffer->capacity + len > newcap) {
    2.81 +        newcap <<= 1;
    2.82 +        if (newcap < buffer->capacity) {
    2.83 +            return -1;
    2.84 +        }
    2.85 +    }
    2.86      
    2.87      char *newspace = (char*)realloc(buffer->space, newcap);
    2.88      if (newspace) {
    2.89 @@ -137,18 +150,25 @@
    2.90  size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems,
    2.91          UcxBuffer *buffer) {
    2.92      size_t len = size * nitems;
    2.93 -    if (buffer->pos + len > buffer->capacity) {
    2.94 +    size_t required = buffer->pos + len;
    2.95 +    if (buffer->pos > required) {
    2.96 +        return 0;
    2.97 +    }
    2.98 +    
    2.99 +    if (required > buffer->capacity) {
   2.100          if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) {
   2.101 -            if(ucx_buffer_extend(buffer, len)) {
   2.102 -                return -1;
   2.103 +            if (ucx_buffer_extend(buffer, required - buffer->capacity)) {
   2.104 +                return 0;
   2.105              }
   2.106          } else {
   2.107              len = buffer->capacity - buffer->pos;
   2.108 -            if (size > 1) len -= len%size;
   2.109 +            if (size > 1) {
   2.110 +                len -= len%size;
   2.111 +            }
   2.112          }
   2.113      }
   2.114      
   2.115 -    if (len <= 0) {
   2.116 +    if (len == 0) {
   2.117          return len;
   2.118      }
   2.119      
     3.1 --- a/ucx/buffer.h	Tue May 06 12:03:16 2014 +0200
     3.2 +++ b/ucx/buffer.h	Tue May 06 12:30:12 2014 +0200
     3.3 @@ -97,11 +97,11 @@
     3.4   * 
     3.5   * @param space pointer to the memory area, or <code>NULL</code> to allocate
     3.6   * new memory
     3.7 - * @param size the size of the buffer
     3.8 + * @param capacity the capacity of the buffer
     3.9   * @param flags buffer features (see UcxBuffer.flags)
    3.10   * @return the new buffer
    3.11   */
    3.12 -UcxBuffer *ucx_buffer_new(void *space, size_t size, int flags);
    3.13 +UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags);
    3.14  
    3.15  /**
    3.16   * Destroys a buffer.

mercurial