diff --git a/src/line.c b/src/line.c index dd79eb7..24936b3 100644 --- a/src/line.c +++ b/src/line.c @@ -66,7 +66,7 @@ char *irc_line_pop(struct line *l) void _irc_line_append(struct line *l, const char *s) { - array_push(&l->words, (char *)s); + array_push(&l->words, bip_strdup(s)); } void irc_line_append(struct line *l, const char *s) @@ -110,11 +110,14 @@ char *irc_line_to_string_to(struct line *line, char *nick) { char *tmp; char *l; + const char *prev; - tmp = (char *)irc_line_elem(line, 1); + prev = irc_line_elem(line, 1); + tmp = bip_strdup(prev); array_set(&line->words, 1, nick); l = irc_line_to_string(line); array_set(&line->words, 1, tmp); + bip_cfree(prev); return l; } @@ -136,7 +139,7 @@ const char *irc_line_elem(struct line *line, int elem) void irc_line_drop(struct line *line, int elem) { - free(array_drop(&line->words, elem)); + bip_cfree(array_drop(&line->words, elem)); } int irc_line_elem_equals(struct line *line, int elem, const char *cmp) @@ -214,7 +217,7 @@ void irc_line_free(struct line *l) int i; for (i = 0; i < array_count(&l->words); i++) - free(array_get(&l->words, i)); + bip_cfree(array_get(&l->words, i)); array_deinit(&l->words); if (l->origin) free(l->origin); diff --git a/src/log.c b/src/log.c index 52d4b37..3b1b2d5 100644 --- a/src/log.c +++ b/src/log.c @@ -642,7 +642,7 @@ void log_mode(log_t *logdata, const char *ircmask, const char *channel, if (mode_args) { for (i = 0; i < array_count(mode_args); i++) { snprintf(tmpbuf2, (size_t)LOGLINE_MAXLEN, "%s %s", tmpbuf, - (char *)array_get(mode_args, i)); + (const char*)array_get(mode_args, i)); tmp = tmpbuf; tmpbuf = tmpbuf2; tmpbuf2 = tmp; @@ -1408,7 +1408,7 @@ list_t *backlog_lines(log_t *log, const char *bl, const char *cli_nick, irc_line_init(&l); l.origin = P_IRCMASK; if (dest == cli_nick) - l.origin = (char *)bl; + l.origin = bip_strdup(bl); _irc_line_append(&l, "PRIVMSG"); _irc_line_append(&l, dest); _irc_line_append(&l, "End of backlog"); diff --git a/src/util.c b/src/util.c index 850faa9..85e16a2 100644 --- a/src/util.c +++ b/src/util.c @@ -77,6 +77,17 @@ void *bip_realloc(void *ptr, size_t size) return r; } +void bip_cfree(const void *ptr) +{ + if (!ptr) + return; +// there's no other way to free a const pointer +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" + free((void *)ptr); +#pragma GCC diagnostic pop +} + char *bip_strdup(const char *str) { char *r = strdup(str); @@ -862,10 +873,10 @@ void array_ensure(array_t *a, int index) a->elemc = index + 1; } -void *array_drop(array_t *a, int index) +const void *array_drop(array_t *a, int index) { int i; - void *ret; + const void *ret; assert(a && array_includes(a, index)); diff --git a/src/util.h b/src/util.h index 41d3cc5..3644ef0 100644 --- a/src/util.h +++ b/src/util.h @@ -71,7 +71,7 @@ typedef struct hash_iterator { typedef struct array { int elemc; - void **elemv; + const void **elemv; } array_t; #define MOVE_STRING(dest, src) do {\ @@ -178,12 +178,13 @@ char *checkmode2text(int v); void *bip_malloc(size_t size); void *bip_calloc(size_t nmemb, size_t size); void *bip_realloc(void *ptr, size_t size); +void bip_cfree(const void *ptr); char *bip_strdup(const char *str); char *bip_strcat_fit(size_t *remaining, char *str, const char *str2); char *bip_strcatf_fit(size_t *remaining, char *str, const char *str2, ...); void bip_clock_gettime(clockid_t clockid, struct timespec *tp); #define array_each(a, idx, ptr) for ((idx) = 0; \ - (idx) < (a)->elemc && (((ptr) = array_get((a), (idx))) || 1); \ + (idx) < (a)->elemc && (((ptr) = bip_strdup(array_get((a), (idx)))) || 1); \ (idx)++) void array_init(array_t *a); @@ -192,7 +193,7 @@ void array_ensure(array_t *a, int index); array_t *array_extract(array_t *a, int index, int upto); void array_deinit(array_t *a); void array_free(array_t *a); -void *array_drop(array_t *a, int index); +const void *array_drop(array_t *a, int index); static inline int array_count(array_t *a) { assert(a); @@ -212,7 +213,7 @@ static inline void array_set(array_t *a, int index, void *ptr) a->elemv[index] = ptr; } -static inline void *array_get(array_t *a, int index) +static inline const void *array_get(array_t *a, int index) { assert(a && array_includes(a, index)); return a->elemv[index]; @@ -234,13 +235,13 @@ static inline void *array_pop(array_t *a) if (a->elemc == 0) return NULL; if (a->elemc == 1) { - void *ptr = a->elemv[0]; + void *ptr = bip_strdup(a->elemv[0]); free(a->elemv); a->elemv = NULL; a->elemc = 0; return ptr; } - return a->elemv[--a->elemc]; + return (void *)bip_strdup(a->elemv[--a->elemc]); } #endif