Skip to content

Commit

Permalink
Fix somw sign conversion bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
radare committed May 29, 2023
1 parent ab05039 commit b5aeb71
Show file tree
Hide file tree
Showing 22 changed files with 158 additions and 147 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions config.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions include/sdb/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
2 changes: 1 addition & 1 deletion include/sdb/ht.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
16 changes: 8 additions & 8 deletions include/sdb/rangstr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
42 changes: 21 additions & 21 deletions include/sdb/sdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions include/sdb/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
35 changes: 17 additions & 18 deletions src/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -338,17 +338,16 @@ 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;

if (!str || !*str) {
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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
17 changes: 8 additions & 9 deletions src/base64.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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++) {
Expand All @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down
Loading

0 comments on commit b5aeb71

Please sign in to comment.