diff --git a/src/system/helpers.cpp b/src/system/helpers.cpp index 4f057e3de..9cde3c9d8 100644 --- a/src/system/helpers.cpp +++ b/src/system/helpers.cpp @@ -402,12 +402,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] == '/') @@ -739,7 +762,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; } diff --git a/src/system/helpers.h b/src/system/helpers.h index bca3dc7ae..ad8858b40 100644 --- a/src/system/helpers.h +++ b/src/system/helpers.h @@ -46,6 +46,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);