helpers.cpp: introduce safe_strncpy() and use it

This commit is contained in:
GetAway
2019-06-18 19:37:11 +02:00
parent 305af3116e
commit 672959e68f
2 changed files with 27 additions and 3 deletions

View File

@@ -272,12 +272,35 @@ int mkdirhier(const char *pathname, mode_t mode)
}
# endif
/* This function is a replacement which makes sure that a \0 is always added,
cuz standard strncpy does not terminate the string if the source is exactly
as long or longer as the specified size. This can raise security issues.
num should be the real size of char array (do not subtract -1)
*/
void safe_strncpy(char *dest, const char *src, size_t num)
{
if(!src)
{
dest[0] = '\0';
return;
}
uint32_t l, size = strlen(src);
if(size > num - 1)
l = num - 1;
else
l = size;
memcpy(dest, src, l);
dest[l] = '\0';
}
int safe_mkdir(const char * path)
{
struct statfs s;
size_t l = strlen(path);
char d[l + 3];
strncpy(d, path, l);
char d[l];
safe_strncpy(d, path, l);
// skip trailing slashes
while (l > 0 && d[l - 1] == '/')
@@ -609,7 +632,7 @@ const char *cstr_replace(const char *search, const char *replace, const char *te
tmp = strncpy(tmp, replace, len_replace) + len_replace;
text += len_front + len_search; // move to next "end of search"
}
strncpy(tmp, text, strlen(text));
safe_strncpy(tmp, text, strlen(text));
return result;
}

View File

@@ -44,6 +44,7 @@ int my_system(int argc, const char *arg, ...); /* argc is number of arguments in
FILE* my_popen( pid_t& pid, const char *cmdstring, const char *type);
int run_pty(pid_t &pid, const char *cmdstring);
void safe_strncpy(char *dest, const char *src, size_t num);
int safe_mkdir(const char * path);
inline int safe_mkdir(std::string path) { return safe_mkdir(path.c_str()); }
//int mkdirhier(const char *pathname, mode_t mode = 0755);