From 83ff9840528320d61c61741082672d1ffab36000 Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Fri, 30 May 2014 10:04:04 -0400 Subject: [PATCH 1/6] Add delete_after for klist --- klist.h | 13 +++++++++++++ test/klist_test.c | 2 ++ 2 files changed, 15 insertions(+) diff --git a/klist.h b/klist.h index adc3db1e..2c263b70 100644 --- a/klist.h +++ b/klist.h @@ -115,6 +115,18 @@ if (d) *d = p->data; \ kmp_free(name, kl->mp, p); \ return 0; \ + } \ + static inline int kl_delete_after_##name(kl_##name##_t *kl, \ + kl1_##name *c, \ + kltype_t *d) { \ + kl1_##name *p; \ + if (c->next == 0) return -1; \ + if (c->next->next == 0) return -1; \ + --kl->size; \ + p = c->next; c->next = c->next->next; \ + if (d) *d = p->data; \ + kmp_free(name, kl->mp, p); \ + return 0; \ } #define KLIST_INIT(name, kltype_t, kmpfree_t) \ @@ -131,5 +143,6 @@ #define kl_destroy(name, kl) kl_destroy_##name(kl) #define kl_pushp(name, kl) kl_pushp_##name(kl) #define kl_shift(name, kl, d) kl_shift_##name(kl, d) +#define kl_delete_after(name, kl, iter, d) kl_delete_after_##name(kl, iter, d) #endif diff --git a/test/klist_test.c b/test/klist_test.c index cd13813d..324e92e0 100644 --- a/test/klist_test.c +++ b/test/klist_test.c @@ -11,7 +11,9 @@ int main() kl = kl_init(32); *kl_pushp(32, kl) = 1; *kl_pushp(32, kl) = 10; + *kl_pushp(32, kl) = 19; kl_shift(32, kl, 0); + kl_delete_after(32, kl, kl_begin(kl), 0); for (p = kl_begin(kl); p != kl_end(kl); p = kl_next(p)) printf("%d\n", kl_val(p)); kl_destroy(32, kl); From 393c21bd4354ba4b8e436a078c8253daf2209576 Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Fri, 30 May 2014 22:11:34 -0400 Subject: [PATCH 2/6] Add insert_after and unshift --- klist.h | 17 +++++++++++++++++ test/klist_test.c | 3 +++ 2 files changed, 20 insertions(+) diff --git a/klist.h b/klist.h index 2c263b70..76d3cb54 100644 --- a/klist.h +++ b/klist.h @@ -116,6 +116,12 @@ kmp_free(name, kl->mp, p); \ return 0; \ } \ + static inline kltype_t *kl_unshiftp_##name(kl_##name##_t *kl) { \ + kl1_##name *q, *p = kmp_alloc(name, kl->mp); \ + q = kl->head; p->next = q; kl->head = p; \ + ++kl->size; \ + return &p->data; \ + } \ static inline int kl_delete_after_##name(kl_##name##_t *kl, \ kl1_##name *c, \ kltype_t *d) { \ @@ -127,6 +133,14 @@ if (d) *d = p->data; \ kmp_free(name, kl->mp, p); \ return 0; \ + } \ + static inline kltype_t *kl_insertp_after_##name(kl_##name##_t *kl, \ + kl1_##name *c) { \ + if (c->next == 0) return 0; \ + kl1_##name *p = kmp_alloc(name, kl->mp); \ + p->next = c->next; c->next = p; \ + ++kl->size; \ + return &p->data; \ } #define KLIST_INIT(name, kltype_t, kmpfree_t) \ @@ -143,6 +157,9 @@ #define kl_destroy(name, kl) kl_destroy_##name(kl) #define kl_pushp(name, kl) kl_pushp_##name(kl) #define kl_shift(name, kl, d) kl_shift_##name(kl, d) +#define kl_unshiftp(name, kl) kl_unshiftp_##name(kl) + #define kl_delete_after(name, kl, iter, d) kl_delete_after_##name(kl, iter, d) +#define kl_insertp_after(name, kl, iter) kl_insertp_after_##name(kl, iter) #endif diff --git a/test/klist_test.c b/test/klist_test.c index 324e92e0..9ec45cdf 100644 --- a/test/klist_test.c +++ b/test/klist_test.c @@ -12,8 +12,11 @@ int main() *kl_pushp(32, kl) = 1; *kl_pushp(32, kl) = 10; *kl_pushp(32, kl) = 19; + *kl_pushp(32, kl) = 28; kl_shift(32, kl, 0); kl_delete_after(32, kl, kl_begin(kl), 0); + *kl_unshiftp(32, kl) = 37; + *kl_insertp_after(32, kl, kl_begin(kl)) = 46; for (p = kl_begin(kl); p != kl_end(kl); p = kl_next(p)) printf("%d\n", kl_val(p)); kl_destroy(32, kl); From 6c9ebad0e034d7dc4ead2bef567572502357f59a Mon Sep 17 00:00:00 2001 From: tecywiz121 Date: Mon, 2 Jun 2014 11:41:57 -0400 Subject: [PATCH 3/6] Add kl_length macro --- klist.h | 1 + 1 file changed, 1 insertion(+) diff --git a/klist.h b/klist.h index 76d3cb54..4483288c 100644 --- a/klist.h +++ b/klist.h @@ -152,6 +152,7 @@ #define kl_next(iter) ((iter)->next) #define kl_begin(kl) ((kl)->head) #define kl_end(kl) ((kl)->tail) +#define kl_length(kl) ((kl)->size) #define kl_init(name) kl_init_##name() #define kl_destroy(name, kl) kl_destroy_##name(kl) From 242ed0a3dfb0221410df048539a5f4bafd6e1d65 Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Fri, 19 Sep 2014 09:56:31 -0400 Subject: [PATCH 4/6] Make klist cope with OoM situations; Improve c++ compatibility --- klist.h | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/klist.h b/klist.h index 4483288c..2b32673e 100644 --- a/klist.h +++ b/klist.h @@ -42,7 +42,7 @@ kmptype_t **buf; \ } kmp_##name##_t; \ SCOPE kmp_##name##_t *kmp_init_##name(void) { \ - return calloc(1, sizeof(kmp_##name##_t)); \ + return (kmp_##name##_t *)calloc(1, sizeof(kmp_##name##_t)); \ } \ SCOPE void kmp_destroy_##name(kmp_##name##_t *mp) { \ size_t k; \ @@ -53,14 +53,16 @@ } \ SCOPE kmptype_t *kmp_alloc_##name(kmp_##name##_t *mp) { \ ++mp->cnt; \ - if (mp->n == 0) return calloc(1, sizeof(kmptype_t)); \ + if (mp->n == 0) return (kmptype_t*)calloc(1,sizeof(kmptype_t)); \ return mp->buf[--mp->n]; \ } \ SCOPE void kmp_free_##name(kmp_##name##_t *mp, kmptype_t *p) { \ --mp->cnt; \ if (mp->n == mp->max) { \ - mp->max = mp->max? mp->max<<1 : 16; \ - mp->buf = realloc(mp->buf, sizeof(kmptype_t *) * mp->max); \ + size_t new_max = mp->max ? mp->max<<1 : 16; \ + void* nb = realloc(mp->buf, sizeof(kmptype_t *) * new_max); \ + if (!nb) { kmpfree_f(p); free(p); return; } \ + mp->max = new_max; mp->buf = (kmptype_t **)nb; \ } \ mp->buf[mp->n++] = p; \ } @@ -87,9 +89,12 @@ size_t size; \ } kl_##name##_t; \ SCOPE kl_##name##_t *kl_init_##name(void) { \ - kl_##name##_t *kl = calloc(1, sizeof(kl_##name##_t)); \ + kl_##name##_t *kl = (kl_##name##_t *)calloc(1, sizeof(kl_##name##_t)); \ + if (!kl) return 0; \ kl->mp = kmp_init(name); \ + if (!kl->mp) { free(kl); return 0; } \ kl->head = kl->tail = kmp_alloc(name, kl->mp); \ + if (!kl->head) { free(kl->mp); free(kl); return 0; } \ kl->head->next = 0; \ return kl; \ } \ @@ -103,6 +108,7 @@ } \ SCOPE kltype_t *kl_pushp_##name(kl_##name##_t *kl) { \ kl1_##name *q, *p = kmp_alloc(name, kl->mp); \ + if (!p) return 0; \ q = kl->tail; p->next = 0; kl->tail->next = p; kl->tail = p; \ ++kl->size; \ return &q->data; \ @@ -118,6 +124,7 @@ } \ static inline kltype_t *kl_unshiftp_##name(kl_##name##_t *kl) { \ kl1_##name *q, *p = kmp_alloc(name, kl->mp); \ + if (!p) return 0; \ q = kl->head; p->next = q; kl->head = p; \ ++kl->size; \ return &p->data; \ @@ -138,6 +145,7 @@ kl1_##name *c) { \ if (c->next == 0) return 0; \ kl1_##name *p = kmp_alloc(name, kl->mp); \ + if (!p) return 0; \ p->next = c->next; c->next = p; \ ++kl->size; \ return &p->data; \ From 03ce04c7f67b3ce5cb4e870669488dc849792f42 Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Wed, 4 Feb 2015 13:32:04 -0500 Subject: [PATCH 5/6] Fix use-after-free in klist --- klist.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/klist.h b/klist.h index 2b32673e..25e23458 100644 --- a/klist.h +++ b/klist.h @@ -99,9 +99,11 @@ return kl; \ } \ SCOPE void kl_destroy_##name(kl_##name##_t *kl) { \ - kl1_##name *p; \ - for (p = kl->head; p != kl->tail; p = p->next) \ + kl1_##name *p, *next_p; \ + for (p = kl->head; p != kl->tail; p = next_p){ \ + next_p = p->next; \ kmp_free(name, kl->mp, p); \ + } \ kmp_free(name, kl->mp, p); \ kmp_destroy(name, kl->mp); \ free(kl); \ From e48a57b36ab3e74aad5ecb7b4b93daca92e04279 Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Thu, 24 Nov 2016 13:24:02 -0500 Subject: [PATCH 6/6] Use the SCOPE macro argument in klist --- klist.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/klist.h b/klist.h index 25e23458..1a96dc87 100644 --- a/klist.h +++ b/klist.h @@ -124,14 +124,14 @@ kmp_free(name, kl->mp, p); \ return 0; \ } \ - static inline kltype_t *kl_unshiftp_##name(kl_##name##_t *kl) { \ + SCOPE kltype_t *kl_unshiftp_##name(kl_##name##_t *kl) { \ kl1_##name *q, *p = kmp_alloc(name, kl->mp); \ if (!p) return 0; \ q = kl->head; p->next = q; kl->head = p; \ ++kl->size; \ return &p->data; \ } \ - static inline int kl_delete_after_##name(kl_##name##_t *kl, \ + SCOPE int kl_delete_after_##name(kl_##name##_t *kl, \ kl1_##name *c, \ kltype_t *d) { \ kl1_##name *p; \ @@ -143,7 +143,7 @@ kmp_free(name, kl->mp, p); \ return 0; \ } \ - static inline kltype_t *kl_insertp_after_##name(kl_##name##_t *kl, \ + SCOPE kltype_t *kl_insertp_after_##name(kl_##name##_t *kl, \ kl1_##name *c) { \ if (c->next == 0) return 0; \ kl1_##name *p = kmp_alloc(name, kl->mp); \