On NetBSD, d_name is larger than 256, so file_name[284] may not be large
enough (and gcc emits a format-truncation error).
Use asprintf() instead of snprintf() on a static on-stack buffer.
Signed-off-by: Manuel Bouyer <bouyer@netbsd.org>
---
tools/xenpmd/xenpmd.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/tools/xenpmd/xenpmd.c b/tools/xenpmd/xenpmd.c
index 12b82cf43e..e432aad856 100644
--- a/tools/xenpmd/xenpmd.c
+++ b/tools/xenpmd/xenpmd.c
@@ -101,7 +101,7 @@ FILE *get_next_battery_file(DIR *battery_dir,
{
FILE *file = 0;
struct dirent *dir_entries;
- char file_name[284];
+ char *file_name;
int ret;
do
@@ -112,16 +112,16 @@ FILE *get_next_battery_file(DIR *battery_dir,
if ( strlen(dir_entries->d_name) < 4 )
continue;
if ( battery_info_type == BIF )
- ret = snprintf(file_name, sizeof(file_name), BATTERY_INFO_FILE_PATH,
+ ret = asprintf(&file_name, BATTERY_INFO_FILE_PATH,
dir_entries->d_name);
else
- ret = snprintf(file_name, sizeof(file_name), BATTERY_STATE_FILE_PATH,
+ ret = asprintf(&file_name, BATTERY_STATE_FILE_PATH,
dir_entries->d_name);
/* This should not happen but is needed to pass gcc checks */
if (ret < 0)
continue;
- file_name[sizeof(file_name) - 1] = '\0';
file = fopen(file_name, "r");
+ free(file_name);
} while ( !file );
return file;
--
2.29.2
On Tue, Jan 26, 2021 at 11:48:00PM +0100, Manuel Bouyer wrote:
> On NetBSD, d_name is larger than 256, so file_name[284] may not be large
> enough (and gcc emits a format-truncation error).
> Use asprintf() instead of snprintf() on a static on-stack buffer.
>
> Signed-off-by: Manuel Bouyer <bouyer@netbsd.org>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
> ---
> tools/xenpmd/xenpmd.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/tools/xenpmd/xenpmd.c b/tools/xenpmd/xenpmd.c
> index 12b82cf43e..e432aad856 100644
> --- a/tools/xenpmd/xenpmd.c
> +++ b/tools/xenpmd/xenpmd.c
> @@ -101,7 +101,7 @@ FILE *get_next_battery_file(DIR *battery_dir,
> {
> FILE *file = 0;
> struct dirent *dir_entries;
> - char file_name[284];
> + char *file_name;
> int ret;
>
> do
> @@ -112,16 +112,16 @@ FILE *get_next_battery_file(DIR *battery_dir,
> if ( strlen(dir_entries->d_name) < 4 )
> continue;
> if ( battery_info_type == BIF )
> - ret = snprintf(file_name, sizeof(file_name), BATTERY_INFO_FILE_PATH,
> + ret = asprintf(&file_name, BATTERY_INFO_FILE_PATH,
> dir_entries->d_name);
> else
> - ret = snprintf(file_name, sizeof(file_name), BATTERY_STATE_FILE_PATH,
> + ret = asprintf(&file_name, BATTERY_STATE_FILE_PATH,
> dir_entries->d_name);
> /* This should not happen but is needed to pass gcc checks */
> if (ret < 0)
> continue;
> - file_name[sizeof(file_name) - 1] = '\0';
> file = fopen(file_name, "r");
> + free(file_name);
Hard tab. May I ask whether this can be fixed on commit so that
there's no need to resend a new version?
Thanks, Roger.
© 2016 - 2026 Red Hat, Inc.