Re: [PATCH v2 09/13] lib/fonts: Compare font data for equality with font_data_is_equal()
From: Nathan Chancellor <nathan@kernel.org>
Date: 2026-03-05 00:23:51
Also in:
dri-devel, lkml
Hi Thomas, On Mon, Mar 02, 2026 at 03:08:43PM +0100, Thomas Zimmermann wrote: ...
quoted hunk ↗ jump to hunk
diff --git a/lib/fonts/fonts.c b/lib/fonts/fonts.c index 8c9a6762061c..c9f6328d5dda 100644 --- a/lib/fonts/fonts.c +++ b/lib/fonts/fonts.c@@ -12,18 +12,25 @@ * for more details. */ +#include <linux/font.h> #include <linux/module.h> -#include <linux/types.h> #include <linux/string.h> +#include <linux/types.h> + +#include <asm/sections.h> #if defined(__mc68000__) #include <asm/setup.h> #endif -#include <linux/font.h> /* * Helpers for font_data_t */ +static bool font_data_is_internal(font_data_t *fd) +{ + return is_kernel_rodata((unsigned long)fd); +} + /** * font_data_size - Return size of the font data in bytes * @fd: Font data@@ -37,6 +44,32 @@ unsigned int font_data_size(font_data_t *fd) } EXPORT_SYMBOL_GPL(font_data_size); +/** + * font_data_is_equal - Compares font data for equality + * @lhs: Left-hand side font data + * @rhs: Right-hand-size font data + * + * Font data is equal if is constain the same sequence of values. The + * helper also use the checksum, if both arguments contain it. Font data + * coming from different origins, internal or from user space, is never + * equal. Allowing this would break reference counting. + * + * Returns: + * True if the given font data is equal, false otherwise. + */ +bool font_data_is_equal(font_data_t *lhs, font_data_t *rhs) +{ + if (font_data_is_internal(lhs) != font_data_is_internal(rhs)) + return false;
This breaks the build when CONFIG_FONT_SUPPORT is a module. $ cat allno.config CONFIG_MODULES=y CONFIG_DRM=m CONFIG_DRM_PANIC=y $ make -skj"$(nproc)" ARCH=x86_64 CROSS_COMPILE=x86_64-linux- KCONFIG_ALLCONFIG=1 allnoconfig all ERROR: modpost: "__end_rodata" [lib/fonts/font.ko] undefined! make[4]: *** [scripts/Makefile.modpost:147: Module.symvers] Error 1 ... $ scripts/config -s FONT_SUPPORT m Cheers, Nathan
+ if (font_data_size(lhs) != font_data_size(rhs)) + return false; + if (FNTSUM(lhs) && FNTSUM(rhs) && FNTSUM(lhs) != FNTSUM(rhs)) + return false; + + return !memcmp(lhs, rhs, FNTSIZE(lhs)); +} +EXPORT_SYMBOL_GPL(font_data_is_equal); + /* * Font lookup */ -- 2.53.0