X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Futils.cpp;h=b4b7f749f1ef1a6e5286225437f639d01f2966d2;hb=f4d2c26adb8b6d18a62ca6d35e3a0529ff8a87b5;hp=410f8ec872e92de06da8171a10df72257372be9b;hpb=c922647daed3dd022be11980063b5fb816d8c091;p=lttng-tools.git diff --git a/src/common/utils.cpp b/src/common/utils.cpp index 410f8ec87..b4b7f749f 100644 --- a/src/common/utils.cpp +++ b/src/common/utils.cpp @@ -6,35 +6,33 @@ * */ -#include "common/macros.h" #define _LGPL_SOURCE #include #include +#include +#include #include +#include #include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include "utils.h" -#include "defaults.h" -#include "time.h" +#include "defaults.hpp" +#include "time.hpp" +#include "utils.hpp" #define PROC_MEMINFO_PATH "/proc/meminfo" #define PROC_MEMINFO_MEMAVAILABLE_LINE "MemAvailable:" @@ -173,9 +171,8 @@ void utils_close_pipe(int *src) */ char *utils_strdupdelim(const char *begin, const char *end) { - char *str; + char *str = zmalloc(end - begin + 1); - str = (char *) zmalloc(end - begin + 1); if (str == NULL) { PERROR("zmalloc strdupdelim"); goto error; @@ -786,7 +783,7 @@ char *utils_get_user_home_dir(uid_t uid) goto end; } retry: - buf = (char *) zmalloc(buflen); + buf = zmalloc(buflen); if (!buf) { goto end; } @@ -936,7 +933,7 @@ char *utils_generate_optstring(const struct option *long_options, string_len += long_options[i].has_arg ? 1 : 0; } - optstring = (char *) zmalloc(string_len); + optstring = zmalloc(string_len); if (!optstring) { goto end; } @@ -1041,7 +1038,7 @@ end: } static -int read_proc_meminfo_field(const char *field, size_t *value) +int read_proc_meminfo_field(const char *field, uint64_t *value) { int ret; FILE *proc_meminfo; @@ -1059,10 +1056,10 @@ int read_proc_meminfo_field(const char *field, size_t *value) * field. */ while (!feof(proc_meminfo)) { - unsigned long value_kb; + uint64_t value_kb; ret = fscanf(proc_meminfo, - "%" MAX_NAME_LEN_SCANF_IS_A_BROKEN_API "s %lu kB\n", + "%" MAX_NAME_LEN_SCANF_IS_A_BROKEN_API "s %" SCNu64 " kB\n", name, &value_kb); if (ret == EOF) { /* @@ -1079,7 +1076,12 @@ int read_proc_meminfo_field(const char *field, size_t *value) * This number is displayed in kilo-bytes. Return the * number of bytes. */ - *value = ((size_t) value_kb) * 1024; + if (value_kb > UINT64_MAX / 1024) { + ERR("Overflow on kb to bytes conversion"); + break; + } + + *value = value_kb * 1024; ret = 0; goto found; } @@ -1098,7 +1100,7 @@ fopen_error: * the information in `/proc/meminfo`. The number returned by this function is * a best guess. */ -int utils_get_memory_available(size_t *value) +int utils_get_memory_available(uint64_t *value) { return read_proc_meminfo_field(PROC_MEMINFO_MEMAVAILABLE_LINE, value); } @@ -1107,7 +1109,7 @@ int utils_get_memory_available(size_t *value) * Returns the total size of the memory on the system in bytes based on the * the information in `/proc/meminfo`. */ -int utils_get_memory_total(size_t *value) +int utils_get_memory_total(uint64_t *value) { return read_proc_meminfo_field(PROC_MEMINFO_MEMTOTAL_LINE, value); } @@ -1156,7 +1158,7 @@ enum lttng_error_code utils_user_id_from_name(const char *user_name, uid_t *uid) buflen = FALLBACK_USER_BUFLEN; } - buf = (char *) zmalloc(buflen); + buf = zmalloc(buflen); if (!buf) { ret_val = LTTNG_ERR_NOMEM; goto end; @@ -1170,7 +1172,7 @@ enum lttng_error_code utils_user_id_from_name(const char *user_name, uid_t *uid) case ERANGE: buflen *= 2; free(buf); - buf = (char *) zmalloc(buflen); + buf = zmalloc(buflen); if (!buf) { ret_val = LTTNG_ERR_NOMEM; goto end; @@ -1221,7 +1223,7 @@ enum lttng_error_code utils_group_id_from_name( buflen = FALLBACK_GROUP_BUFLEN; } - buf = (char *) zmalloc(buflen); + buf = zmalloc(buflen); if (!buf) { ret_val = LTTNG_ERR_NOMEM; goto end; @@ -1235,7 +1237,7 @@ enum lttng_error_code utils_group_id_from_name( case ERANGE: buflen *= 2; free(buf); - buf = (char *) zmalloc(buflen); + buf = zmalloc(buflen); if (!buf) { ret_val = LTTNG_ERR_NOMEM; goto end;