The fasttrap ioctl used to create probes takes a variable-sized argument.

It was not being correctly copied into the kernel on FreeBSD, and as a
result, probes with multiple probe sites were not being created properly.
To fix this, change the ioctl definition so that the fasttrap ioctl handler
is responsible for copying in userland data.

Submitted by:	Prashanth Kumar <pra_udupi@yahoo.co.in>
MFC after:	1 month
This commit is contained in:
Mark Johnston 2013-11-18 03:24:50 +00:00
parent be1938b303
commit dd580326fe
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=258291
2 changed files with 2 additions and 15 deletions

View File

@ -2064,20 +2064,16 @@ fasttrap_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int fflag,
return (EAGAIN);
if (cmd == FASTTRAPIOC_MAKEPROBE) {
fasttrap_probe_spec_t *uprobe = (void *)arg;
fasttrap_probe_spec_t *uprobe = *(fasttrap_probe_spec_t **)arg;
fasttrap_probe_spec_t *probe;
uint64_t noffs;
size_t size;
int ret;
char *c;
#if defined(sun)
if (copyin(&uprobe->ftps_noffs, &noffs,
sizeof (uprobe->ftps_noffs)))
return (EFAULT);
#else
noffs = uprobe->ftps_noffs;
#endif
/*
* Probes must have at least one tracepoint.
@ -2093,19 +2089,10 @@ fasttrap_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int fflag,
probe = kmem_alloc(size, KM_SLEEP);
#if defined(sun)
if (copyin(uprobe, probe, size) != 0) {
kmem_free(probe, size);
return (EFAULT);
}
#else
memcpy(probe, uprobe, sizeof(*probe));
if (noffs > 1 && copyin(uprobe + 1, probe + 1, size) != 0) {
kmem_free(probe, size);
return (EFAULT);
}
#endif
/*
* Verify that the function and module strings contain no

View File

@ -42,8 +42,8 @@ extern "C" {
#define FASTTRAPIOC_MAKEPROBE (FASTTRAPIOC | 1)
#define FASTTRAPIOC_GETINSTR (FASTTRAPIOC | 2)
#else
#define FASTTRAPIOC_MAKEPROBE _IOW('f', 1, fasttrap_probe_spec_t)
#define FASTTRAPIOC_GETINSTR _IOWR('f', 2, uint8_t)
#define FASTTRAPIOC_MAKEPROBE _IO('f', 3)
#endif
typedef enum fasttrap_probe_type {