From b5aeb71fa35ec52211729be2014566258097c927 Mon Sep 17 00:00:00 2001 From: pancake Date: Mon, 29 May 2023 11:04:32 +0200 Subject: [PATCH] Fix somw sign conversion bugs --- Makefile | 1 + config.mk | 1 + include/sdb/buffer.h | 8 +++--- include/sdb/ht.h | 2 +- include/sdb/rangstr.h | 16 +++++------ include/sdb/sdb.h | 42 ++++++++++++++--------------- include/sdb/types.h | 4 +-- src/array.c | 35 ++++++++++++------------ src/base64.c | 17 ++++++------ src/buffer.c | 13 +++++---- src/cdb.c | 18 ++++++++++--- src/cdb_make.c | 10 +++---- src/dict.c | 6 ++--- src/fmt.c | 4 +-- src/ht.inc | 4 +-- src/journal.c | 12 ++++----- src/json.c | 8 +++--- src/json/path.c | 2 +- src/json/rangstr.c | 10 +++---- src/sdb.c | 62 +++++++++++++++++++++---------------------- src/text.c | 5 ++-- src/util.c | 25 ++++++++--------- 22 files changed, 158 insertions(+), 147 deletions(-) diff --git a/Makefile b/Makefile index 4865b222..b2ec5e88 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,7 @@ heap: asan: $(MAKE) include/sdb/version.h CC=gcc LDFLAGS="$(CFLAGS_ASAN)" CFLAGS="$(CFLAGS_ASAN)" ${MAKE} -C src all + asantest: export ASAN_OPTIONS=detect_leaks=0 ; \ CC=gcc CFLAGS="$(CFLAGS_ASAN)" ${MAKE} -C test diff --git a/config.mk b/config.mk index 2d111416..682c2178 100644 --- a/config.mk +++ b/config.mk @@ -42,6 +42,7 @@ endif CFLAGS+=-Wall CFLAGS+=-fPIC CFLAGS+=-Wsign-compare +CFLAGS+=-Wsign-conversion # some old gcc doesnt support this # CFLAGS+=-Wmissing-field-initializers #CFLAGS+=-O3 diff --git a/include/sdb/buffer.h b/include/sdb/buffer.h index e56012d4..9329fbd8 100644 --- a/include/sdb/buffer.h +++ b/include/sdb/buffer.h @@ -21,12 +21,12 @@ typedef struct buffer { #define BUFFER_INSIZE 8192 #define BUFFER_OUTSIZE 8192 -void buffer_init(buffer *,BufferOp,int,char *,unsigned int); +void buffer_init(buffer *,BufferOp,int,char *,size_t); int buffer_flush(buffer *); -int buffer_put(buffer *,const char *,unsigned int); -int buffer_putalign(buffer *,const char *,unsigned int); -int buffer_putflush(buffer *,const char *,unsigned int); +int buffer_put(buffer *,const char *,size_t); +int buffer_putalign(buffer *,const char *,size_t); +int buffer_putflush(buffer *,const char *,size_t); #define buffer_PUTC(s,c) \ ( ((s)->n != (s)->p) \ diff --git a/include/sdb/ht.h b/include/sdb/ht.h index a2052de1..ab642c04 100644 --- a/include/sdb/ht.h +++ b/include/sdb/ht.h @@ -32,7 +32,7 @@ static inline ut32 sdbkv_value_len(const SdbKv *kv) { return kv->base.value_len; } -SDB_API SdbKv* sdbkv_new2(const char *k, int kl, const char *v, int vl); +SDB_API SdbKv* sdbkv_new2(const char *k, size_t kl, const char *v, size_t vl); SDB_API SdbKv* sdbkv_new(const char *k, const char *v); extern SDB_API void sdbkv_free(SdbKv *kv); diff --git a/include/sdb/rangstr.h b/include/sdb/rangstr.h index d50671ed..6ecc6050 100644 --- a/include/sdb/rangstr.h +++ b/include/sdb/rangstr.h @@ -14,16 +14,16 @@ typedef struct { } Rangstr; #if 1 -SDB_IPI void rangstr_print (Rangstr *s); -SDB_IPI Rangstr rangstr_new (const char *s); +SDB_IPI void rangstr_print(Rangstr *s); +SDB_IPI Rangstr rangstr_new(const char *s); SDB_IPI Rangstr rangstr_null(void); -SDB_IPI int rangstr_int (Rangstr *s); -SDB_IPI char *rangstr_dup (Rangstr *rs); +SDB_IPI int rangstr_int(Rangstr *s); +SDB_IPI char *rangstr_dup(Rangstr *rs); SDB_IPI Rangstr rangstr_news (const char *s, RangstrType *res, int i); -SDB_IPI int rangstr_cmp (Rangstr *a, Rangstr *b); -SDB_IPI const char *rangstr_str (Rangstr* rs); -SDB_IPI int rangstr_length (Rangstr* rs); -SDB_IPI int rangstr_find (Rangstr* rs, char ch); +SDB_IPI int rangstr_cmp(Rangstr *a, Rangstr *b); +SDB_IPI const char *rangstr_str(Rangstr* rs); +SDB_IPI size_t rangstr_length(Rangstr* rs); +SDB_IPI int rangstr_find(Rangstr* rs, char ch); #endif #endif diff --git a/include/sdb/sdb.h b/include/sdb/sdb.h index f9f74e7e..24bcd4d8 100644 --- a/include/sdb/sdb.h +++ b/include/sdb/sdb.h @@ -143,7 +143,7 @@ SDB_API int sdb_open(Sdb *s, const char *file); SDB_API int sdb_open_gperf(Sdb *s, SdbGperf *g); SDB_API void sdb_close(Sdb *s); -SDB_API void sdb_config(Sdb *s, int options); +SDB_API void sdb_config(Sdb *s, ut32 options); SDB_API bool sdb_free(Sdb* s); SDB_API void sdb_file(Sdb* s, const char *dir); SDB_API bool sdb_merge(Sdb* d, Sdb *s); @@ -173,9 +173,9 @@ SDB_API char *sdb_querysf(Sdb* s, char *buf, size_t buflen, const char *fmt, ... SDB_API int sdb_query_file(Sdb *s, const char* file); SDB_API bool sdb_exists(Sdb*, const char *key); SDB_API bool sdb_remove(Sdb*, const char *key, ut32 cas); -SDB_API int sdb_unset(Sdb*, const char *key, ut32 cas); -SDB_API int sdb_nunset(Sdb*, ut64 nkey, ut32 cas); -SDB_API int sdb_unset_like(Sdb *s, const char *k); +SDB_API ut32 sdb_unset(Sdb*, const char *key, ut32 cas); +SDB_API ut32 sdb_nunset(Sdb*, ut64 nkey, ut32 cas); +SDB_API bool sdb_unset_like(Sdb *s, const char *k); SDB_API char** sdb_like(Sdb *s, const char *k, const char *v, SdbForeachCallback cb); // diffing @@ -201,23 +201,23 @@ SDB_API char *sdb_nget(Sdb*, ut64 nkey, ut32 *cas); // Gets a pointer to the value associated with `key` and returns in `vlen` the // length of the value string. -SDB_API char *sdb_get_len(Sdb*, const char *key, int *vlen, ut32 *cas); +SDB_API char *sdb_get_len(Sdb*, const char *key, size_t *vlen, ut32 *cas); // Gets a const pointer to the value associated with `key` SDB_API const char *sdb_const_get(Sdb*, const char *key, ut32 *cas); // Gets a const pointer to the value associated with `key` and returns in // `vlen` the length of the value string. -SDB_API const char *sdb_const_get_len(Sdb* s, const char *key, int *vlen, ut32 *cas); -SDB_API int sdb_set(Sdb*, const char *key, const char *data, ut32 cas); -SDB_API int sdb_nset(Sdb*, ut64 nkey, const char *data, ut32 cas); +SDB_API const char *sdb_const_get_len(Sdb* s, const char *key, size_t *vlen, ut32 *cas); +SDB_API ut32 sdb_set(Sdb*, const char *key, const char *data, ut32 cas); +SDB_API ut32 sdb_nset(Sdb*, ut64 nkey, const char *data, ut32 cas); SDB_API ut64 sdb_num_nget(Sdb *s, ut64 nkey, ut32 *cas); SDB_API int sdb_num_nset(Sdb* s, ut64 nkey, ut64 nval, ut32 cas); -SDB_API int sdb_set_owned(Sdb* s, const char *key, char *val, ut32 cas); +SDB_API ut32 sdb_set_owned(Sdb* s, const char *key, char *val, ut32 cas); SDB_API int sdb_concat(Sdb *s, const char *key, const char *value, ut32 cas); SDB_API int sdb_uncat(Sdb *s, const char *key, const char *value, ut32 cas); -SDB_API int sdb_add(Sdb* s, const char *key, const char *val, ut32 cas); -SDB_API int sdb_nadd(Sdb* s, ut64 nkey, const char *val, ut32 cas); +SDB_API ut32 sdb_add(Sdb* s, const char *key, const char *val, ut32 cas); +SDB_API ut32 sdb_nadd(Sdb* s, ut64 nkey, const char *val, ut32 cas); SDB_API bool sdb_sync(Sdb*); SDB_API void sdbkv_free(SdbKv *kv); @@ -252,7 +252,7 @@ SDB_API bool sdb_text_check(Sdb *s, const char *file); /* iterate */ SDB_API void sdb_dump_begin(Sdb* s); SDB_API SdbKv *sdb_dump_next(Sdb* s); -SDB_API bool sdb_dump_dupnext(Sdb* s, char *key, char **value, int *_vlen); +SDB_API bool sdb_dump_dupnext(Sdb* s, char *key, char **value, ut32 *_vlen); /* journaling */ SDB_API bool sdb_journal_close(Sdb *s); @@ -280,7 +280,7 @@ SDB_API ut64 sdb_expire_get(Sdb* s, const char *key, ut32 *cas); SDB_API ut64 sdb_now(void); SDB_API ut64 sdb_unow(void); SDB_API ut32 sdb_hash(const char *key); -SDB_API ut32 sdb_hash_len(const char *key, ut32 *len); +SDB_API ut32 sdb_hash_len(const unsigned char *key, ut32 *len); SDB_API ut8 sdb_hash_byte(const char *s); /* json api */ @@ -322,18 +322,18 @@ SDB_API bool sdb_ns_unset(Sdb *s, const char *name, Sdb *r); SDB_API bool sdb_array_contains(Sdb* s, const char *key, const char *val, ut32 *cas); SDB_API bool sdb_array_contains_num(Sdb *s, const char *key, ut64 val, ut32 *cas); SDB_API int sdb_array_indexof(Sdb *s, const char *key, const char *val, ut32 cas); -SDB_API int sdb_array_set(Sdb* s, const char *key, int idx, const char *val, ut32 cas); -SDB_API int sdb_array_set_num(Sdb* s, const char *key, int idx, ut64 val, ut32 cas); +SDB_API ut32 sdb_array_set(Sdb* s, const char *key, int idx, const char *val, ut32 cas); +SDB_API ut32 sdb_array_set_num(Sdb* s, const char *key, int idx, ut64 val, ut32 cas); SDB_API bool sdb_array_append(Sdb *s, const char *key, const char *val, ut32 cas); SDB_API bool sdb_array_append_num(Sdb *s, const char *key, ut64 val, ut32 cas); SDB_API bool sdb_array_prepend(Sdb *s, const char *key, const char *val, ut32 cas); SDB_API bool sdb_array_prepend_num(Sdb *s, const char *key, ut64 val, ut32 cas); -SDB_API char *sdb_array_get(Sdb* s, const char *key, int idx, ut32 *cas); -SDB_API ut64 sdb_array_get_num(Sdb* s, const char *key, int idx, ut32 *cas); +SDB_API char *sdb_array_get(Sdb* s, const char *key, size_t idx, ut32 *cas); +SDB_API ut64 sdb_array_get_num(Sdb* s, const char *key, size_t idx, ut32 *cas); SDB_API int sdb_array_get_idx(Sdb *s, const char *key, const char *val, ut32 cas); // agetv -SDB_API int sdb_array_insert(Sdb* s, const char *key, int idx, const char *val, ut32 cas); -SDB_API int sdb_array_insert_num(Sdb* s, const char *key, int idx, ut64 val, ut32 cas); -SDB_API int sdb_array_unset(Sdb* s, const char *key, int n, ut32 cas); // leaves empty bucket +SDB_API ut32 sdb_array_insert(Sdb* s, const char *key, int idx, const char *val, ut32 cas); +SDB_API ut32 sdb_array_insert_num(Sdb* s, const char *key, int idx, ut64 val, ut32 cas); +SDB_API ut32 sdb_array_unset(Sdb* s, const char *key, int n, ut32 cas); // leaves empty bucket SDB_API int sdb_array_delete(Sdb* s, const char *key, int n, ut32 cas); SDB_API void sdb_array_sort(Sdb* s, const char *key, ut32 cas); SDB_API void sdb_array_sort_num(Sdb* s, const char *key, ut32 cas); @@ -360,7 +360,7 @@ SDB_API int sdb_array_remove_num(Sdb* s, const char *key, ut64 val, ut32 cas); // helpers SDB_API char *sdb_anext(char *str, char **next); SDB_API const char *sdb_const_anext(const char *str); -SDB_API int sdb_alen(const char *str); +SDB_API size_t sdb_alen(const char *str); SDB_API int sdb_alen_ignore_empty(const char *str); SDB_API int sdb_array_size(Sdb* s, const char *key); SDB_API int sdb_array_length(Sdb* s, const char *key); diff --git a/include/sdb/types.h b/include/sdb/types.h index 9b1fefdc..77e6509f 100644 --- a/include/sdb/types.h +++ b/include/sdb/types.h @@ -123,7 +123,7 @@ static inline int seek_set(int fd, off_t pos) { return ((fd == -1) || (lseek (fd, (off_t) pos, SEEK_SET) == -1))? 0:1; } -static inline void ut32_pack(char s[4], ut32 u) { +static inline void ut32_pack(unsigned char s[4], ut32 u) { s[0] = u & 255; u >>= 8; s[1] = u & 255; @@ -132,7 +132,7 @@ static inline void ut32_pack(char s[4], ut32 u) { s[3] = u >> 8; } -static inline void ut32_pack_big(char s[4], ut32 u) { +static inline void ut32_pack_big(unsigned char s[4], ut32 u) { s[3] = u & 255; u >>= 8; s[2] = u & 255; diff --git a/src/array.c b/src/array.c index e4570d1c..9c641ffb 100644 --- a/src/array.c +++ b/src/array.c @@ -8,8 +8,8 @@ // TODO: missing num_{inc/dec} functions -static const char *Aindexof(const char *str, int idx) { - int len = 0; +static const char *Aindexof(const char *str, size_t idx) { + size_t len = 0; const char *n, *p = str; for (len = 0; ; len++) { if (len == idx) { @@ -62,8 +62,8 @@ static inline int int_cmp(const void *a, const void *b) { return 0; } -SDB_API ut64 sdb_array_get_num(Sdb *s, const char *key, int idx, ut32 *cas) { - int i; +SDB_API ut64 sdb_array_get_num(Sdb *s, const char *key, size_t idx, ut32 *cas) { + size_t i; const char *n, *str = sdb_const_get (s, key, cas); if (!str || !*str) { return 0LL; @@ -80,16 +80,16 @@ SDB_API ut64 sdb_array_get_num(Sdb *s, const char *key, int idx, ut32 *cas) { return sdb_atoi (str); } -SDB_API char *sdb_array_get(Sdb *s, const char *key, int idx, ut32 *cas) { +SDB_API char *sdb_array_get(Sdb *s, const char *key, size_t idx, ut32 *cas) { const char *str = sdb_const_get (s, key, cas); const char *p = str; char *o, *n; - int i, len; + size_t i, len; if (!str || !*str) { return NULL; } if (idx < 0) { - int alen = sdb_alen (str); + size_t alen = sdb_alen (str); if (-idx > alen) { return NULL; } @@ -128,14 +128,14 @@ SDB_API char *sdb_array_get(Sdb *s, const char *key, int idx, ut32 *cas) { return NULL; } -SDB_API int sdb_array_insert_num(Sdb *s, const char *key, int idx, ut64 val, ut32 cas) { +SDB_API ut32 sdb_array_insert_num(Sdb *s, const char *key, int idx, ut64 val, ut32 cas) { char valstr[SDB_NUM_BUFSZ]; sdb_itoa (val, 0, valstr, sizeof (valstr)); return sdb_array_insert (s, key, idx, valstr, cas); } // TODO: done, but there's room for improvement -SDB_API int sdb_array_insert(Sdb *s, const char *key, int idx, const char *val, ut32 cas) { +SDB_API ut32 sdb_array_insert(Sdb *s, const char *key, int idx, const char *val, ut32 cas) { int lnstr, lstr; size_t lval; char *x, *ptr; @@ -199,7 +199,7 @@ SDB_API int sdb_array_insert(Sdb *s, const char *key, int idx, const char *val, return sdb_set_owned (s, key, x, cas); } -SDB_API int sdb_array_set_num(Sdb *s, const char *key, int idx, ut64 val, ut32 cas) { +SDB_API ut32 sdb_array_set_num(Sdb *s, const char *key, int idx, ut64 val, ut32 cas) { char valstr[SDB_NUM_BUFSZ]; sdb_itoa (val, 0, valstr, sizeof (valstr)); return sdb_array_set (s, key, idx, valstr, cas); @@ -300,7 +300,7 @@ SDB_API int sdb_array_add_sorted_num(Sdb *s, const char *key, ut64 val, ut32 cas return sdb_array_insert_num (s, key, n? i: -1, val, cas); } -SDB_API int sdb_array_unset(Sdb *s, const char *key, int idx, ut32 cas) { +SDB_API ut32 sdb_array_unset(Sdb *s, const char *key, int idx, ut32 cas) { return sdb_array_set (s, key, idx, "", cas); } @@ -338,9 +338,8 @@ SDB_API bool sdb_array_append_num(Sdb *s, const char *key, ut64 val, ut32 cas) { return sdb_array_set_num (s, key, -1, val, cas); } -SDB_API int sdb_array_set(Sdb *s, const char *key, int idx, const char *val, - ut32 cas) { - int lstr, lval, len; +SDB_API ut32 sdb_array_set(Sdb *s, const char *key, int idx, const char *val, ut32 cas) { + int lstr, lval; const char *usr, *str = sdb_const_get_len (s, key, &lstr, 0); char *ptr; @@ -348,7 +347,7 @@ SDB_API int sdb_array_set(Sdb *s, const char *key, int idx, const char *val, return sdb_set (s, key, val, cas); } // XXX: should we cache sdb_alen value inside kv? - len = sdb_alen (str); + size_t len = sdb_alen (str); lstr--; if (idx < 0 || idx == len) { // append return sdb_array_insert (s, key, -1, val, cas); @@ -484,7 +483,7 @@ SDB_API int sdb_array_delete(Sdb *s, const char *key, int idx, ut32 cas) { p[1] = 0; } sdb_set_owned (s, key, str, cas); - return 1; + return true; } // XXX Doesnt work if numbers are stored in different base @@ -643,7 +642,7 @@ SDB_API char *sdb_array_pop_tail(Sdb *s, const char *key, ut32 *cas) { SDB_API void sdb_array_sort(Sdb *s, const char *key, ut32 cas) { char *nstr, *str, **strs; - int lstr, j, i; + size_t lstr, j, i; str = sdb_get_len (s, key, &lstr, 0); if (!str) { return; @@ -690,7 +689,7 @@ SDB_API void sdb_array_sort_num(Sdb *s, const char *key, ut32 cas) { return; } - qsort (nums + 1, (int)*nums, sizeof (ut64), int_cmp); + qsort (nums + 1, (size_t)*nums, sizeof (ut64), int_cmp); nstr = (char *)sdb_gh_malloc (*nums + 1); if (!nstr) { diff --git a/src/base64.c b/src/base64.c index 758c6c5d..17ecf992 100644 --- a/src/base64.c +++ b/src/base64.c @@ -3,10 +3,10 @@ #include "sdb/sdb.h" #define SZ 1024 -static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq"; +static const ut8 cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const ut8 cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq"; -static void sdb_b64_encode(const ut8 in[3], char out[4], int len) { +static void sdb_b64_encode(const ut8 in[3], ut8 out[4], int len) { if (len < 1) { return; } @@ -16,7 +16,7 @@ static void sdb_b64_encode(const ut8 in[3], char out[4], int len) { out[3] = (len > 2 ? cb64[ in[2] & 0x3f ] : '='); } -static int sdb_b64_decode(const char in[4], ut8 out[3]) { +static int sdb_b64_decode(const ut8 in[4], ut8 out[3]) { int len = 3; ut8 i, v[4] = {0}; for (i = 0; i < 4; i++) { @@ -39,7 +39,7 @@ static int sdb_b64_decode(const char in[4], ut8 out[3]) { SDB_API void sdb_encode_raw(char *bout, const ut8 *bin, int len) { int in, out; for (in = out = 0; in < len; in += 3,out+=4) { - sdb_b64_encode (bin + in, bout + out, + sdb_b64_encode ((const ut8*)(bin + in), (ut8*)(bout + out), (len - in) > 3? 3: (len - in)); } bout[out] = 0; @@ -48,7 +48,7 @@ SDB_API void sdb_encode_raw(char *bout, const ut8 *bin, int len) { SDB_API int sdb_decode_raw(ut8 *bout, const char *bin, int len) { int in, out, ret; for (in = out = 0; in < len; in += 4) { - ret = sdb_b64_decode (bin + in, bout + out); + ret = sdb_b64_decode ((const ut8*)(bin + in), (ut8*)(bout + out)); if (ret < 1) { break; } @@ -79,14 +79,13 @@ SDB_API char *sdb_encode(const ut8 *bin, int len) { SDB_API ut8 *sdb_decode(const char *in, int *len) { ut8 *out; ut32 size; - int olen, ilen; if (len) { *len = 0; } if (!in) { return NULL; } - ilen = (int)strlen (in); + size_t ilen = strlen (in); if (!ilen) { return NULL; } @@ -98,7 +97,7 @@ SDB_API ut8 *sdb_decode(const char *in, int *len) { if (!out) { return NULL; } - olen = sdb_decode_raw (out, in, ilen); + int olen = sdb_decode_raw (out, in, ilen); if (!olen) { sdb_gh_free (out); return NULL; diff --git a/src/buffer.c b/src/buffer.c index 15cbcf11..4459ac7e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2,7 +2,7 @@ #include "sdb/buffer.h" -void buffer_init(buffer *s, BufferOp op, int fd, char *buf, ut32 len) { +void buffer_init(buffer *s, BufferOp op, int fd, char *buf, size_t len) { s->x = buf; s->fd = fd; s->op = op; @@ -10,10 +10,9 @@ void buffer_init(buffer *s, BufferOp op, int fd, char *buf, ut32 len) { s->n = len; } -static int allwrite(BufferOp op, int fd, const char *buf, ut32 len) { - ut32 w; +static int allwrite(BufferOp op, int fd, const char *buf, size_t len) { while (len > 0) { - w = op (fd, buf, len); + size_t w = op (fd, buf, len); if (w != len) { return 0; } @@ -24,7 +23,7 @@ static int allwrite(BufferOp op, int fd, const char *buf, ut32 len) { } int buffer_flush(buffer *s) { - int p = s->p; + size_t p = s->p; if (!p) { return 1; } @@ -32,7 +31,7 @@ int buffer_flush(buffer *s) { return allwrite (s->op, s->fd, s->x, p); } -int buffer_putalign(buffer *s, const char *buf, ut32 len) { +int buffer_putalign(buffer *s, const char *buf, size_t len) { ut32 n; if (!s || !s->x || !buf) { return 0; @@ -50,7 +49,7 @@ int buffer_putalign(buffer *s, const char *buf, ut32 len) { return 1; } -int buffer_putflush(buffer *s, const char *buf, ut32 len) { +int buffer_putflush(buffer *s, const char *buf, size_t len) { if (!buffer_flush (s)) { return 0; } diff --git a/src/cdb.c b/src/cdb.c index ebed3157..c96b423c 100644 --- a/src/cdb.c +++ b/src/cdb.c @@ -53,7 +53,12 @@ bool cdb_init(struct cdb *c, int fd) { cdb_findstart (c); if (fd != -1 && !fstat (fd, &st) && st.st_size > 4 && st.st_size != (off_t)UT64_MAX) { #if USE_MMAN - char *x = (char *)mmap (0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (st.st_size < 1) { + // invalid size + return false; + } + size_t st_size = (size_t)st.st_size; + char *x = (char *)mmap (0, st_size, PROT_READ, MAP_SHARED, fd, 0); if (x == MAP_FAILED) { // eprintf ("Cannot mmap %d\n", (int)st.st_size); return false; @@ -97,7 +102,11 @@ bool cdb_read(struct cdb *c, char *buf, ut32 len, ut32 pos) { return false; } while (len > 0) { - int r = (int)read (c->fd, buf, len); + ssize_t res = read (c->fd, buf, len); + if (res < 1) { + return false; + } + ut32 r = (size_t)res; if (r < 1 || (ut32)r != len) { return false; } @@ -111,7 +120,7 @@ static int match(struct cdb *c, const char *key, ut32 len, ut32 pos) { char buf[32]; const size_t szb = sizeof buf; while (len > 0) { - int n = (szb > len)? len: szb; + size_t n = (szb > len)? len: szb; if (!cdb_read (c, buf, n, pos)) { return -1; } @@ -125,6 +134,7 @@ static int match(struct cdb *c, const char *key, ut32 len, ut32 pos) { return 1; } +// returns [-1, 0, 1] int cdb_findnext(struct cdb *c, ut32 u, const char *key, ut32 len) { char buf[8]; ut32 pos; @@ -135,7 +145,7 @@ int cdb_findnext(struct cdb *c, ut32 u, const char *key, ut32 len) { } c->hslots = 0; if (!c->loop) { - const int bufsz = ((u + 1) & 0xFF) ? sizeof (buf) : sizeof (buf) / 2; + const size_t bufsz = ((u + 1) & 0xFF) ? sizeof (buf) : sizeof (buf) / 2; if (!cdb_read (c, buf, bufsz, (u << 2) & 1023)) { return -1; } diff --git a/src/cdb_make.c b/src/cdb_make.c index 5add7080..82e56414 100644 --- a/src/cdb_make.c +++ b/src/cdb_make.c @@ -122,8 +122,8 @@ int cdb_make_add(struct cdb_make *c, const char *key, ut32 keylen, const char *d } int cdb_make_finish(struct cdb_make *c) { - int i; - char buf[8]; + size_t i; + ut8 buf[8]; struct cdb_hp *hp; struct cdb_hplist *x, *n; ut32 len, u, memsize, count, where; @@ -144,7 +144,7 @@ int cdb_make_finish(struct cdb_make *c) { } for (x = c->head; x; x=x->next) { - i = x->num; + i = (size_t)x->num; while (i--) { c->split[--c->start[255 & x->hp[i].h]] = x->hp[i]; } @@ -153,7 +153,7 @@ int cdb_make_finish(struct cdb_make *c) { for (i = 0; i < 256; i++) { count = c->count[i]; len = count << 1; - ut32_pack (c->final + 4 * i, c->pos); + ut32_pack ((ut8*)(c->final + 4 * i), c->pos); for (u = 0; uhash[u].h = c->hash[u].p = 0; } @@ -170,7 +170,7 @@ int cdb_make_finish(struct cdb_make *c) { for (u = 0; u < len; u++) { ut32_pack (buf, c->hash[u].h); ut32_pack (buf + 4, c->hash[u].p); - if (!buffer_putalign (&c->b, buf, 8)) { + if (!buffer_putalign (&c->b, (const char *)buf, 8)) { return 0; } if (!incpos (c, 8)) { diff --git a/src/dict.c b/src/dict.c index eee8f469..c868509a 100644 --- a/src/dict.c +++ b/src/dict.c @@ -74,7 +74,7 @@ SDB_API bool dict_set(dict *m, dicti k, dicti v, void *u) { if (!m || !m->size || k == 0) { return false; } - const int bucket = dict_bucket (m, k); + const ut32 bucket = dict_bucket (m, k); dictkv *kv = (dictkv *)m->table[bucket]; if (!kv) { kv = (dictkv *)sdb_gh_calloc (sizeof (dictkv), 2); @@ -136,7 +136,7 @@ SDB_API dictkv *dict_getr(dict *m, dicti k) { if (!m->size) { return NULL; } - int bucket = dict_bucket (m, k); + const ut32 bucket = dict_bucket (m, k); dictkv *kv = (dictkv *)m->table[bucket]; if (kv) { while (kv->k != 0) { @@ -166,7 +166,7 @@ SDB_API bool dict_add(dict *m, dicti k, dicti v, void *u) { } SDB_API bool dict_del(dict *m, dicti k) { - int bucket = dict_bucket (m, k); + const ut32 bucket = dict_bucket (m, k); if (k == 0) { return false; } diff --git a/src/fmt.c b/src/fmt.c index 545de8fa..a65c68e8 100644 --- a/src/fmt.c +++ b/src/fmt.c @@ -6,7 +6,7 @@ // TODO: Add 'a' format for array of pointers null terminated?? // XXX SLOW CONCAT #define concat(x) if (x) { \ - int size = 2 + strlen (x? x: "")+(out? strlen (out) + 4: 0); \ + size_t size = (size_t)(2 + strlen (x? x: "")+(out? strlen (out) + 4: 0)); \ if (out) { \ char *o = (char *)sdb_gh_realloc (out, size); \ if (o) { \ @@ -159,7 +159,7 @@ SDB_API ut64* sdb_fmt_array_num(const char *list) { ut32 size; const char *next, *ptr = list; if (list && *list) { - ut32 len = (ut32) sdb_alen (list); + size_t len = sdb_alen (list); size = sizeof (ut64) * (len + 1); if (size < len) { return NULL; diff --git a/src/ht.inc b/src/ht.inc index f9c3f1f4..b0a9df4a 100644 --- a/src/ht.inc +++ b/src/ht.inc @@ -182,7 +182,7 @@ static void check_growing(HtName_(Ht) *ht) { } } -static HT_(Kv) *reserve_kv(HtName_(Ht) *ht, const KEY_TYPE key, const int key_len, bool update) { +static HT_(Kv) *reserve_kv(HtName_(Ht) *ht, const KEY_TYPE key, const ut32 key_len, bool update) { HT_(Bucket) *bt = &ht->table[bucketfn (ht, key)]; HT_(Kv) *kvtmp; ut32 j; @@ -264,7 +264,7 @@ SDB_API bool Ht_(update_key)(HtName_(Ht)* ht, const KEY_TYPE old_key, const KEY_ // Remove the old_key kv, paying attention to not double free the value HT_(Bucket) *bt = &ht->table[bucketfn (ht, old_key)]; - const int old_key_len = calcsize_key (ht, old_key); + const ut32 old_key_len = calcsize_key (ht, old_key); HT_(Kv) *kv; ut32 j; diff --git a/src/journal.c b/src/journal.c index 45cfa48e..f3adb695 100644 --- a/src/journal.c +++ b/src/journal.c @@ -48,7 +48,7 @@ SDB_API bool sdb_journal_open(Sdb *s) { // TODO boolify and save changes somewhere else? or just dont count that? SDB_API int sdb_journal_load(Sdb *s) { - int rr, sz, fd, changes = 0; + int fd, changes = 0; char *eq, *str, *cur, *ptr = NULL; if (!s) { return 0; @@ -57,7 +57,7 @@ SDB_API int sdb_journal_load(Sdb *s) { if (fd == -1) { return 0; } - sz = lseek (fd, 0, SEEK_END); + off_t sz = lseek (fd, 0, SEEK_END); if (sz < 1) { return 0; } @@ -66,7 +66,7 @@ SDB_API int sdb_journal_load(Sdb *s) { if (!str) { return 0; } - rr = read (fd, str, sz); + ssize_t rr = read (fd, str, sz); if (rr < 0) { sdb_gh_free (str); return 0; @@ -95,11 +95,11 @@ SDB_API bool sdb_journal_log(Sdb *s, const char *key, const char *val) { if (s->journal == -1) { return false; } - if (snprintf (str, sizeof (str), "%s=%s\n", key, val) < 0) { + if (snprintf (str, sizeof (str), "%s=%s\n", key, val) < 1) { return false; } - int len = strlen (str); - if (write (s->journal, str, len) != len) { + size_t len = strlen (str); + if (write (s->journal, str, len) != (ssize_t)len) { return false; } #if USE_MMAN diff --git a/src/json.c b/src/json.c index 2db8cf95..acc60660 100644 --- a/src/json.c +++ b/src/json.c @@ -185,7 +185,7 @@ SDB_API bool sdb_json_set(Sdb *s, const char *k, const char *p, const char *v, u if (*v) { int is_str = isstring (v); // 2 is the maximum amount of quotes that can be inserted - int msz = len[0] + len[1] + len[2] + strlen (v) + 2; + size_t msz = len[0] + len[1] + len[2] + strlen (v) + 2; if (msz < 1) { return false; } @@ -259,7 +259,7 @@ SDB_API bool sdb_json_set(Sdb *s, const char *k, const char *p, const char *v, u SDB_API const char *sdb_json_format(SdbJsonString *s, const char *fmt, ...) { char *arg_s, *x, tmp[128]; ut64 arg_l; - int i, arg_i; + size_t i, arg_i; double arg_f; va_list ap; #define JSONSTR_ALLOCATE(y)\ @@ -293,7 +293,7 @@ SDB_API const char *sdb_json_format(SdbJsonString *s, const char *fmt, ...) { switch (*fmt) { case 'b': JSONSTR_ALLOCATE (32); - arg_i = va_arg (ap, int); + arg_i = va_arg (ap, size_t); arg_i = arg_i? 4: 5; memcpy (s->buf + s->len, (arg_i == 4)? "true": "false", 5); s->len += arg_i; @@ -316,7 +316,7 @@ SDB_API const char *sdb_json_format(SdbJsonString *s, const char *fmt, ...) { case 'i': JSONSTR_ALLOCATE (32); arg_i = va_arg (ap, int); - snprintf (tmp, sizeof (tmp), "%d", arg_i); + snprintf (tmp, sizeof (tmp), "%d", (int)arg_i); memcpy (s->buf + s->len, tmp, strlen (tmp)); s->len += strlen (tmp); break; diff --git a/src/json/path.c b/src/json/path.c index 1d728838..ae463e79 100644 --- a/src/json/path.c +++ b/src/json/path.c @@ -19,7 +19,7 @@ SDB_IPI void json_path_first(Rangstr *s) { SDB_IPI int json_path_next(Rangstr *s) { int stop = '.'; - if (!s||!s->p||!s->p[s->t]) { + if (!s || !s->p || !s->p[s->t]) { return 0; } if (!s->next) { diff --git a/src/json/rangstr.c b/src/json/rangstr.c index 6536ad4d..2a249c05 100644 --- a/src/json/rangstr.c +++ b/src/json/rangstr.c @@ -26,9 +26,9 @@ SDB_IPI Rangstr rangstr_new(const char *s) { return rs; } -SDB_IPI int rangstr_length(Rangstr* rs) { +SDB_IPI size_t rangstr_length(Rangstr* rs) { if (rs->t > rs->f) { - return rs->t - rs->f; + return (size_t)(rs->t - rs->f); } return 0; } @@ -85,9 +85,9 @@ SDB_IPI Rangstr rangstr_news(const char *s, RangstrType *res, int i) { } SDB_IPI int rangstr_cmp(Rangstr *a, Rangstr *b) { - int la = a->t - a->f; - int lb = b->t - b->f; - int lbz = strlen (b->p + b->f); + size_t la = a->t - a->f; + size_t lb = b->t - b->f; + size_t lbz = strlen (b->p + b->f); if (lbz < lb) { lb = lbz; } diff --git a/src/sdb.c b/src/sdb.c index f7e744b6..dd1c2c78 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -18,7 +18,7 @@ static inline SdbKv *next_kv(HtPP *ht, SdbKv *kv) { (j) < (bt)->count; \ (j) = (count) == (ht)->count? j + 1: j, (kv) = (count) == (ht)->count? next_kv (ht, kv): kv, (count) = (ht)->count) -static inline int nextcas(SdbKv const *kv) { +static inline ut32 nextcas(SdbKv const *kv) { if (!kv->cas) { return 1; } @@ -214,7 +214,7 @@ SDB_API bool sdb_free(Sdb* s) { return false; } -SDB_API const char *sdb_const_get_len(Sdb* s, const char *key, int *vlen, ut32 *cas) { +SDB_API const char *sdb_const_get_len(Sdb* s, const char *key, size_t *vlen, ut32 *cas) { ut32 pos, len; ut64 now = 0LL; bool found; @@ -286,7 +286,7 @@ SDB_API const char *sdb_const_get(Sdb* s, const char *key, ut32 *cas) { // TODO: add sdb_getf? -SDB_API char *sdb_get_len(Sdb* s, const char *key, int *vlen, ut32 *cas) { +SDB_API char *sdb_get_len(Sdb* s, const char *key, size_t *vlen, ut32 *cas) { const char *value = sdb_const_get_len (s, key, vlen, cas); return value ? sdb_strdup (value) : NULL; } @@ -301,11 +301,11 @@ SDB_API char *sdb_nget(Sdb* s, ut64 nkey, ut32 *cas) { return sdb_get_len (s, key, NULL, cas); } -SDB_API int sdb_unset(Sdb* s, const char *key, ut32 cas) { +SDB_API ut32 sdb_unset(Sdb* s, const char *key, ut32 cas) { return key? sdb_set (s, key, "", cas): 0; } -SDB_API int sdb_nunset(Sdb* s, ut64 nkey, ut32 cas) { +SDB_API ut32 sdb_nunset(Sdb* s, ut64 nkey, ut32 cas) { return sdb_nset (s, nkey, "", cas); } @@ -318,7 +318,8 @@ SDB_API bool sdb_remove(Sdb *s, const char *key, ut32 cas) { SDB_API int sdb_uncat(Sdb *s, const char *key, const char *value, ut32 cas) { // remove 'value' from current key value. // TODO: cas is ignored here - int vlen = 0, valen; + size_t vlen = 0; + int valen; char *p, *v = sdb_get_len (s, key, &vlen, NULL); int mod = 0; if (!v || !key || !value) { @@ -362,14 +363,14 @@ SDB_API int sdb_concat(Sdb *s, const char *key, const char *value, ut32 cas) { } // set if not defined -SDB_API int sdb_add(Sdb* s, const char *key, const char *val, ut32 cas) { +SDB_API ut32 sdb_add(Sdb* s, const char *key, const char *val, ut32 cas) { if (sdb_exists (s, key)) { return 0; } return sdb_set (s, key, val, cas); } -SDB_API int sdb_nadd(Sdb* s, ut64 nkey, const char *val, ut32 cas) { +SDB_API ut32 sdb_nadd(Sdb* s, ut64 nkey, const char *val, ut32 cas) { char buf[SDB_NUM_BUFSZ]; const char *key = sdb_itoa (nkey, 16, buf, sizeof (buf)); return sdb_add (s, key, val, cas); @@ -442,7 +443,7 @@ SDB_API int sdb_open(Sdb *s, const char *file) { s->fd = -1; return -1; } - s->last = st.st_mtime; + s->last = (ut64)st.st_mtime; } if (s->fd != -1) { cdb_init (&s->db, s->fd); @@ -495,9 +496,9 @@ static bool match(const char *str, const char *expr) { if (startsWith) { return !strncmp (str, expr + 1, strlen (expr) - 1); } - if (endsWith) { - int alen = strlen (str); - int blen = strlen (expr) - 1; + if (endsWith && *expr) { + size_t alen = strlen (str); + size_t blen = strlen (expr) - 1; if (alen <= blen) { return false; } @@ -524,11 +525,7 @@ SDB_API bool sdbkv_match(SdbKv *kv, const char *expr) { return match (sdbkv_key (kv), expr); } -SDB_API SdbKv* sdbkv_new(const char *k, const char *v) { - return sdbkv_new2 (k, strlen (k), v, strlen (v)); -} - -SDB_API SdbKv* sdbkv_new2(const char *k, int kl, const char *v, int vl) { +SDB_API SdbKv* sdbkv_new2(const char *k, size_t kl, const char *v, size_t vl) { SdbKv *kv; if (v) { if (vl >= SDB_VSZ) { @@ -569,6 +566,10 @@ SDB_API SdbKv* sdbkv_new2(const char *k, int kl, const char *v, int vl) { return kv; } +SDB_API SdbKv* sdbkv_new(const char *k, const char *v) { + return sdbkv_new2 (k, strlen (k), v, strlen (v)); +} + SDB_API void sdbkv_free(SdbKv *kv) { if (kv) { sdb_gh_free (sdbkv_key (kv)); @@ -578,7 +579,6 @@ SDB_API void sdbkv_free(SdbKv *kv) { } static ut32 sdb_set_internal(Sdb* s, const char *key, char *val, bool owned, ut32 cas) { - ut32 vlen, klen; bool found; if (!s || !key) { return 0; @@ -591,8 +591,8 @@ static ut32 sdb_set_internal(Sdb* s, const char *key, char *val, bool owned, ut3 } } // XXX strlen computed twice.. because of check_*() - klen = strlen (key); - vlen = strlen (val); + ut32 klen = strlen (key); + ut32 vlen = strlen (val); if (klen >= SDB_KSZ || vlen >= SDB_VSZ) { if (owned) { sdb_gh_free (val); @@ -657,15 +657,15 @@ static ut32 sdb_set_internal(Sdb* s, const char *key, char *val, bool owned, ut3 return 0; } -SDB_API int sdb_set_owned(Sdb* s, const char *key, char *val, ut32 cas) { +SDB_API ut32 sdb_set_owned(Sdb* s, const char *key, char *val, ut32 cas) { return sdb_set_internal (s, key, val, true, cas); } -SDB_API int sdb_set(Sdb* s, const char *key, const char *val, ut32 cas) { +SDB_API ut32 sdb_set(Sdb* s, const char *key, const char *val, ut32 cas) { return sdb_set_internal (s, key, (char *)val, false, cas); } -SDB_API int sdb_nset(Sdb* s, ut64 nkey, const char *val, ut32 cas) { +SDB_API ut32 sdb_nset(Sdb* s, ut64 nkey, const char *val, ut32 cas) { char buf[SDB_NUM_BUFSZ]; const char *key = sdb_itoa (nkey, 16, buf, sizeof (buf)); return sdb_set_internal (s, key, (char *)val, false, cas); @@ -788,7 +788,7 @@ SDB_API SdbList *sdb_foreach_match(Sdb* s, const char *expr, bool single) { return list; } -static int getbytes(Sdb *s, char *b, int len) { +static int getbytes(Sdb *s, char *b, size_t len) { if (!cdb_read (&s->db, b, len, s->pos)) { return -1; } @@ -925,7 +925,7 @@ SDB_API void sdb_dump_begin(Sdb* s) { SDB_API SdbKv *sdb_dump_next(Sdb* s) { char *v = NULL; char k[SDB_MAX_KEY] = {0}; - int vl = 0; + ut32 vl = 0; // we dont need to malloc, because all values are null terminated in memory. if (!sdb_dump_dupnext (s, k, &v, &vl)) { return NULL; @@ -971,7 +971,7 @@ SDB_API bool sdb_stats(Sdb *s, ut32 *disk, ut32 *mem) { } // TODO: make it static? internal api? -SDB_API bool sdb_dump_dupnext(Sdb* s, char *key, char **value, int *_vlen) { +SDB_API bool sdb_dump_dupnext(Sdb* s, char *key, char **value, ut32 *_vlen) { ut32 vlen = 0, klen = 0; if (value) { *value = NULL; @@ -1135,7 +1135,7 @@ SDB_API void sdb_hook_free(Sdb *s) { s->hooks = NULL; } -SDB_API void sdb_config(Sdb *s, int options) { +SDB_API void sdb_config(Sdb *s, ut32 options) { s->options = options; if (options & SDB_OPTION_SYNC) { // sync on every query @@ -1200,7 +1200,7 @@ static bool unset_cb(void *user, const char *k, const char *v) { return true; } -SDB_API int sdb_unset_like(Sdb *s, const char *k) { +SDB_API bool sdb_unset_like(Sdb *s, const char *k) { UnsetCallbackData ucd = { s, k }; return sdb_foreach (s, unset_cb, &ucd); } @@ -1211,8 +1211,8 @@ typedef struct { const char *val; SdbForeachCallback cb; const char **array; - int array_index; - int array_size; + size_t array_index; + size_t array_size; } LikeCallbackData; static bool like_cb(void *user, const char *k, const char *v) { @@ -1240,7 +1240,7 @@ static bool like_cb(void *user, const char *k, const char *v) { lcd->array[idx + 1] = v; lcd->array[idx + 2] = NULL; lcd->array[idx + 3] = NULL; - lcd->array_index = idx+2; + lcd->array_index = (idx + 2); } else { if (lcd->cb) { lcd->cb (lcd->sdb, k, v); diff --git a/src/text.c b/src/text.c index 08225601..d20449d0 100644 --- a/src/text.c +++ b/src/text.c @@ -71,7 +71,8 @@ static int cmp_ns(const void *a, const void *b) { // flush a block of text that doesn't have to be escaped static bool escape_flush(int fd, const char *p, const char *n) { - if (p != n && write (fd, p, n - p) != n - p) { + const size_t len = (size_t)(n - p); + if (p != n && write (fd, p, len) != (ssize_t)len) { return false; } return true; @@ -464,7 +465,7 @@ SDB_API bool sdb_text_check(Sdb *s, const char *file) { close (fd); return false; } - int count = read (fd, buf, R_MIN (st.st_size, (off_t)sizeof (buf))); + ssize_t count = read (fd, buf, R_MIN ((size_t)st.st_size, (off_t)sizeof (buf))); close (fd); if (count < 1) { return false; diff --git a/src/util.c b/src/util.c index c9a9670c..8a54ad3a 100644 --- a/src/util.c +++ b/src/util.c @@ -62,7 +62,7 @@ SDB_API int gettimeofday(struct timeval* p, struct timezone * tz) { #endif #endif -SDB_API ut32 sdb_hash_len(const char *s, ut32 *len) { +SDB_API ut32 sdb_hash_len(const ut8 *s, ut32 *len) { ut32 h = CDB_HASHSTART; #if FORCE_COLLISION h = 0; @@ -86,11 +86,11 @@ SDB_API ut32 sdb_hash_len(const char *s, ut32 *len) { } SDB_API ut32 sdb_hash(const char *s) { - return sdb_hash_len (s, NULL); + return sdb_hash_len ((const ut8*)s, NULL); } SDB_API ut8 sdb_hash_byte(const char *s) { - const ut32 hash = sdb_hash_len (s, NULL); + const ut32 hash = sdb_hash_len ((const ut8*)s, NULL); const ut8 *h = (const ut8*)&hash; return h[0] ^ h[1] ^ h[2] ^ h[3]; } @@ -131,13 +131,14 @@ SDB_API char *sdb_itoa(ut64 n, int base, char *os, int oslen) { return os; } s[imax + 1] = '\0'; + const unsigned ubase = (unsigned)base; if (base <= 10) { - for (; n && i > 0; n /= base) { - s[i--] = (n % base) + '0'; + for (; n && i > 0; n /= ubase) { + s[i--] = (n % ubase) + '0'; } } else { - for (; n && i > 0; n /= base) { - s[i--] = lookup[(n % base)]; + for (; n && i > 0; n /= ubase) { + s[i--] = lookup[(n % ubase)]; } if (i != imax) { s[i--] = 'x'; @@ -224,8 +225,8 @@ SDB_API char *sdb_aslice(char *out, int from, int to) { // TODO: find better name for it // TODO: optimize, because this is the main bottleneck for sdb_array_set() -SDB_API int sdb_alen(const char *str) { - int len = 1; +SDB_API size_t sdb_alen(const char *str) { + size_t len = 1; const char *n, *p = str; if (!p|| !*p) { return 0; @@ -294,7 +295,7 @@ SDB_API ut64 sdb_now (void) { #else struct timeval now; if (!gettimeofday (&now, NULL)) { - return now.tv_sec; + return (ut64)now.tv_sec; } #endif return 0LL; @@ -312,9 +313,9 @@ SDB_API ut64 sdb_unow (void) { #else struct timeval now; if (!gettimeofday (&now, NULL)) { - x = now.tv_sec; + x = (ut64)now.tv_sec; x <<= 32; - x += now.tv_usec; + x += (ut64)now.tv_usec; } #endif return x;