Test with a hand crafted kernel module.
Makefile,
```lang=Makefile
PACKAGE=examples
SRCS = sysctl.c
KMOD = sysctl
.include <bsd.kmod.mk>
```
sysctl.c
```lang=c
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/module.h>
#include <sys/sysctl.h>
#include <sys/kernel.h>
char buf1[9] = {'d', 'a', 't', 'a', 'l', 'e', 'a', 'k', '\0'};
char leak_pre[8] = "preleak";
char buf2[8] = {'d', 'a', 't', 'a', 'd', 'a', 't', 'a'};
char leak_pos[8] = "posleak";
SYSCTL_STRING(_sysctl, OID_AUTO, leak1, CTLFLAG_RD, buf1, (sizeof buf1) / 2,
"Read-only string buf 1");
SYSCTL_STRING(_sysctl, OID_AUTO, leak2, CTLFLAG_RD, buf2, sizeof buf2,
"Read-only string buf 2");
static int
module_load(module_t mod, int cmd, void *arg)
{
int error;
error = 0;
switch (cmd) {
case MOD_LOAD:
break;
case MOD_UNLOAD:
break;
default:
error = EOPNOTSUPP;
break;
}
return (error);
}
static moduledata_t mod_data = {
"sysctl",
module_load,
0
};
DECLARE_MODULE(sysctl, mod_data, SI_SUB_EXEC, SI_ORDER_ANY);
```
Build and load kernel module sysctl.ko.
Prior to the fix,
```
# sysctl -n sysctl.leak1
dataleak
# sysctl -n sysctl.leak2
datadataposleak
```
After the fix,
```
# sysctl -n sysctl.leak1
data
# sysctl -n sysctl.leak2
datadata
```