Add an automatic kernel module version dependency to prevent loading

modules using invalid ABI versions (e.g. a 7.x module with an 8.x kernel)
for a given kernel:
- Add a 'kernel' module version whose value is __FreeBSD_version.
- Add a version dependency on 'kernel' in every module that has an
  acceptable version range of __FreeBSD_version up to the end of the
  branch __FreeBSD_version is part of.  E.g. a module compiled on 701000
  would work on kernels with versions between 701000 and 799999 inclusive.

Discussed on:	arch@
MFC after:	1 week
This commit is contained in:
John Baldwin 2008-02-13 21:34:06 +00:00
parent d98b6d4496
commit 7471277054
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=176252
2 changed files with 15 additions and 0 deletions

View File

@ -414,6 +414,8 @@ modfind(struct thread *td, struct modfind_args *uap)
return (error);
}
MODULE_VERSION(kernel, __FreeBSD_version);
#ifdef COMPAT_IA32
#include <sys/mount.h>
#include <sys/socket.h>

View File

@ -114,7 +114,20 @@ struct mod_metadata {
MODULE_METADATA(_md_##module##_on_##mdepend, MDT_DEPEND, \
&_##module##_depend_on_##mdepend, #mdepend)
/*
* Every kernel has a 'kernel' module with the version set to
* __FreeBSD_version. We embed a MODULE_DEPEND() inside every module
* that depends on the 'kernel' module. It uses the current value of
* __FreeBSD_version as the minimum and preferred versions. For the
* maximum version it rounds the version up to the end of its branch
* (i.e. M99999 for M.x). This allows a module built on M.x to work
* on M.y systems where y >= x, but fail on M.z systems where z < x.
*/
#define MODULE_KERNEL_MAXVER (roundup(__FreeBSD_version, 100000) - 1)
#define DECLARE_MODULE(name, data, sub, order) \
MODULE_DEPEND(name, kernel, __FreeBSD_version, \
__FreeBSD_version, MODULE_KERNEL_MAXVER); \
MODULE_METADATA(_md_##name, MDT_MODULE, &data, #name); \
SYSINIT(name##module, sub, order, module_register_init, &data) \
struct __hack