Fix memory leak in FindFileInXkbPath

The string `buf` was not freed after each call to `asprintf_safe`.

Avoid allocating and introduce the new message: `XKB_ERROR_INSUFFICIENT_BUFFER_SIZE`.
master
Pierre Le Marre 2023-10-25 20:39:39 +02:00 committed by Wismill
parent 2b71431007
commit 171e0170c2
5 changed files with 29 additions and 13 deletions

View File

@ -6,7 +6,7 @@ NOTE: This file has been generated automatically by “update-message-registry.p
--> -->
This page lists the warnings and errors generated by xkbcommon. This page lists the warnings and errors generated by xkbcommon.
There are currently 53 entries. There are currently 54 entries.
@todo The documentation of the log messages is a work in progress. @todo The documentation of the log messages is a work in progress.
@ -21,6 +21,7 @@ There are currently 53 entries.
| [XKB-101] | `illegal-keycode-alias` | Illegal keycode alias with the name of a real key | Warning | | [XKB-101] | `illegal-keycode-alias` | Illegal keycode alias with the name of a real key | Warning |
| [XKB-107] | `unrecognized-keysym` | Warn on unrecognized keysyms | Warning | | [XKB-107] | `unrecognized-keysym` | Warn on unrecognized keysyms | Warning |
| [XKB-123] | `undeclared-virtual-modifier` | A virtual modifier is used before being declared | Error | | [XKB-123] | `undeclared-virtual-modifier` | A virtual modifier is used before being declared | Error |
| [XKB-134] | `insufficient-buffer-size` | A buffer has an insufficient size | Error |
| [XKB-150] | `wrong-statement-type` | The type of the statement is not allowed in the context | Error | | [XKB-150] | `wrong-statement-type` | The type of the statement is not allowed in the context | Error |
| [XKB-172] | `unsupported-geometry-section` | Geometry sections are not supported | Warning | | [XKB-172] | `unsupported-geometry-section` | Geometry sections are not supported | Warning |
| [XKB-183] | `cannot-infer-key-type` | Warn if no key type can be inferred | Warning | | [XKB-183] | `cannot-infer-key-type` | Warn if no key type can be inferred | Warning |
@ -175,6 +176,14 @@ key <AB08> {[ comma, semicolon, periodcentered, multiply ]};
<dt>Summary</dt><dd>A virtual modifier is used before being declared</dd> <dt>Summary</dt><dd>A virtual modifier is used before being declared</dd>
</dl> </dl>
### XKB-134 Insufficient buffer size {#XKB-134}
<dl>
<dt>Since</dt><dd>1.0.0</dd>
<dt>Type</dt><dd>Error</dd>
<dt>Summary</dt><dd>A buffer has an insufficient size</dd>
</dl>
### XKB-150 Wrong statement type {#XKB-150} ### XKB-150 Wrong statement type {#XKB-150}
<dl> <dl>
@ -630,6 +639,7 @@ The modifiers used in `map` or `preserve` entries should be declared using the e
[XKB-101]: @ref XKB-101 [XKB-101]: @ref XKB-101
[XKB-107]: @ref XKB-107 [XKB-107]: @ref XKB-107
[XKB-123]: @ref XKB-123 [XKB-123]: @ref XKB-123
[XKB-134]: @ref XKB-134
[XKB-150]: @ref XKB-150 [XKB-150]: @ref XKB-150
[XKB-172]: @ref XKB-172 [XKB-172]: @ref XKB-172
[XKB-183]: @ref XKB-183 [XKB-183]: @ref XKB-183

View File

@ -8,7 +8,7 @@
# • Codes must be in the range 1..999. This range may be extended once every # • Codes must be in the range 1..999. This range may be extended once every
# code has be assigned. # code has be assigned.
# #
# See the following guidelines for futher details on good practices: # See the following guidelines for further details on good practices:
# https://github.com/haskellfoundation/error-message-index/blob/main/tool-developers.md#code-assignment-recommendations # https://github.com/haskellfoundation/error-message-index/blob/main/tool-developers.md#code-assignment-recommendations
# NOTE: Field “added: ALWAYS” means that the precise version is unknown and # NOTE: Field “added: ALWAYS” means that the precise version is unknown and
@ -85,6 +85,11 @@
added: ALWAYS added: ALWAYS
type: error type: error
description: "A virtual modifier is used before being declared" description: "A virtual modifier is used before being declared"
- id: "insufficient-buffer-size"
code: 134
added: ALWAYS
type: error
description: "A buffer has an insufficient size"
- id: "wrong-statement-type" - id: "wrong-statement-type"
code: 150 code: 150
added: ALWAYS added: ALWAYS

View File

@ -30,6 +30,8 @@ enum xkb_message_code {
XKB_WARNING_UNRECOGNIZED_KEYSYM = 107, XKB_WARNING_UNRECOGNIZED_KEYSYM = 107,
/** A virtual modifier is used before being declared */ /** A virtual modifier is used before being declared */
XKB_ERROR_UNDECLARED_VIRTUAL_MODIFIER = 123, XKB_ERROR_UNDECLARED_VIRTUAL_MODIFIER = 123,
/** A buffer has an insufficient size */
XKB_ERROR_INSUFFICIENT_BUFFER_SIZE = 134,
/** The type of the statement is not allowed in the context */ /** The type of the statement is not allowed in the context */
XKB_ERROR_WRONG_STATEMENT_TYPE = 150, XKB_ERROR_WRONG_STATEMENT_TYPE = 150,
/** Geometry sections are not supported */ /** Geometry sections are not supported */

View File

@ -247,28 +247,27 @@ FindFileInXkbPath(struct xkb_context *ctx, const char *name,
{ {
unsigned int i; unsigned int i;
FILE *file = NULL; FILE *file = NULL;
char *buf = NULL; char buf[PATH_MAX];
const char *typeDir; const char *typeDir;
typeDir = DirectoryForInclude(type); typeDir = DirectoryForInclude(type);
for (i = *offset; i < xkb_context_num_include_paths(ctx); i++) { for (i = *offset; i < xkb_context_num_include_paths(ctx); i++) {
buf = asprintf_safe("%s/%s/%s", xkb_context_include_path_get(ctx, i), if (!snprintf_safe(buf, sizeof(buf), "%s/%s/%s",
typeDir, name); xkb_context_include_path_get(ctx, i),
if (!buf) { typeDir, name)) {
log_err(ctx, log_err(ctx,
XKB_ERROR_ALLOCATION_ERROR, XKB_ERROR_INSUFFICIENT_BUFFER_SIZE,
"Failed to alloc buffer for (%s/%s/%s)\n", "Path is too long: expected max length of %lu, got: %s/%s/%s\n",
(unsigned long int) sizeof(buf),
xkb_context_include_path_get(ctx, i), typeDir, name); xkb_context_include_path_get(ctx, i), typeDir, name);
continue; continue;
} }
file = fopen(buf, "rb"); file = fopen(buf, "rb");
if (file) { if (file) {
if (pathRtrn) { if (pathRtrn)
*pathRtrn = buf; *pathRtrn = strdup(buf);
buf = NULL;
}
*offset = i; *offset = i;
goto out; goto out;
} }
@ -284,7 +283,6 @@ FindFileInXkbPath(struct xkb_context *ctx, const char *name,
} }
out: out:
free(buf);
return file; return file;
} }

View File

@ -45,6 +45,7 @@ static const struct xkb_message_entry xkb_messages[] = {
{XKB_WARNING_ILLEGAL_KEYCODE_ALIAS, "Illegal keycode alias"}, {XKB_WARNING_ILLEGAL_KEYCODE_ALIAS, "Illegal keycode alias"},
{XKB_WARNING_UNRECOGNIZED_KEYSYM, "Unrecognized keysym"}, {XKB_WARNING_UNRECOGNIZED_KEYSYM, "Unrecognized keysym"},
{XKB_ERROR_UNDECLARED_VIRTUAL_MODIFIER, "Undeclared virtual modifier"}, {XKB_ERROR_UNDECLARED_VIRTUAL_MODIFIER, "Undeclared virtual modifier"},
{XKB_ERROR_INSUFFICIENT_BUFFER_SIZE, "Insufficient buffer size"},
{XKB_ERROR_WRONG_STATEMENT_TYPE, "Wrong statement type"}, {XKB_ERROR_WRONG_STATEMENT_TYPE, "Wrong statement type"},
{XKB_WARNING_UNSUPPORTED_GEOMETRY_SECTION, "Unsupported geometry section"}, {XKB_WARNING_UNSUPPORTED_GEOMETRY_SECTION, "Unsupported geometry section"},
{XKB_WARNING_CANNOT_INFER_KEY_TYPE, "Cannot infer key type"}, {XKB_WARNING_CANNOT_INFER_KEY_TYPE, "Cannot infer key type"},