fix leaks
[m6w6/ext-psi] / src / plist.c
index 2cf4eb3674e509378eba5312ff7d7cf2b46851d7..8b38fe018dd66b5781286643d7f057cb64bd3bf1 100644 (file)
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/
 
-#include "php_psi_stdinc.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# include "php_config.h"
+#endif
 
 #include "plist.h"
 
@@ -42,12 +46,13 @@ struct psi_plist {
                memcpy(dest, src, list->size); \
        } \
 } while (0)
+#define PLIST_CPY_R(list, dest, src, num) memcpy((dest), (src), (num) * (list)->size)
 /* !!! adjust list->count prior reduction */
 #define PLIST_MOV_REDUCE(l, i) PLIST_MOV_REDUCE_EX(l, i, 1)
-#define PLIST_MOV_REDUCE_EX(l, i, n) memmove(PLIST_ELE(l, i), PLIST_ELE(l, i + n), (l)->size * ((l)->count - i))
+#define PLIST_MOV_REDUCE_EX(l, i, n) memmove(PLIST_ELE(l, i), PLIST_ELE(l, (i) + (n)), (l)->size * ((l)->count - (i)))
 /* !!! adjust list->count after expansion */
 #define PLIST_MOV_EXPAND(l, i) PLIST_MOV_EXPAND_EX(l, i, 1)
-#define PLIST_MOV_EXPAND_EX(l, i, n) memmove(PLIST_ELE(l, i + n), PLIST_ELE(l, i), (l)->size * ((l)->count - i))
+#define PLIST_MOV_EXPAND_EX(l, i, n) memmove(PLIST_ELE(l, (i) + (n)), PLIST_ELE(l, i), (l)->size * ((l)->count - (i)))
 
 struct psi_plist *psi_plist_init(void (*dtor)(void *)) {
        return psi_plist_init_ex(0, dtor);
@@ -59,7 +64,7 @@ struct psi_plist *psi_plist_init_ex(size_t size, void (*dtor)(void *)) {
                size = sizeof(void*);
        }
 
-       list = calloc(1, sizeof(*list) + size);
+       list = pecalloc(1, sizeof(*list) + size, 1);
        list->size = size;
        list->dtor = dtor;
 
@@ -69,21 +74,25 @@ struct psi_plist *psi_plist_init_ex(size_t size, void (*dtor)(void *)) {
 void psi_plist_clean(struct psi_plist *list) {
        size_t i;
 
-       if (list->dtor) for (i = 0; i < list->count; ++i) {
-               list->dtor(PLIST_ELE(list, i));
+       if (list) {
+               if (list->dtor) for (i = 0; i < list->count; ++i) {
+                       list->dtor(PLIST_ELE(list, i));
+               }
+               list->count = 0;
        }
-       list->count = 0;
 }
 
 void psi_plist_free(struct psi_plist *list) {
-       psi_plist_clean(list);
-       free(list);
+       if (list) {
+               psi_plist_clean(list);
+               free(list);
+       }
 }
 
 struct psi_plist *psi_plist_copy(struct psi_plist *list, void (*ctor)(void *))
 {
        size_t i;
-       struct psi_plist *copy = calloc(1, sizeof(*list) + list->size + list->count * list->size);
+       struct psi_plist *copy = pecalloc(1, sizeof(*list) + list->size + list->count * list->size, 1);
 
        *copy = *list;
        if (list->count) {
@@ -108,7 +117,7 @@ void **psi_plist_eles(struct psi_plist *list) {
 
 struct psi_plist *psi_plist_add(struct psi_plist *list, void *ptr) {
        if (list && list->count) {
-               list = realloc(list, sizeof(*list) + list->size + list->count * list->size);
+               list = safe_perealloc(list, list->count + 1, list->size, sizeof(*list), 1);
        }
        if (list) {
                PLIST_CPY(list, PLIST_ELE(list, list->count++), ptr);
@@ -117,8 +126,8 @@ struct psi_plist *psi_plist_add(struct psi_plist *list, void *ptr) {
 }
 
 struct psi_plist *psi_plist_add_r(struct psi_plist *list, size_t num_eles, void **eles) {
-       if (list && list->count) {
-               list = realloc(list, sizeof(*list) + list->size + (num_eles + list->count) * list->size);
+       if (list) {
+               list = safe_perealloc(list, list->count + num_eles + 1, list->size, sizeof(*list), 1);
        }
        if (list) {
                memcpy(PLIST_ELE(list, list->count), eles, num_eles * list->size);
@@ -135,6 +144,22 @@ bool psi_plist_get(struct psi_plist *list, size_t index, void *ptr) {
        return false;
 }
 
+bool psi_plist_unset(struct psi_plist *list, size_t index) {
+       if (list && list->count > index) {
+               memset(PLIST_ELE(list, index), 0, list->size);
+               return true;
+       }
+       return false;
+}
+
+bool psi_plist_set(struct psi_plist *list, size_t index, void *ptr) {
+       if (list && list->count > index) {
+               PLIST_CPY(list, PLIST_ELE(list, index), ptr);
+               return true;
+       }
+       return false;
+}
+
 bool psi_plist_del(struct psi_plist *list, size_t index, void *ptr) {
        if (list && list->count > index) {
                if (ptr) {
@@ -177,7 +202,7 @@ struct psi_plist *psi_plist_ins(struct psi_plist *list, size_t index, void *ptr)
        if (list) {
                new_count = MAX(list->count + 1, index);
                if (new_count) {
-                       list = realloc(list, sizeof(*list) + list->size + new_count * list->size);
+                       list = safe_perealloc(list, new_count + 1, list->size, sizeof(*list), 1);
                }
                if (list) {
                        PLIST_MOV_EXPAND(list, index);
@@ -192,17 +217,13 @@ struct psi_plist *psi_plist_ins_r(struct psi_plist *list, size_t offset_start, s
        size_t new_count;
 
        if (list) {
-               new_count = MAX(offset_start + 1, list->count) + num_eles;
+               new_count = MAX(offset_start, list->count) + num_eles;
                if (new_count) {
-                       list = realloc(list, sizeof(*list) + list->size + new_count * list->size);
+                       list = safe_perealloc(list, new_count + 1, list->size, sizeof(*list), 1);
                }
                if (list) {
-                       size_t e;
-
                        PLIST_MOV_EXPAND_EX(list, offset_start, num_eles);
-                       for (e = 0; e < num_eles; ++e) {
-                               PLIST_CPY(list, PLIST_ELE(list, offset_start + e), &eles[e]);
-                       }
+                       PLIST_CPY_R(list, PLIST_ELE(list, offset_start), eles, num_eles);
                        list->count = new_count;
                }
        }