diff options
| -rw-r--r-- | src/ipcpd/ipcp-data.c | 5 | ||||
| -rw-r--r-- | src/irmd/main.c | 7 | ||||
| -rw-r--r-- | src/lib/irm.c | 96 | ||||
| -rw-r--r-- | src/lib/utils.c | 19 | 
4 files changed, 100 insertions, 27 deletions
| 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 <ouroboros/config.h>  #include <ouroboros/shm_du_map.h>  #include <ouroboros/list.h> -#include <ouroboros/utils.h>  #define OUROBOROS_PREFIX "ipcp-utils"  #include <ouroboros/logs.h> +#include "ipcp-data.h" +  #include <string.h>  #include <stdlib.h> diff --git a/src/irmd/main.c b/src/irmd/main.c index 0d23ec58..2ea59eee 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1103,6 +1103,8 @@ static int bind_name(char *   name,          pthread_rwlock_unlock(&instance->reg_lock);          pthread_rwlock_unlock(&instance->state_lock); +        LOG_INFO("Bound %s to registered name %s.", ap_name, name); +          return 0;  } @@ -1142,6 +1144,8 @@ static int unbind_name(char * name,          pthread_rwlock_unlock(&instance->reg_lock);          pthread_rwlock_unlock(&instance->state_lock); +        LOG_INFO("Removed binding from %s to %s.", ap_name, name); +          return 0;  } @@ -1280,6 +1284,9 @@ static int ap_unreg(char *  name,                                                  "%s in DIF %s.",                                                  rne->name, e->dif_name);                                          --ret; +                                } else { +                                        LOG_INFO("Unregistered %s from %s.", +                                                 rne->name, e->dif_name);                                  }                          }                  } diff --git a/src/lib/irm.c b/src/lib/irm.c index da3cfb62..ca2111ca 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -22,6 +22,7 @@  #define OUROBOROS_PREFIX "libouroboros-irm" +#include <ouroboros/config.h>  #include <ouroboros/errno.h>  #include <ouroboros/irm.h>  #include <ouroboros/common.h> @@ -29,6 +30,7 @@  #include <ouroboros/sockets.h>  #include <stdbool.h> +#include <string.h>  #include <stdlib.h>  #include <sys/stat.h> @@ -239,6 +241,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, @@ -248,20 +328,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; @@ -283,6 +366,7 @@ int irm_bind(char *   name,          ret = recv_msg->result;          irm_msg__free_unpacked(recv_msg, NULL); +        free(full_ap_name);          return ret;  } 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; | 
