Fix vis family of functions to not leak The code uses an internal helper function to avoid code repetition. But to get there, the function takes a pointer to a pointer, so that the few functions that require returning an allocated buffer can get hold of it this way. The problem is that the user might pass a NULL pointer and trigger an internal allocation even if the functions are not expected to do so. Add a new internal helper for non-allocations, that will assert that condition, and make any other function that requires this behavior call this one instead. Warned-by: coverity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
diff --git a/src/vis.c b/src/vis.c
index c2cd2d8..f17d322 100644
--- a/src/vis.c
+++ b/src/vis.c
@@ -580,10 +580,20 @@ out:
}
static int
-istrsenvisxl(char **mbdstp, size_t *dlen, const char *mbsrc,
+istrsenvisxna(char *mbdst, size_t *dlen, const char *mbsrc, size_t mblength,
int flags, const char *mbextra, int *cerr_ptr)
{
- return istrsenvisx(mbdstp, dlen, mbsrc,
+ assert(mbdst != NULL);
+
+ return istrsenvisx(&mbdst, dlen, mbsrc, mblength,
+ flags, mbextra, cerr_ptr);
+}
+
+static int
+istrsenvisxl(char *mbdst, size_t *dlen, const char *mbsrc,
+ int flags, const char *mbextra, int *cerr_ptr)
+{
+ return istrsenvisxna(mbdst, dlen, mbsrc,
mbsrc != NULL ? strlen(mbsrc) : 0, flags, mbextra, cerr_ptr);
}
@@ -628,33 +638,33 @@ snvis(char *mbdst, size_t dlen, int c, int flags, int nextc, const char *mbextra
int
strsvis(char *mbdst, const char *mbsrc, int flags, const char *mbextra)
{
- return istrsenvisxl(&mbdst, NULL, mbsrc, flags, mbextra, NULL);
+ return istrsenvisxl(mbdst, NULL, mbsrc, flags, mbextra, NULL);
}
int
strsnvis(char *mbdst, size_t dlen, const char *mbsrc, int flags, const char *mbextra)
{
- return istrsenvisxl(&mbdst, &dlen, mbsrc, flags, mbextra, NULL);
+ return istrsenvisxl(mbdst, &dlen, mbsrc, flags, mbextra, NULL);
}
int
strsvisx(char *mbdst, const char *mbsrc, size_t len, int flags, const char *mbextra)
{
- return istrsenvisx(&mbdst, NULL, mbsrc, len, flags, mbextra, NULL);
+ return istrsenvisxna(mbdst, NULL, mbsrc, len, flags, mbextra, NULL);
}
int
strsnvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags,
const char *mbextra)
{
- return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, mbextra, NULL);
+ return istrsenvisxna(mbdst, &dlen, mbsrc, len, flags, mbextra, NULL);
}
int
strsenvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags,
const char *mbextra, int *cerr_ptr)
{
- return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, mbextra, cerr_ptr);
+ return istrsenvisxna(mbdst, &dlen, mbsrc, len, flags, mbextra, cerr_ptr);
}
/*
@@ -701,7 +711,7 @@ nvis(char *mbdst, size_t dlen, int c, int flags, int nextc)
int
strvis(char *mbdst, const char *mbsrc, int flags)
{
- return istrsenvisxl(&mbdst, NULL, mbsrc, flags, "", NULL);
+ return istrsenvisxl(mbdst, NULL, mbsrc, flags, "", NULL);
}
/*
@@ -721,14 +731,14 @@ strvis(char *mbdst, const char *mbsrc, int flags)
int
strnvis_openbsd(char *mbdst, const char *mbsrc, size_t dlen, int flags)
{
- return istrsenvisxl(&mbdst, &dlen, mbsrc, flags, "", NULL);
+ return istrsenvisxl(mbdst, &dlen, mbsrc, flags, "", NULL);
}
__asm__(".symver strnvis_openbsd,strnvis@@LIBBSD_0.2");
int
strnvis_netbsd(char *mbdst, size_t dlen, const char *mbsrc, int flags)
{
- return istrsenvisxl(&mbdst, &dlen, mbsrc, flags, "", NULL);
+ return istrsenvisxl(mbdst, &dlen, mbsrc, flags, "", NULL);
}
__asm__(".symver strnvis_netbsd,strnvis@LIBBSD_0.9.1");
@@ -736,7 +746,8 @@ int
stravis(char **mbdstp, const char *mbsrc, int flags)
{
*mbdstp = NULL;
- return istrsenvisxl(mbdstp, NULL, mbsrc, flags, "", NULL);
+ return istrsenvisx(mbdstp, NULL, mbsrc,
+ mbsrc != NULL ? strlen(mbsrc) : 0, flags, "", NULL);
}
/*
@@ -753,18 +764,18 @@ stravis(char **mbdstp, const char *mbsrc, int flags)
int
strvisx(char *mbdst, const char *mbsrc, size_t len, int flags)
{
- return istrsenvisx(&mbdst, NULL, mbsrc, len, flags, "", NULL);
+ return istrsenvisxna(mbdst, NULL, mbsrc, len, flags, "", NULL);
}
int
strnvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags)
{
- return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, "", NULL);
+ return istrsenvisxna(mbdst, &dlen, mbsrc, len, flags, "", NULL);
}
int
strenvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags,
int *cerr_ptr)
{
- return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, "", cerr_ptr);
+ return istrsenvisxna(mbdst, &dlen, mbsrc, len, flags, "", cerr_ptr);
}