Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/memcontrol/memcontrol.c
Show First 20 Lines • Show All 271 Lines • ▼ Show 20 Lines | clearfunc(int memfd, int argc, char *argv[]) | ||||
case 'l': | case 'l': | ||||
mrd.mr_len = strtouq(optarg, &ep, 0); | mrd.mr_len = strtouq(optarg, &ep, 0); | ||||
if ((ep == optarg) || (*ep != 0)) | if ((ep == optarg) || (*ep != 0)) | ||||
help("clear"); | help("clear"); | ||||
break; | break; | ||||
case 'o': | case 'o': | ||||
if ((*optarg == 0) || (strlen(optarg) > 7)) | if ((*optarg == 0) || (strlen(optarg) > 7)) | ||||
help("clear"); | help("clear"); | ||||
owner = strdup(optarg); | owner = strdup(optarg); | ||||
ed: Technically speaking you should also put a `free()` call above the `strdup()`... :-) | |||||
break; | break; | ||||
case '?': | case '?': | ||||
default: | default: | ||||
help("clear"); | help("clear"); | ||||
} | } | ||||
if (owner != NULL) { | if (owner != NULL) { | ||||
/* clear-by-owner */ | /* clear-by-owner */ | ||||
if ((mrd.mr_base != 0) || (mrd.mr_len != 0)) | if ((mrd.mr_base != 0) || (mrd.mr_len != 0)) | ||||
help("clear"); | help("clear"); | ||||
mrdp = mrgetall(memfd, &nd); | mrdp = mrgetall(memfd, &nd); | ||||
mro.mo_arg[0] = MEMRANGE_SET_REMOVE; | mro.mo_arg[0] = MEMRANGE_SET_REMOVE; | ||||
for (i = 0; i < nd; i++) { | for (i = 0; i < nd; i++) { | ||||
if (!strcmp(owner, mrdp[i].mr_owner) && | if (!strcmp(owner, mrdp[i].mr_owner) && | ||||
(mrdp[i].mr_flags & MDF_ACTIVE) && | (mrdp[i].mr_flags & MDF_ACTIVE) && | ||||
!(mrdp[i].mr_flags & MDF_FIXACTIVE)) { | !(mrdp[i].mr_flags & MDF_FIXACTIVE)) { | ||||
mro.mo_desc = mrdp + i; | mro.mo_desc = mrdp + i; | ||||
if (ioctl(memfd, MEMRANGE_SET, &mro)) | if (ioctl(memfd, MEMRANGE_SET, &mro)) | ||||
warn("couldn't clear range owned by '%s'", owner); | warn("couldn't clear range owned by '%s'", owner); | ||||
} | } | ||||
} | } | ||||
free(owner); | |||||
} else if (mrd.mr_len != 0) { | } else if (mrd.mr_len != 0) { | ||||
/* clear-by-base/len */ | /* clear-by-base/len */ | ||||
mro.mo_arg[0] = MEMRANGE_SET_REMOVE; | mro.mo_arg[0] = MEMRANGE_SET_REMOVE; | ||||
mro.mo_desc = &mrd; | mro.mo_desc = &mrd; | ||||
if (ioctl(memfd, MEMRANGE_SET, &mro)) | if (ioctl(memfd, MEMRANGE_SET, &mro)) | ||||
err(1, "couldn't clear range"); | err(1, "couldn't clear range"); | ||||
} else { | } else { | ||||
help("clear"); | help("clear"); | ||||
Show All 30 Lines |
Technically speaking you should also put a free() call above the strdup()... :-)