[warnings] fix integer casting

* use asserting casts to detect overflows or sign conversions
* code cleanup for issues uncovered by casts
This commit is contained in:
akallabeth
2024-12-19 14:45:06 +01:00
parent 7e44c7ca41
commit cc934795e4
127 changed files with 2356 additions and 1951 deletions

View File

@@ -453,7 +453,7 @@ static BOOL freerdp_assistance_parse_attr(const char** opt, size_t* plength, con
key);
return FALSE;
}
const size_t length = q - p;
const size_t length = WINPR_ASSERTING_INT_CAST(size_t, q - p);
*opt = p;
*plength = length;
@@ -498,13 +498,15 @@ static BOOL freerdp_assistance_parse_attr_uint32(UINT32* opt, const char* key, c
return FALSE;
char buffer[64] = { 0 };
if (size >= sizeof(buffer))
if ((!copt && (size > 0)) || (size >= sizeof(buffer)))
{
WLog_WARN(TAG, "Invalid UINT32 string '%s' [%" PRIuz "]", copt, size);
return FALSE;
}
strncpy(buffer, copt, size);
if (size > 0)
strncpy(buffer, copt, size);
errno = 0;
unsigned long val = strtoul(buffer, NULL, 0);
@@ -573,7 +575,7 @@ static char* freerdp_assistance_contains_element(char* input, size_t ilen, const
WINPR_ASSERT((size_t)erc < sizeof(ekey));
if ((erc <= 0) || ((size_t)erc >= sizeof(ekey)))
return NULL;
const size_t offset = start - tag;
const size_t offset = WINPR_ASSERTING_INT_CAST(size_t, start - tag);
dend = end = strrstr(start, ilen - offset, ekey);
if (end)
end += strnlen(ekey, sizeof(ekey));
@@ -587,12 +589,12 @@ static char* freerdp_assistance_contains_element(char* input, size_t ilen, const
return NULL;
}
if (plen)
*plen = end - tag;
*plen = WINPR_ASSERTING_INT_CAST(size_t, end - tag);
if (pdata)
*pdata = data;
if (pdlen)
*pdlen = dend - data;
*pdlen = WINPR_ASSERTING_INT_CAST(size_t, dend - data);
return tag;
}
@@ -644,7 +646,7 @@ static BOOL freerdp_assistance_get_element(char* input, size_t ilen, const char*
char* end = tag + len;
*element = data;
*elen = end - data + 1;
*elen = WINPR_ASSERTING_INT_CAST(size_t, end - data + 1);
return TRUE;
}

View File

@@ -29,6 +29,7 @@
#include <winpr/crt.h>
#include <winpr/assert.h>
#include <winpr/cast.h>
#include "../core/settings.h"
#include "../core/capabilities.h"
@@ -51,7 +52,8 @@ BOOL freerdp_addin_argv_add_argument_ex(ADDIN_ARGV* args, const char* argument,
if (len == 0)
len = strlen(argument);
new_argv = (char**)realloc((void*)args->argv, sizeof(char*) * (args->argc + 1));
new_argv = (char**)realloc(
(void*)args->argv, sizeof(char*) * (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc) + 1));
if (!new_argv)
return FALSE;
@@ -81,8 +83,10 @@ BOOL freerdp_addin_argv_del_argument(ADDIN_ARGV* args, const char* argument)
if (strcmp(argument, arg) == 0)
{
free(arg);
memmove_s((void*)&args->argv[x], (args->argc - x) * sizeof(char*),
(void*)&args->argv[x + 1], (args->argc - x - 1) * sizeof(char*));
memmove_s((void*)&args->argv[x],
(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x)) * sizeof(char*),
(void*)&args->argv[x + 1],
(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x - 1)) * sizeof(char*));
args->argv[args->argc - 1] = NULL;
args->argc--;
return TRUE;
@@ -154,7 +158,8 @@ int freerdp_addin_set_argument_value(ADDIN_ARGV* args, const char* option, const
if (p)
{
if (strncmp(args->argv[i], option, p - args->argv[i]) == 0)
if (strncmp(args->argv[i], option,
WINPR_ASSERTING_INT_CAST(size_t, p - args->argv[i])) == 0)
{
free(args->argv[i]);
args->argv[i] = str;
@@ -829,7 +834,7 @@ ADDIN_ARGV* freerdp_addin_argv_clone(const ADDIN_ARGV* args)
if (!args)
return NULL;
cnv.c = args->argv;
return freerdp_addin_argv_new(args->argc, cnv.cc);
return freerdp_addin_argv_new(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc), cnv.cc);
}
void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
@@ -1780,7 +1785,7 @@ BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, FreeRDP_Settings_
goto fail;
if ((offset >= maxOffset) || !data)
goto fail;
settings->OrderSupport[offset] = *(const BOOL*)data;
settings->OrderSupport[offset] = *(const BOOL*)data ? 1 : 0;
return TRUE;
case FreeRDP_GlyphCache:
maxOffset = 10;
@@ -1846,11 +1851,11 @@ UINT32 freerdp_settings_get_codecs_flags(const rdpSettings* settings)
UINT32 flags = FREERDP_CODEC_ALL;
if (settings->RemoteFxCodec == FALSE)
{
flags &= ~FREERDP_CODEC_REMOTEFX;
flags &= (uint32_t)~FREERDP_CODEC_REMOTEFX;
}
if (settings->NSCodec == FALSE)
{
flags &= ~FREERDP_CODEC_NSCODEC;
flags &= (uint32_t)~FREERDP_CODEC_NSCODEC;
}
/*TODO: check other codecs flags */
return flags;