From 66fd022a705cf65cbe37c446dbd87919a43a7fd3 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Mon, 4 Jul 2016 23:05:01 +0200 Subject: lib: irm: search for ap using PATH variable The bind function will search all directories specified in the PATH variable for the ap fed to the irm bind command and check if it is executable by the uid executing irm bind command. Adds missing info logs for the bind/unbind and unreg operations in the irmd. --- src/lib/irm.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 90 insertions(+), 6 deletions(-) (limited to 'src/lib') diff --git a/src/lib/irm.c b/src/lib/irm.c index 93963eb1..68ffdf03 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -27,7 +27,9 @@ #include #include #include +#include +#include #include #include @@ -238,6 +240,84 @@ int irm_enroll_ipcp(pid_t api, return ret; } +static int check_ap(char * ap_name) +{ + struct stat s; + + if (stat(ap_name, &s) != 0) + return -ENOENT; + + if (!(s.st_mode & S_IXUSR)) + return -EPERM; + + return 0; +} + +static int check_ap_path(char ** ap_name) +{ + char * path = getenv("PATH"); + char * path_end = path + strlen(path) + 1; + char * pstart; + char * pstop = path; + char * tmp; + char * tstop; + char * tstart; + bool perm = true; + int ret = 0; + + if (*ap_name == NULL || path == NULL) + return -EINVAL; + + if (!strlen(path) || strchr(*ap_name, '/') == NULL) + if ((ret = check_ap(*ap_name)) < 0) + return ret; + + tmp = malloc(strlen(path) + strlen(*ap_name) + 2); + if (tmp == NULL) + return -ENOMEM; + + tstop = tmp + strlen(path) + 1; + strcpy(tstop--, *ap_name); + + while (pstop < path_end) { + ret = 0; + pstart = pstop; + if (*pstart != '/') { + free(tmp); + return -EINVAL; + } + + while (*pstop != '\0' && *pstop != ':') + pstop++; + + *pstop = '\0'; + tstart = tstop - (pstop++ - pstart); + strcpy(tstart, pstart); + *tstop = '/'; + + if ((ret = check_ap(tstart)) < 0) { + if (ret == -EPERM) + perm = false; + continue; + } + + free(*ap_name); + *ap_name = strdup(tstart); + free(tmp); + + if (*ap_name == NULL) + return -ENOMEM; + + return 0; + } + + free(tmp); + if (!perm) + return -EPERM; + + return -ENOENT; +} + int irm_bind(char * name, char * ap_name, uint16_t opts, @@ -247,20 +327,23 @@ int irm_bind(char * name, irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; int ret = -1; - struct stat s; + char * full_ap_name; if (name == NULL || ap_name == NULL) return -EINVAL; - if (stat(ap_name, &s) != 0) - return -ENOENT; + full_ap_name = strdup(ap_name); + if (full_ap_name == NULL) + return -ENOMEM; - if (!(s.st_mode & S_IXUSR)) - return -EPERM; + if ((ret = check_ap_path(&full_ap_name)) < 0) { + free(full_ap_name); + return ret; + } msg.code = IRM_MSG_CODE__IRM_BIND; msg.dst_name = name; - msg.ap_name = ap_name; + msg.ap_name = full_ap_name; if (argv != NULL) { msg.n_args = argc; @@ -282,6 +365,7 @@ int irm_bind(char * name, ret = recv_msg->result; irm_msg__free_unpacked(recv_msg, NULL); + free(full_ap_name); return ret; } -- cgit v1.2.3 From 5c745cccbe1774780f499e5cc979eb77d2aac5c7 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Tue, 5 Jul 2016 07:03:17 +0200 Subject: lib: utils: deprecate strdup When introducing robust mutexes, ouroboros moved to POSIX 200809L which includes the strdup function in . Including will give access to strdup. Fixes #15. --- src/ipcpd/ipcp-data.c | 5 +++-- src/lib/irm.c | 2 +- src/lib/utils.c | 19 ------------------- 3 files changed, 4 insertions(+), 22 deletions(-) (limited to 'src/lib') diff --git a/src/ipcpd/ipcp-data.c b/src/ipcpd/ipcp-data.c index 76fc4bcd..8dc708b2 100644 --- a/src/ipcpd/ipcp-data.c +++ b/src/ipcpd/ipcp-data.c @@ -21,15 +21,16 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "ipcp-data.h" +#include #include #include -#include #define OUROBOROS_PREFIX "ipcp-utils" #include +#include "ipcp-data.h" + #include #include diff --git a/src/lib/irm.c b/src/lib/irm.c index 68ffdf03..8f475e38 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -22,12 +22,12 @@ #define OUROBOROS_PREFIX "libouroboros-irm" +#include #include #include #include #include #include -#include #include #include diff --git a/src/lib/utils.c b/src/lib/utils.c index 49065138..acaf1176 100644 --- a/src/lib/utils.c +++ b/src/lib/utils.c @@ -35,25 +35,6 @@ int n_digits(unsigned i) return n; } -char * strdup(const char * src) -{ - int len = 0; - char * dst = NULL; - - if (src == NULL) - return NULL; - - len = strlen(src) + 1; - - dst = malloc(len); - if (dst == NULL) - return NULL; - - memcpy(dst, src, len); - - return dst; -} - char * path_strip(char * src) { char * dst = NULL; -- cgit v1.2.3