Page MenuHomeFreeBSD

D32383.id99015.diff
No OneTemporary

D32383.id99015.diff

Index: sys/compat/linuxkpi/common/include/linux/module.h
===================================================================
--- sys/compat/linuxkpi/common/include/linux/module.h
+++ sys/compat/linuxkpi/common/include/linux/module.h
@@ -33,6 +33,7 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/module.h>
#include <linux/list.h>
Index: sys/contrib/rdma/krping/krping_dev.c
===================================================================
--- sys/contrib/rdma/krping/krping_dev.c
+++ sys/contrib/rdma/krping/krping_dev.c
@@ -14,10 +14,10 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/param.h> /* defines used in kernel.h and module.h */
#include <sys/module.h>
#include <sys/systm.h> /* uprintf */
#include <sys/errno.h>
-#include <sys/param.h> /* defines used in kernel.h */
#include <sys/kernel.h> /* types used in module initialization */
#include <sys/conf.h> /* cdevsw struct */
#include <sys/uio.h> /* uio struct */
Index: sys/dev/videomode/videomode.c
===================================================================
--- sys/dev/videomode/videomode.c
+++ sys/dev/videomode/videomode.c
@@ -11,6 +11,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/module.h>
#include <dev/videomode/videomode.h>
Index: sys/fs/fuse/fuse_device.c
===================================================================
--- sys/fs/fuse/fuse_device.c
+++ sys/fs/fuse/fuse_device.c
@@ -64,6 +64,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/module.h>
#include <sys/systm.h>
#include <sys/errno.h>
Index: sys/fs/fuse/fuse_io.c
===================================================================
--- sys/fs/fuse/fuse_io.c
+++ sys/fs/fuse/fuse_io.c
@@ -64,6 +64,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/module.h>
#include <sys/systm.h>
#include <sys/errno.h>
Index: sys/fs/fuse/fuse_main.c
===================================================================
--- sys/fs/fuse/fuse_main.c
+++ sys/fs/fuse/fuse_main.c
@@ -64,6 +64,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/module.h>
#include <sys/systm.h>
#include <sys/errno.h>
Index: sys/kern/kern_module.c
===================================================================
--- sys/kern/kern_module.c
+++ sys/kern/kern_module.c
@@ -361,11 +361,20 @@
struct module_stat_v1 {
int version; /* set to sizeof(struct module_stat) */
- char name[MAXMODNAME];
+ char name[MAXMODNAMEV1V2];
int refs;
int id;
};
+struct module_stat_v2 {
+ int version; /* set to sizeof(struct module_stat) */
+ char name[MAXMODNAMEV1V2];
+ int refs;
+ int id;
+ modspecific_t data;
+};
+CTASSERT(sizeof(struct module_stat_v2) == sizeof(struct module_stat));
+
int
sys_modstat(struct thread *td, struct modstat_args *uap)
{
@@ -374,7 +383,9 @@
int error = 0;
int id, namelen, refs, version;
struct module_stat *stat;
+ struct module_stat_v2 *stat_v2;
char *name;
+ bool is_v1v2;
MOD_SLOCK;
mod = module_lookupbyid(uap->modid);
@@ -394,27 +405,44 @@
*/
if ((error = copyin(&stat->version, &version, sizeof(version))) != 0)
return (error);
- if (version != sizeof(struct module_stat_v1)
- && version != sizeof(struct module_stat))
+ is_v1v2 = (version == sizeof(struct module_stat_v1) ||
+ version == sizeof(struct module_stat_v2));
+ if (!is_v1v2 && version != sizeof(struct module_stat))
return (EINVAL);
namelen = strlen(mod->name) + 1;
- if (namelen > MAXMODNAME)
- namelen = MAXMODNAME;
+ if (is_v1v2 && namelen > MAXMODNAMEV1V2)
+ namelen = MAXMODNAMEV1V2;
+ else if (namelen > MAXMODNAMEV3)
+ namelen = MAXMODNAMEV3;
if ((error = copyout(name, &stat->name[0], namelen)) != 0)
return (error);
- if ((error = copyout(&refs, &stat->refs, sizeof(int))) != 0)
- return (error);
- if ((error = copyout(&id, &stat->id, sizeof(int))) != 0)
- return (error);
+ /* Extending MAXMODNAME gives an offset change for v3. */
+ if (is_v1v2) {
+ stat_v2 = (struct module_stat_v2 *)stat;
+ if ((error = copyout(&refs, &stat_v2->refs, sizeof(int))) != 0)
+ return (error);
+ if ((error = copyout(&id, &stat_v2->id, sizeof(int))) != 0)
+ return (error);
+ } else {
+ if ((error = copyout(&refs, &stat->refs, sizeof(int))) != 0)
+ return (error);
+ if ((error = copyout(&id, &stat->id, sizeof(int))) != 0)
+ return (error);
+ }
/*
* >v1 stat includes module data.
*/
- if (version == sizeof(struct module_stat))
+ if (version == sizeof(struct module_stat_v2)) {
+ if ((error = copyout(&data, &stat_v2->data,
+ sizeof(data))) != 0)
+ return (error);
+ } else if (version == sizeof(struct module_stat)) {
if ((error = copyout(&data, &stat->data,
sizeof(data))) != 0)
return (error);
+ }
td->td_retval[0] = 0;
return (error);
}
@@ -423,7 +451,7 @@
sys_modfind(struct thread *td, struct modfind_args *uap)
{
int error = 0;
- char name[MAXMODNAME];
+ char name[MAXMODNAMEV3];
module_t mod;
if ((error = copyinstr(uap->name, name, sizeof name, 0)) != 0)
@@ -455,13 +483,21 @@
uint32_t ulongval;
} modspecific32_t;
+struct module_stat32_v2 {
+ int version;
+ char name[MAXMODNAMEV1V2];
+ int refs;
+ int id;
+ modspecific32_t data;
+};
struct module_stat32 {
int version;
- char name[MAXMODNAME];
+ char name[MAXMODNAME]; /* XXX make V3 */
int refs;
int id;
modspecific32_t data;
};
+CTASSERT(sizeof(struct module_stat32_v2) == sizeof(struct module_stat32));
int
freebsd32_modstat(struct thread *td, struct freebsd32_modstat_args *uap)
@@ -471,7 +507,9 @@
int error = 0;
int id, namelen, refs, version;
struct module_stat32 *stat32;
+ struct module_stat32_v2 *stat32_v2;
char *name;
+ bool is_v1v2;
MOD_SLOCK;
mod = module_lookupbyid(uap->modid);
@@ -492,27 +530,44 @@
if ((error = copyin(&stat32->version, &version, sizeof(version))) != 0)
return (error);
- if (version != sizeof(struct module_stat_v1)
- && version != sizeof(struct module_stat32))
+ is_v1v2 = (version == sizeof(struct module_stat_v1) ||
+ version == sizeof(struct module_stat32_v2));
+ if (!is_v1v2 && version != sizeof(struct module_stat32))
return (EINVAL);
namelen = strlen(mod->name) + 1;
- if (namelen > MAXMODNAME)
- namelen = MAXMODNAME;
+ if (is_v1v2 && namelen > MAXMODNAMEV1V2)
+ namelen = MAXMODNAMEV1V2;
+ else if (namelen > MAXMODNAMEV3)
+ namelen = MAXMODNAMEV3;
if ((error = copyout(name, &stat32->name[0], namelen)) != 0)
return (error);
- if ((error = copyout(&refs, &stat32->refs, sizeof(int))) != 0)
- return (error);
- if ((error = copyout(&id, &stat32->id, sizeof(int))) != 0)
- return (error);
+ /* Extending MAXMODNAME gives an offset change for v3. */
+ if (is_v1v2) {
+ stat32_v2 = (struct module_stat32_v2 *)stat32;
+ if ((error = copyout(&refs, &stat32_v2->refs, sizeof(int))) != 0)
+ return (error);
+ if ((error = copyout(&id, &stat32_v2->id, sizeof(int))) != 0)
+ return (error);
+ } else {
+ if ((error = copyout(&refs, &stat32->refs, sizeof(int))) != 0)
+ return (error);
+ if ((error = copyout(&id, &stat32->id, sizeof(int))) != 0)
+ return (error);
+ }
/*
* >v1 stat includes module data.
*/
- if (version == sizeof(struct module_stat32))
+ if (version == sizeof(struct module_stat32_v2)) {
+ if ((error = copyout(&data32, &stat32_v2->data,
+ sizeof(data32))) != 0)
+ return (error);
+ } else if (version == sizeof(struct module_stat32)) {
if ((error = copyout(&data32, &stat32->data,
sizeof(data32))) != 0)
return (error);
+ }
td->td_retval[0] = 0;
return (error);
}
Index: sys/sys/module.h
===================================================================
--- sys/sys/module.h
+++ sys/sys/module.h
@@ -253,8 +253,13 @@
#endif
#endif /* _KERNEL */
-#define MAXMODNAME 32
+#ifdef _KERNEL
+#include <sys/param.h> /* MAXPATHLEN */
+#endif
+#define MAXMODNAMEV1V2 32
+#define MAXMODNAMEV3 MAXPATHLEN
+#define MAXMODNAME MAXMODNAMEV1V2
struct module_stat {
int version; /* set to sizeof(struct module_stat) */
char name[MAXMODNAME];
Index: sys/x86/cpufreq/hwpstate_intel.c
===================================================================
--- sys/x86/cpufreq/hwpstate_intel.c
+++ sys/x86/cpufreq/hwpstate_intel.c
@@ -29,6 +29,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/sbuf.h>
#include <sys/module.h>
#include <sys/systm.h>
Index: usr.sbin/kldxref/kldxref.c
===================================================================
--- usr.sbin/kldxref/kldxref.c
+++ usr.sbin/kldxref/kldxref.c
@@ -557,7 +557,7 @@
void **p;
int error, eftype;
long start, finish, entries, i;
- char cval[MAXMODNAME + 1];
+ char cval[MAXMODNAMEV3 + 1];
if (verbose || dflag)
printf("%s\n", filename);

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 20, 5:18 PM (9 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25735537
Default Alt Text
D32383.id99015.diff (8 KB)

Event Timeline