From edb7fc727a29f4ae8dcd6fee02fb5c08286808c5 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 9 Mar 2017 13:25:33 +0000 Subject: [PATCH 09/26] common/strbuf.c: Use size_t and ssize_t. On 64 bit machines, strings can be longer than 2^32 characters. size_t or ssize_t should be used to handle all offsets and lengths of such strings to avoid overflow. This makes the fairly mechanical change int32_t -> ssize_t and uint32_t -> size_t. Signed-off-by: Richard W.M. Jones --- common/strbuf.c | 80 ++++++++++++++++++++++++++++----------------------------- common/strbuf.h | 50 ++++++++++++++++++------------------ 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/common/strbuf.c b/common/strbuf.c index 5c42873..cf90d5a 100644 --- a/common/strbuf.c +++ b/common/strbuf.c @@ -36,12 +36,12 @@ #define DEFAULT_STRBUF_CAPACITY 16 -#define SWAP_INT32(a,b) { int32_t _t = (a); (a) = (b); (b) = _t; } +#define SWAP_SSIZE_T(a,b) { ssize_t _t = (a); (a) = (b); (b) = _t; } -static int32_t -normalize_strbuf_pos(StrBuf *sb, int32_t pos) +static ssize_t +normalize_strbuf_pos(StrBuf *sb, ssize_t pos) { - if (pos >= sb->len) + if (pos >= (ssize_t) sb->len) return sb->len; if (pos >= 0) return pos; @@ -51,8 +51,8 @@ normalize_strbuf_pos(StrBuf *sb, int32_t pos) return 0; } -static int32_t -normalize_str_pos(const char *str, int32_t pos) +static ssize_t +normalize_str_pos(const char *str, ssize_t pos) { if (str == NULL) return 0; @@ -70,13 +70,13 @@ strbuf_buffer(StrBuf *sb) return sb->buf; } -uint32_t +size_t strbuf_length(StrBuf *sb) { return sb->len; } -uint32_t +size_t strbuf_capacity(StrBuf *sb) { return sb->capacity; @@ -89,7 +89,7 @@ strbuf_new(void) } StrBuf * -strbuf_new_with_capacity(uint32_t capacity) +strbuf_new_with_capacity(size_t capacity) { StrBuf *sb; sb = xmalloc(sizeof(StrBuf)); @@ -102,24 +102,24 @@ strbuf_new_with_capacity(uint32_t capacity) } StrBuf * -strbuf_new_from_char_n(uint32_t times, char ch) +strbuf_new_from_char_n(size_t times, char ch) { return strbuf_new_from_substring_n(times, &ch, 0, 1); } StrBuf * -strbuf_new_from_substring_n(uint32_t times, const char *substr, int32_t subsp, int32_t subep) +strbuf_new_from_substring_n(size_t times, const char *substr, ssize_t subsp, ssize_t subep) { subsp = normalize_str_pos(substr, subsp); subep = normalize_str_pos(substr, subep); if (subsp > subep) - SWAP_INT32(subsp, subep); + SWAP_SSIZE_T(subsp, subep); return strbuf_new_from_data_n(times, substr+subsp, subep-subsp); } StrBuf * -strbuf_new_from_data_n(uint32_t times, const void *mem, uint32_t len) +strbuf_new_from_data_n(size_t times, const void *mem, size_t len) { StrBuf *sb; @@ -133,7 +133,7 @@ strbuf_new_from_data_n(uint32_t times, const void *mem, uint32_t len) } StrBuf * -strbuf_newf_n(uint32_t times, const char *fmt, ...) +strbuf_newf_n(size_t times, const char *fmt, ...) { va_list ap; StrBuf *buf; @@ -146,7 +146,7 @@ strbuf_newf_n(uint32_t times, const char *fmt, ...) } StrBuf * -strbuf_vnewf_n(uint32_t times, const char *fmt, va_list ap) +strbuf_vnewf_n(size_t times, const char *fmt, va_list ap) { char *str; int len; @@ -171,7 +171,7 @@ strbuf_free(StrBuf *sb) } char * -strbuf_free_to_substring(StrBuf *sb, int32_t sp, int32_t ep) +strbuf_free_to_substring(StrBuf *sb, ssize_t sp, ssize_t ep) { char *buf; @@ -182,7 +182,7 @@ strbuf_free_to_substring(StrBuf *sb, int32_t sp, int32_t ep) sb->buf[ep-sp] = '\0'; /* Call realloc so that unused memory can be used for other purpose. */ - if (sp == 0 && ep == sb->len) + if (sp == 0 && ep == (ssize_t) sb->len) buf = sb->buf; else buf = xrealloc(sb->buf, ep-sp+1); @@ -191,21 +191,21 @@ strbuf_free_to_substring(StrBuf *sb, int32_t sp, int32_t ep) } void -strbuf_replace_char_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, char ch) +strbuf_replace_char_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, char ch) { strbuf_replace_substring_n(sb, sp, ep, times, &ch, 0, 1); } void -strbuf_replace_data_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const void *mem, uint32_t len) +strbuf_replace_data_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const void *mem, size_t len) { - uint32_t addlen; - uint32_t dellen; + size_t addlen; + size_t dellen; sp = normalize_strbuf_pos(sb, sp); ep = normalize_strbuf_pos(sb, ep); if (sp > ep) - SWAP_INT32(sp, ep); + SWAP_SSIZE_T(sp, ep); addlen = len * times; dellen = ep-sp; @@ -223,18 +223,18 @@ strbuf_replace_data_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const } void -strbuf_replace_substring_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *substr, int32_t subsp, int32_t subep) +strbuf_replace_substring_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const char *substr, ssize_t subsp, ssize_t subep) { subsp = normalize_str_pos(substr, subsp); subep = normalize_str_pos(substr, subep); if (subsp > subep) - SWAP_INT32(subsp, subep); + SWAP_SSIZE_T(subsp, subep); strbuf_replace_data_n(sb, sp, ep, times, substr+subsp, subep-subsp); } int -strbuf_replacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *fmt, ...) +strbuf_replacef_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const char *fmt, ...) { va_list ap; int len; @@ -247,7 +247,7 @@ strbuf_replacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char } int -strbuf_vreplacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *fmt, va_list ap) +strbuf_vreplacef_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const char *fmt, va_list ap) { char *str; int len; @@ -255,7 +255,7 @@ strbuf_vreplacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const cha sp = normalize_strbuf_pos(sb, sp); ep = normalize_strbuf_pos(sb, ep); if (sp > ep) - SWAP_INT32(sp, ep); + SWAP_SSIZE_T(sp, ep); len = vasprintf(&str, fmt, ap); if (len < 0) @@ -267,29 +267,29 @@ strbuf_vreplacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const cha } void -strbuf_reverse_substring(StrBuf *sb, int32_t sp, int32_t ep) +strbuf_reverse_substring(StrBuf *sb, ssize_t sp, ssize_t ep) { sp = normalize_strbuf_pos(sb, sp); ep = normalize_strbuf_pos(sb, ep); while (sp < ep) { - SWAP_INT32(sb->buf[sp], sb->buf[ep]); + SWAP_SSIZE_T(sb->buf[sp], sb->buf[ep]); sp++; ep--; } } void -strbuf_repeat_substring(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times) +strbuf_repeat_substring(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times) { - int32_t addlen; + ssize_t addlen; sp = normalize_strbuf_pos(sb, sp); ep = normalize_strbuf_pos(sb, ep); addlen = (ep-sp) * (times - 1); if (addlen != 0) { - uint32_t p; + size_t p; strbuf_ensure_capacity(sb, sb->len+1+addlen); memmove(sb->buf+sp+addlen, sb->buf+ep, sb->len+1-ep); @@ -304,7 +304,7 @@ strbuf_repeat_substring(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times) } void -strbuf_set_length(StrBuf *sb, uint32_t new_length) +strbuf_set_length(StrBuf *sb, size_t new_length) { strbuf_ensure_capacity(sb, new_length+1); sb->buf[new_length] = '\0'; @@ -313,7 +313,7 @@ strbuf_set_length(StrBuf *sb, uint32_t new_length) /* Note: The terminating null-byte counts as 1 in min_capacity */ void -strbuf_ensure_capacity(StrBuf *sb, uint32_t min_capacity) +strbuf_ensure_capacity(StrBuf *sb, size_t min_capacity) { if (min_capacity > sb->capacity) { sb->capacity = MAX(min_capacity, sb->len*2+2); /* MAX -> max */ @@ -324,14 +324,14 @@ strbuf_ensure_capacity(StrBuf *sb, uint32_t min_capacity) } char * -strbuf_substring(StrBuf *sb, int32_t sp, int32_t ep) +strbuf_substring(StrBuf *sb, ssize_t sp, ssize_t ep) { char *str; sp = normalize_strbuf_pos(sb, sp); ep = normalize_strbuf_pos(sb, ep); if (sp > ep) - SWAP_INT32(sp, ep); + SWAP_SSIZE_T(sp, ep); str = xmalloc((ep-sp+1) * sizeof(char)); memcpy(str, sb->buf+sp, (ep-sp+1) * sizeof(char)); @@ -341,14 +341,14 @@ strbuf_substring(StrBuf *sb, int32_t sp, int32_t ep) } char -strbuf_char_at(StrBuf *sb, int32_t sp) +strbuf_char_at(StrBuf *sb, ssize_t sp) { return sb->buf[normalize_strbuf_pos(sb, sp)]; } #if 0 char -strbuf_set_char_at(StrBuf *sb, int32_t sp, char chr) +strbuf_set_char_at(StrBuf *sb, ssize_t sp, char chr) { char old; @@ -364,13 +364,13 @@ strbuf_set_char_at(StrBuf *sb, int32_t sp, char chr) } void -strbuf_replace_strbuf(StrBuf *sb, int32_t sp, int32_t ep, StrBuf *strbuf) +strbuf_replace_strbuf(StrBuf *sb, ssize_t sp, ssize_t ep, StrBuf *strbuf) { strbuf_replace_data_n(sb,sp,ep,1,strbuf->buf,strbuf->len); } char -strbuf_delete_char(StrBuf *sb, int32_t sp) +strbuf_delete_char(StrBuf *sb, ssize_t sp) { } diff --git a/common/strbuf.h b/common/strbuf.h index 67a523d..6cd0d58 100644 --- a/common/strbuf.h +++ b/common/strbuf.h @@ -28,16 +28,16 @@ typedef struct _StrBuf StrBuf; struct _StrBuf { char *buf; - uint32_t len; - uint32_t capacity; + size_t len; + size_t capacity; }; void strbuf_free(StrBuf *sb); #define strbuf_free_to_string(sb) strbuf_free_to_substring(sb,0,-1) -char *strbuf_free_to_substring(StrBuf *sb, int32_t sp, int32_t ep); +char *strbuf_free_to_substring(StrBuf *sb, ssize_t sp, ssize_t ep); StrBuf *strbuf_new(void); -StrBuf *strbuf_new_with_capacity(uint32_t capacity); +StrBuf *strbuf_new_with_capacity(size_t capacity); #define strbuf_new_from_char(chr) strbuf_new_from_char_n(1,chr) #define strbuf_new_from_string(str) strbuf_new_from_substring(str,0,-1) @@ -46,12 +46,12 @@ StrBuf *strbuf_new_with_capacity(uint32_t capacity); #define strbuf_new_from_substring(str,ssp,sep) strbuf_new_from_substring_n(1,str,ssp,sep) #define strbuf_newf(fmt...) strbuf_newf_n(1,fmt) #define strbuf_vnewf(fmt,ap) strbuf_vnewf_n(1,fmt,ap) -StrBuf *strbuf_new_from_char_n(uint32_t times, char ch); +StrBuf *strbuf_new_from_char_n(size_t times, char ch); #define strbuf_new_from_string_n(n,str) strbuf_new_from_substring_n(n,str,0,-1) -StrBuf *strbuf_new_from_substring_n(uint32_t times, const char *str, int32_t sp, int32_t ep); -StrBuf *strbuf_new_from_data_n(uint32_t times, const void *mem, uint32_t len); -StrBuf *strbuf_newf_n(uint32_t times, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); -StrBuf *strbuf_vnewf_n(uint32_t times, const char *fmt, va_list ap) __attribute__ ((format (printf, 2, 0))); +StrBuf *strbuf_new_from_substring_n(size_t times, const char *str, ssize_t sp, ssize_t ep); +StrBuf *strbuf_new_from_data_n(size_t times, const void *mem, size_t len); +StrBuf *strbuf_newf_n(size_t times, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); +StrBuf *strbuf_vnewf_n(size_t times, const char *fmt, va_list ap) __attribute__ ((format (printf, 2, 0))); #define strbuf_append_char(sb,chr) strbuf_append_char_n(sb,1,chr) #define strbuf_append(sb,str) strbuf_append_n(sb,1,str) @@ -116,38 +116,38 @@ StrBuf *strbuf_vnewf_n(uint32_t times, const char *fmt, va_list ap) __attribute_ #define strbuf_replace_char(sb,sp,ep,ch) strbuf_replace_char_n(sb,sp,ep,1,ch) #define strbuf_replace(sb,sp,ep,str) strbuf_replace_n(sb,sp,ep,1,str) #define strbuf_replace_data(sb,sp,ep,mem,len) strbuf_replace_data_n(sb,sp,ep,1,mem,len) -void strbuf_replace_strbuf(StrBuf *sb, int32_t sp, int32_t ep, StrBuf *strbuf); /* or strbuf_replace_data_n(sb,sp,ep,1,strbuf_buffer(strbuf),strbuf_length(strbuf))*/ +void strbuf_replace_strbuf(StrBuf *sb, ssize_t sp, ssize_t ep, StrBuf *strbuf); /* or strbuf_replace_data_n(sb,sp,ep,1,strbuf_buffer(strbuf),strbuf_length(strbuf))*/ #define strbuf_replace_substring(sb,sp,ep,str,ssp,sep) strbuf_replace_substring_n(sb,sp,ep,1,str,ssp,sep) #define strbuf_replacef(sb,sp,ep,fmt...) strbuf_replacef_n(sb,sp,ep,1,fmt) #define strbuf_vreplacef(sb,sp,ep,fmt,ap) strbuf_vreplacef_n(sb,sp,ep,1,fmt,ap) -void strbuf_replace_char_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, char ch); +void strbuf_replace_char_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, char ch); #define strbuf_replace_n(sb,sp,ep,n,str) strbuf_replace_substring_n(sb,sp,ep,n,str,0,-1) -void strbuf_replace_substring_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *str, int32_t ssp, int32_t sep); -void strbuf_replace_data_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const void *mem, uint32_t len); -int strbuf_replacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *fmt, ...) __attribute__ ((format (printf, 5, 6))); -int strbuf_vreplacef_n(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times, const char *fmt, va_list ap) __attribute__ ((format (printf, 5, 0))); +void strbuf_replace_substring_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const char *str, ssize_t ssp, ssize_t sep); +void strbuf_replace_data_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const void *mem, size_t len); +int strbuf_replacef_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const char *fmt, ...) __attribute__ ((format (printf, 5, 6))); +int strbuf_vreplacef_n(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times, const char *fmt, va_list ap) __attribute__ ((format (printf, 5, 0))); -char strbuf_set_char_at(StrBuf *sb, int32_t sp, char chr); /* or strbuf_replace_char(sb,sp,strbuf_next_pos(sb,sp),chr) */ -char strbuf_delete_char(StrBuf *sb, int32_t sp); /* or strbuf_replace(sb,sp,strbuf_next_pos(sb,sp),NULL) */ +char strbuf_set_char_at(StrBuf *sb, ssize_t sp, char chr); /* or strbuf_replace_char(sb,sp,strbuf_next_pos(sb,sp),chr) */ +char strbuf_delete_char(StrBuf *sb, ssize_t sp); /* or strbuf_replace(sb,sp,strbuf_next_pos(sb,sp),NULL) */ #define strbuf_delete(sb,sp,ep) strbuf_replace(sb,sp,ep,NULL) #define strbuf_clear(sb) strbuf_replace(sb,0,-1,NULL) -void strbuf_reverse_substring(StrBuf *sb, int32_t sp, int32_t ep); +void strbuf_reverse_substring(StrBuf *sb, ssize_t sp, ssize_t ep); #define strbuf_reverse(sb) strbuf_reverse_substring(sb,0,-1) -void strbuf_repeat_substring(StrBuf *sb, int32_t sp, int32_t ep, uint32_t times); +void strbuf_repeat_substring(StrBuf *sb, ssize_t sp, ssize_t ep, size_t times); #define strbuf_repeat(sb,n) strbuf_repeat_substring(sb,0,-1,n) -uint32_t strbuf_length(StrBuf *sb); -uint32_t strbuf_capacity(StrBuf *sb); +size_t strbuf_length(StrBuf *sb); +size_t strbuf_capacity(StrBuf *sb); char *strbuf_buffer(StrBuf *sb); #define strbuf_is_empty(sb) (strbuf_length(sb) == 0) -void strbuf_set_length(StrBuf *sb, uint32_t new_length); -void strbuf_ensure_capacity(StrBuf *sb, uint32_t minimum_capacity); /* minimum_capacity should account for null-byte */ +void strbuf_set_length(StrBuf *sb, size_t new_length); +void strbuf_ensure_capacity(StrBuf *sb, size_t minimum_capacity); /* minimum_capacity should account for null-byte */ -char *strbuf_substring(StrBuf *sb, int32_t sp, int32_t ep); +char *strbuf_substring(StrBuf *sb, ssize_t sp, ssize_t ep); #define strbuf_to_string(sb) strbuf_substring(sb,0,-1) -char strbuf_char_at(StrBuf *sb, int32_t index); +char strbuf_char_at(StrBuf *sb, ssize_t index); #endif -- 2.10.2