Stricter checks for netname and node names.
authorGuus Sliepen <guus@tinc-vpn.org>
Wed, 1 Aug 2012 14:51:59 +0000 (16:51 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Wed, 1 Aug 2012 14:51:59 +0000 (16:51 +0200)
- Node names should not be empty.
- Net names should not contain slashes or start with a dot, because they are
  used in pathnames.

src/protocol.c
src/tincctl.c
src/tincd.c

index 1c5b6cfd9c1d43dba0c6a2e21defabdb4c431209..1153d61fed56017f9ca07638cb869012b5959d7b 100644 (file)
@@ -56,6 +56,9 @@ static char (*request_name[]) = {
 static splay_tree_t *past_request_tree;
 
 bool check_id(const char *id) {
+       if(!id || !*id)
+               return false;
+
        for(; *id; id++)
                if(!isalnum(*id) && *id != '_')
                        return false;
index 7eb141d20c93a01c6a6bbf146d5618e9272bccfe..39bd326d5850966ff5280dc2555db33eafa20acf 100644 (file)
@@ -194,11 +194,16 @@ static bool parse_options(int argc, char **argv) {
 
         /* netname "." is special: a "top-level name" */
 
-        if(netname && !strcmp(netname, ".")) {
+        if(netname && (!*netname || !strcmp(netname, "."))) {
                 free(netname);
                 netname = NULL;
         }
 
+       if(netname && (strpbrk(netname, "\\/") || *netname == '.')) {
+               fprintf(stderr, "Invalid character in netname!\n");
+               return false;
+       }
+
        return true;
 }
 
@@ -1344,6 +1349,9 @@ static int cmd_config(int argc, char *argv[]) {
 }
 
 bool check_id(const char *name) {
+       if(!name || !*name)
+               return false;
+
        for(int i = 0; i < strlen(name); i++) {
                if(!isalnum(name[i]) && name[i] != '_')
                        return false;
index 98123feb3db07ee8910d245110eea696bba5d710..0fd2f8d70d6bcf7720230ab67b93c30219e8270a 100644 (file)
@@ -231,11 +231,16 @@ static bool parse_options(int argc, char **argv) {
 
        /* netname "." is special: a "top-level name" */
 
-       if(netname && !strcmp(netname, ".")) {
+       if(netname && (!*netname || !strcmp(netname, "."))) {
                free(netname);
                netname = NULL;
        }
 
+       if(netname && (strpbrk(netname, "\\/") || *netname == '.')) {
+               fprintf(stderr, "Invalid character in netname!\n");
+               return false;
+       }
+
        return true;
 }