MFC r265255, r270506:
Allow "a.out" as an alias for the executable if no other matching entries are found.
This commit is contained in:
parent
3d2bab33aa
commit
385503e19f
@ -46,6 +46,8 @@ struct proc_handle {
|
||||
size_t rdobjsz;
|
||||
size_t nobjs;
|
||||
struct lwpstatus lwps;
|
||||
rd_loadobj_t *rdexec; /* rdobj index of program executable. */
|
||||
char execname[MAXPATHLEN]; /* Path to program executable. */
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -26,8 +26,10 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include "_libproc.h"
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
@ -35,7 +37,37 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include "_libproc.h"
|
||||
|
||||
static int proc_init(pid_t, int, int, struct proc_handle *);
|
||||
|
||||
static int
|
||||
proc_init(pid_t pid, int flags, int status, struct proc_handle *phdl)
|
||||
{
|
||||
int mib[4], error;
|
||||
size_t len;
|
||||
|
||||
memset(phdl, 0, sizeof(*phdl));
|
||||
phdl->pid = pid;
|
||||
phdl->flags = flags;
|
||||
phdl->status = status;
|
||||
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_PROC;
|
||||
mib[2] = KERN_PROC_PATHNAME;
|
||||
mib[3] = pid;
|
||||
len = sizeof(phdl->execname);
|
||||
if (sysctl(mib, 4, phdl->execname, &len, NULL, 0) != 0) {
|
||||
error = errno;
|
||||
DPRINTF("ERROR: cannot get pathname for child process %d", pid);
|
||||
return (error);
|
||||
}
|
||||
if (len == 0)
|
||||
phdl->execname[0] = '\0';
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
proc_attach(pid_t pid, int flags, struct proc_handle **pphdl)
|
||||
@ -54,12 +86,12 @@ proc_attach(pid_t pid, int flags, struct proc_handle **pphdl)
|
||||
if ((phdl = malloc(sizeof(struct proc_handle))) == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
memset(phdl, 0, sizeof(struct proc_handle));
|
||||
phdl->pid = pid;
|
||||
phdl->flags = flags;
|
||||
phdl->status = PS_RUN;
|
||||
elf_version(EV_CURRENT);
|
||||
|
||||
error = proc_init(pid, flags, PS_RUN, phdl);
|
||||
if (error != 0)
|
||||
goto out;
|
||||
|
||||
if (ptrace(PT_ATTACH, phdl->pid, 0, 0) != 0) {
|
||||
error = errno;
|
||||
DPRINTF("ERROR: cannot ptrace child process %d", pid);
|
||||
@ -123,9 +155,9 @@ proc_create(const char *file, char * const *argv, proc_child_func *pcf,
|
||||
_exit(2);
|
||||
} else {
|
||||
/* The parent owns the process handle. */
|
||||
memset(phdl, 0, sizeof(struct proc_handle));
|
||||
phdl->pid = pid;
|
||||
phdl->status = PS_IDLE;
|
||||
error = proc_init(pid, 0, PS_IDLE, phdl);
|
||||
if (error != 0)
|
||||
goto bad;
|
||||
|
||||
/* Wait for the child process to stop. */
|
||||
if (waitpid(pid, &status, WUNTRACED) == -1) {
|
||||
|
@ -49,6 +49,9 @@ map_iter(const rd_loadobj_t *lop, void *arg)
|
||||
if (phdl->rdobjs == NULL)
|
||||
return (-1);
|
||||
}
|
||||
if (strcmp(lop->rdl_path, phdl->execname) == 0 &&
|
||||
(lop->rdl_prot & RD_RDL_X) != 0)
|
||||
phdl->rdexec = &phdl->rdobjs[phdl->nobjs];
|
||||
memcpy(&phdl->rdobjs[phdl->nobjs++], lop, sizeof(*lop));
|
||||
|
||||
return (0);
|
||||
|
@ -113,17 +113,25 @@ proc_obj2map(struct proc_handle *p, const char *objname)
|
||||
rd_loadobj_t *rdl;
|
||||
char path[MAXPATHLEN];
|
||||
|
||||
rdl = NULL;
|
||||
for (i = 0; i < p->nobjs; i++) {
|
||||
rdl = &p->rdobjs[i];
|
||||
basename_r(rdl->rdl_path, path);
|
||||
basename_r(p->rdobjs[i].rdl_path, path);
|
||||
if (strcmp(path, objname) == 0) {
|
||||
rdl = &p->rdobjs[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rdl == NULL) {
|
||||
if (strcmp(objname, "a.out") == 0 && p->rdexec != NULL)
|
||||
rdl = p->rdexec;
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((map = malloc(sizeof(*map))) == NULL)
|
||||
return (NULL);
|
||||
proc_rdl2prmap(rdl, map);
|
||||
return (map);
|
||||
}
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
int
|
||||
@ -381,8 +389,9 @@ proc_name2map(struct proc_handle *p, const char *name)
|
||||
free(kves);
|
||||
return (NULL);
|
||||
}
|
||||
if (name == NULL || strcmp(name, "a.out") == 0) {
|
||||
map = proc_addr2map(p, p->rdobjs[0].rdl_saddr);
|
||||
if ((name == NULL || strcmp(name, "a.out") == 0) &&
|
||||
p->rdexec != NULL) {
|
||||
map = proc_addr2map(p, p->rdexec->rdl_saddr);
|
||||
return (map);
|
||||
}
|
||||
for (i = 0; i < p->nobjs; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user