From c2475f1337dff2e2a3e45514119d5186e55753c1 Mon Sep 17 00:00:00 2001 From: Michael Chang Date: Thu, 13 Aug 2020 09:36:45 +0800 Subject: [PATCH] kern/mm.c : Make grub_calloc inline To circumvent the situation that symbol 'grub_calloc' not found would happen if system is using stray grub (ie not managed by system update) as stage1 that can be too old to load updated modules. --- grub-core/kern/mm.c | 28 ---------------------------- include/grub/mm.h | 32 +++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/grub-core/kern/mm.c b/grub-core/kern/mm.c index f2822a836..dacdaa239 100644 --- a/grub-core/kern/mm.c +++ b/grub-core/kern/mm.c @@ -60,14 +60,10 @@ #include #include -#include -#include #include #include #include -#include #include -#include #ifdef MM_DEBUG # undef grub_calloc @@ -377,30 +373,6 @@ grub_memalign (grub_size_t align, grub_size_t size) return 0; } -/* - * Allocate NMEMB instances of SIZE bytes and return the pointer, or error on - * integer overflow. - */ -void * -grub_calloc (grub_size_t nmemb, grub_size_t size) -{ - void *ret; - grub_size_t sz = 0; - - if (grub_mul (nmemb, size, &sz)) - { - grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); - return NULL; - } - - ret = grub_memalign (0, sz); - if (!ret) - return NULL; - - grub_memset (ret, 0, sz); - return ret; -} - /* Allocate SIZE bytes and return the pointer. */ void * grub_malloc (grub_size_t size) diff --git a/include/grub/mm.h b/include/grub/mm.h index 9c38dd3ca..1754635e7 100644 --- a/include/grub/mm.h +++ b/include/grub/mm.h @@ -29,7 +29,6 @@ #endif void grub_mm_init_region (void *addr, grub_size_t size); -void *EXPORT_FUNC(grub_calloc) (grub_size_t nmemb, grub_size_t size); void *EXPORT_FUNC(grub_malloc) (grub_size_t size); void *EXPORT_FUNC(grub_zalloc) (grub_size_t size); void EXPORT_FUNC(grub_free) (void *ptr); @@ -37,6 +36,37 @@ void *EXPORT_FUNC(grub_realloc) (void *ptr, grub_size_t size); #ifndef GRUB_MACHINE_EMU void *EXPORT_FUNC(grub_memalign) (grub_size_t align, grub_size_t size); #endif +#if !defined(GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) +#include +#include +#include +#include +/* + * Allocate NMEMB instances of SIZE bytes and return the pointer, or error on + * integer overflow. + */ +static inline void * +grub_calloc (grub_size_t nmemb, grub_size_t size) +{ + void *ret; + grub_size_t sz = 0; + + if (grub_mul (nmemb, size, &sz)) + { + grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); + return NULL; + } + + ret = grub_memalign (0, sz); + if (!ret) + return NULL; + + grub_memset (ret, 0, sz); + return ret; +} +#else +void *EXPORT_FUNC(grub_calloc) (grub_size_t nmemb, grub_size_t size); +#endif void grub_mm_check_real (const char *file, int line); #define grub_mm_check() grub_mm_check_real (GRUB_FILE, __LINE__); -- 2.26.2