Removed null-pointer dereference in low mem.
[umurmur.git] / src / pds.c
index 7db1e7a5090cfee291f0184908ee6c52de88ece5..88339d0bd907ec2c81e6f3efef75bb055818dd38 100644 (file)
--- a/src/pds.c
+++ b/src/pds.c
@@ -1,5 +1,5 @@
-/* Copyright (C) 2009, Martin Johansson <martin@fatbob.nu>
-   Copyright (C) 2005-2009, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
+   Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
 
    All rights reserved.
 
@@ -32,6 +32,7 @@
 #include <stdlib.h>
 #include "pds.h"
 #include "log.h"
+#include "memory.h"
 
 /*
  * Data serialization functions below
@@ -83,6 +84,28 @@ void Pds_append_data_nosize(pds_t *pds, const uint8_t *data, uint32_t len)
        }
 }
 
+uint8_t Pds_next8(pds_t *pds)
+{
+       if (pds->offset < pds->maxsize)
+               return pds->data[pds->offset++];
+       else {
+               pds->bOk = false;
+               return 0;
+       }
+}
+
+int Pds_skip(pds_t *pds, int offset)
+{
+       if (pds->offset + offset <= pds->maxsize) {
+               pds->offset += offset;
+               return offset;
+       } else {
+               pds->bOk = false;
+               return 0;
+       }
+
+}
+
 static inline uint64_t next(pds_t *pds)
 {
        if (pds->offset < pds->maxsize)
@@ -95,9 +118,7 @@ static inline uint64_t next(pds_t *pds)
 
 pds_t *Pds_create(uint8_t *buf, int size)
 {
-       pds_t *pds = malloc(sizeof(pds_t));
-       if (pds == NULL)
-               Log_fatal("Out of memory");
+       pds_t *pds = Memory_safeMalloc(1, sizeof(pds_t));
        pds->data = buf;
        pds->offset = pds->overshoot = 0;
        pds->maxsize = size;
@@ -113,9 +134,9 @@ void Pds_free(pds_t *pds)
 void Pds_add_double(pds_t *pds, double value)
 {
        double64u_t u;
-       
+
        u.dval = value;
-       
+
        Pds_add_numval(pds, u.u64);
 }
 
@@ -128,7 +149,7 @@ double Pds_get_double(pds_t *pds)
 void Pds_add_numval(pds_t *pds, const uint64_t value)
 {
        uint64_t i = value;
-       
+
        if ((i & 0x8000000000000000LL) && (~i < 0x100000000LL)) {
                // Signed number.
                i = ~i;
@@ -178,12 +199,12 @@ void Pds_add_numval(pds_t *pds, const uint64_t value)
                append_val(pds, i & 0xFF);
        }
 }
-       
+
 uint64_t Pds_get_numval(pds_t *pds)
 {
        uint64_t i = 0;
        uint64_t v = next(pds);
-       
+
        if ((v & 0x80) == 0x00) {
                i=(v & 0x7F);
        } else if ((v & 0xC0) == 0x80) {