libsheepy

C lib for handling text files, strings and json like data structure with an object oriented system
git clone https://spartatek.se/git/libsheepy.git
Log | Files | Refs | README | LICENSE

commit 666eb836ea7833c15fb8477a27fa59e3796c41a9
parent 39389e2993b1f1a629198a2e3b6dbde507201823
Author: Remy Noulin <loader2x@gmail.com>
Date:   Sun, 23 May 2021 21:38:59 +0200

fix issues found with Coverity

Most of the issues are in the out of memory code which is not tested in
the libsheepy tests

The other changes are making the code more correct

release/libsheepy.c                 | 9 +++++++++
src/json/libsheepyCClassTemplate.c  | 2 +-
src/json/libsheepyCSmallArray.c     | 2 +-
src/json/libsheepyCSmallBool.c      | 2 +-
src/json/libsheepyCSmallBytes.c     | 2 +-
src/json/libsheepyCSmallContainer.c | 2 +-
src/json/libsheepyCSmallDict.c      | 2 +-
src/json/libsheepyCSmallDouble.c    | 2 +-
src/json/libsheepyCSmallInt.c       | 2 +-
src/json/libsheepyCSmallJson.c      | 5 +++--
src/json/libsheepyCSmallString.c    | 2 +-
src/json/libsheepyCUndefined.c      | 2 +-
src/libsheepy.c                     | 9 +++++++++
13 files changed, 31 insertions(+), 12 deletions(-)

Diffstat:
Mrelease/libsheepy.c | 9+++++++++
Msrc/json/libsheepyCClassTemplate.c | 2+-
Msrc/json/libsheepyCSmallArray.c | 2+-
Msrc/json/libsheepyCSmallBool.c | 2+-
Msrc/json/libsheepyCSmallBytes.c | 2+-
Msrc/json/libsheepyCSmallContainer.c | 2+-
Msrc/json/libsheepyCSmallDict.c | 2+-
Msrc/json/libsheepyCSmallDouble.c | 2+-
Msrc/json/libsheepyCSmallInt.c | 2+-
Msrc/json/libsheepyCSmallJson.c | 5+++--
Msrc/json/libsheepyCSmallString.c | 2+-
Msrc/json/libsheepyCUndefined.c | 2+-
Msrc/libsheepy.c | 9+++++++++
13 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/release/libsheepy.c b/release/libsheepy.c @@ -6956,6 +6956,7 @@ char *formatS(const char *fmt, ...) { } va_start(pl, fmt); if (vasprintf(&r, fmt, pl) == -1) { + va_end(pl); return(NULL); } va_end(pl); @@ -50406,6 +50407,9 @@ char **listAppendS(char ***list1, char **list2) { r = REALLOC((*list1), (len1+len2+1) * sizeof(char *)); if (!r) { // realloc fails list1 not modified + if (freeL2Status) { + free(l2); + } return(NULL); } (*list1) = r; @@ -52622,6 +52626,7 @@ int commandfF(int line, const char *thisFunc, const char *thisFileName, const ch } va_start(pl, fmt); if (vasprintf(&cmd, fmt, pl) == -1) { + va_end(pl); return(-1); } va_end(pl); @@ -53303,6 +53308,9 @@ char **btrace(void) { } } + if (!symbols) { + goto end; + } // TODO sort and bin search symbols // convert addresses from backtrace_symbols to source code line numbers @@ -53369,6 +53377,7 @@ char **btrace(void) { } } + end: dArrayFree(&addresses); free(symbols); listFreeS(elf); diff --git a/src/json/libsheepyCClassTemplate.c b/src/json/libsheepyCClassTemplate.c @@ -112,7 +112,7 @@ internal void finishClassTemplate(classTemplatet **self) { #warning "NFreeStackCheck is available on x64/gcc/linux and BSD." register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallArray on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a classTemplate on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallArray.c b/src/json/libsheepyCSmallArray.c @@ -1553,7 +1553,7 @@ internal void finishSmallArray(smallArrayt **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallArray on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallArray on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallBool.c b/src/json/libsheepyCSmallBool.c @@ -312,7 +312,7 @@ internal void finishSmallBool(smallBoolt **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallBool on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallBool on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallBytes.c b/src/json/libsheepyCSmallBytes.c @@ -249,7 +249,7 @@ internal void finishSmallBytes(smallBytest **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallBytes on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallBytes on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallContainer.c b/src/json/libsheepyCSmallContainer.c @@ -196,7 +196,7 @@ internal void finishSmallContainer(smallContainert **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallContainer on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallContainer on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallDict.c b/src/json/libsheepyCSmallDict.c @@ -1094,7 +1094,7 @@ internal void finishSmallDict(smallDictt **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallDict on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallDict on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallDouble.c b/src/json/libsheepyCSmallDouble.c @@ -319,7 +319,7 @@ internal void finishSmallDouble(smallDoublet **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallDouble on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallDouble on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallInt.c b/src/json/libsheepyCSmallInt.c @@ -325,7 +325,7 @@ internal void finishSmallInt(smallIntt **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallInt on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallInt on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCSmallJson.c b/src/json/libsheepyCSmallJson.c @@ -2828,7 +2828,7 @@ internal void finishSmallJson(smallJsont **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallJson on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallJson on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { @@ -8331,6 +8331,7 @@ internal smallJsont* cropSmallJson(smallJsont *self, intmax_t start, intmax_t en // start < end < len l = malloc((n+1) * sizeof(char)); if (!l) { + terminateO(r); return(NULL); } char *string = sStringGetTiny(self->topS); @@ -14839,7 +14840,7 @@ internal char* keyBySmallContainerSmallJson(smallJsont *self, smallContainert *c return(NULL); } - if (!self || !container) { + if (!container) { return(NULL); } diff --git a/src/json/libsheepyCSmallString.c b/src/json/libsheepyCSmallString.c @@ -921,7 +921,7 @@ internal void finishSmallString(smallStringt **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a smallString on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a smallString on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/json/libsheepyCUndefined.c b/src/json/libsheepyCUndefined.c @@ -166,7 +166,7 @@ internal void finishUndefined(undefinedt **self) { register u64 rsp asm("rsp"); if ((u64)*self > rsp) { - logW("Probably trying to free a undefined on stack: "BLD"%p"RST" sp: "BLD"%p"RST, *self, rsp); + logW("Probably trying to free a undefined on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); logBtrace; } else { diff --git a/src/libsheepy.c b/src/libsheepy.c @@ -7012,6 +7012,7 @@ char *formatS(const char *fmt, ...) { } va_start(pl, fmt); if (vasprintf(&r, fmt, pl) == -1) { + va_end(pl); return(NULL); } va_end(pl); @@ -50462,6 +50463,9 @@ char **listAppendS(char ***list1, char **list2) { r = REALLOC((*list1), (len1+len2+1) * sizeof(char *)); if (!r) { // realloc fails list1 not modified + if (freeL2Status) { + free(l2); + } return(NULL); } (*list1) = r; @@ -52678,6 +52682,7 @@ int commandfF(int line, const char *thisFunc, const char *thisFileName, const ch } va_start(pl, fmt); if (vasprintf(&cmd, fmt, pl) == -1) { + va_end(pl); return(-1); } va_end(pl); @@ -53359,6 +53364,9 @@ char **btrace(void) { } } + if (!symbols) { + goto end; + } // TODO sort and bin search symbols // convert addresses from backtrace_symbols to source code line numbers @@ -53425,6 +53433,7 @@ char **btrace(void) { } } + end: dArrayFree(&addresses); free(symbols); listFreeS(elf);