From: Józef Kucia Subject: [PATCH 1/6] wined3d: Add helper function to construct debug strings. Message-Id: <20180222154314.30293-1-jkucia@codeweavers.com> Date: Thu, 22 Feb 2018 16:43:09 +0100 Hardcoded buffer sizes are error-prone. Signed-off-by: Józef Kucia --- dlls/wined3d/utils.c | 75 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 4e1da1ce009b..a9db5e072919 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -4148,12 +4148,44 @@ const char *debug_d3ddevicetype(enum wined3d_device_type device_type) } } +struct debug_buffer +{ + char str[200]; /* wine_dbg_sprintf() limits string size to 200 */ + char *ptr; + int size; +}; + +static void init_debug_buffer(struct debug_buffer *buffer, const char *default_string) +{ + strcpy(buffer->str, default_string); + buffer->ptr = buffer->str; + buffer->size = ARRAY_SIZE(buffer->str); +} + +static BOOL debug_append(struct debug_buffer *buffer, const char *str, const char *separator) +{ + int size; + + if (!separator || buffer->ptr == buffer->str) + separator = ""; + size = snprintf(buffer->ptr, buffer->size, "%s%s", separator, str); + if (size == -1 || size >= buffer->size) + { + buffer->size = 0; + return FALSE; + } + + buffer->ptr += size; + buffer->size -= size; + return TRUE; +} + const char *wined3d_debug_resource_access(DWORD access) { - char buf[125]; + struct debug_buffer buffer; - buf[0] = '\0'; -#define ACCESS_TO_STR(x) if (access & x) { strcat(buf, " | "#x); access &= ~x; } + init_debug_buffer(&buffer, "0"); +#define ACCESS_TO_STR(x) if (access & x) { debug_append(&buffer, #x, " | "); access &= ~x; } ACCESS_TO_STR(WINED3D_RESOURCE_ACCESS_GPU); ACCESS_TO_STR(WINED3D_RESOURCE_ACCESS_CPU); ACCESS_TO_STR(WINED3D_RESOURCE_ACCESS_MAP_R); @@ -4162,15 +4194,15 @@ const char *wined3d_debug_resource_access(DWORD access) if (access) FIXME("Unrecognised access flag(s) %#x.\n", access); - return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0"; + return wine_dbg_sprintf("%s", buffer.str); } const char *debug_d3dusage(DWORD usage) { - char buf[552]; + struct debug_buffer buffer; - buf[0] = '\0'; -#define WINED3DUSAGE_TO_STR(u) if (usage & u) { strcat(buf, " | "#u); usage &= ~u; } + init_debug_buffer(&buffer, "0"); +#define WINED3DUSAGE_TO_STR(x) if (usage & x) { debug_append(&buffer, #x, " | "); usage &= ~x; } WINED3DUSAGE_TO_STR(WINED3DUSAGE_RENDERTARGET); WINED3DUSAGE_TO_STR(WINED3DUSAGE_DEPTHSTENCIL); WINED3DUSAGE_TO_STR(WINED3DUSAGE_WRITEONLY); @@ -4191,17 +4223,18 @@ const char *debug_d3dusage(DWORD usage) WINED3DUSAGE_TO_STR(WINED3DUSAGE_STATICDECL); WINED3DUSAGE_TO_STR(WINED3DUSAGE_OVERLAY); #undef WINED3DUSAGE_TO_STR - if (usage) FIXME("Unrecognized usage flag(s) %#x\n", usage); + if (usage) + FIXME("Unrecognized usage flag(s) %#x.\n", usage); - return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0"; + return wine_dbg_sprintf("%s", buffer.str); } -const char *debug_d3dusagequery(DWORD usagequery) +const char *debug_d3dusagequery(DWORD usage) { - char buf[238]; + struct debug_buffer buffer; - buf[0] = '\0'; -#define WINED3DUSAGEQUERY_TO_STR(u) if (usagequery & u) { strcat(buf, " | "#u); usagequery &= ~u; } + init_debug_buffer(&buffer, "0"); +#define WINED3DUSAGEQUERY_TO_STR(x) if (usage & x) { debug_append(&buffer, #x, " | "); usage &= ~x; } WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_FILTER); WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_GENMIPMAP); WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_LEGACYBUMPMAP); @@ -4211,9 +4244,10 @@ const char *debug_d3dusagequery(DWORD usagequery) WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_VERTEXTEXTURE); WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_WRAPANDMIP); #undef WINED3DUSAGEQUERY_TO_STR - if (usagequery) FIXME("Unrecognized usage query flag(s) %#x\n", usagequery); + if (usage) + FIXME("Unrecognized usage query flag(s) %#x.\n", usage); - return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0"; + return wine_dbg_sprintf("%s", buffer.str); } const char *debug_d3ddeclmethod(enum wined3d_decl_method method) @@ -6014,9 +6048,9 @@ int wined3d_ffp_vertex_program_key_compare(const void *key, const struct wine_rb const char *wined3d_debug_location(DWORD location) { + struct debug_buffer buffer; const char *prefix = ""; const char *suffix = ""; - char buf[294]; if (wined3d_popcount(location) > 16) { @@ -6025,8 +6059,8 @@ const char *wined3d_debug_location(DWORD location) suffix = ")"; } - buf[0] = '\0'; -#define LOCATION_TO_STR(u) if (location & u) { strcat(buf, " | "#u); location &= ~u; } + init_debug_buffer(&buffer, "0"); +#define LOCATION_TO_STR(x) if (location & x) { debug_append(&buffer, #x, " | "); location &= ~x; } LOCATION_TO_STR(WINED3D_LOCATION_DISCARDED); LOCATION_TO_STR(WINED3D_LOCATION_SYSMEM); LOCATION_TO_STR(WINED3D_LOCATION_USER_MEMORY); @@ -6037,9 +6071,10 @@ const char *wined3d_debug_location(DWORD location) LOCATION_TO_STR(WINED3D_LOCATION_RB_MULTISAMPLE); LOCATION_TO_STR(WINED3D_LOCATION_RB_RESOLVED); #undef LOCATION_TO_STR - if (location) FIXME("Unrecognized location flag(s) %#x.\n", location); + if (location) + FIXME("Unrecognized location flag(s) %#x.\n", location); - return wine_dbg_sprintf("%s%s%s", prefix, buf[0] ? &buf[3] : "0", suffix); + return wine_dbg_sprintf("%s%s%s", prefix, buffer.str, suffix); } /* Print a floating point value with the %.8e format specifier, always using -- 2.13.6