]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/chap-new.c
pppd: Fix SIGSEGV in EAP-TLS code when TLS verify method is not specified
[ppp.git] / pppd / chap-new.c
index 0b1bb86e77c0d35a03b6e58629ace81748ec36e5..10e4507386e277fbdb6413e46bdd80f61a0b783f 100644 (file)
@@ -59,6 +59,7 @@ int chap_server_timeout_time = 3;
 int chap_max_transmits = 10;
 int chap_rechallenge_time = 0;
 int chap_client_timeout_time = 60;
+int chapms_strip_domain = 0;
 
 /*
  * Command-line options.
@@ -72,6 +73,8 @@ static option_t chap_option_list[] = {
          "Set interval for rechallenge", OPT_PRIO },
        { "chap-timeout", o_int, &chap_client_timeout_time,
          "Set timeout for CHAP (as client)", OPT_PRIO },
+       { "chapms-strip-domain", o_bool, &chapms_strip_domain,
+         "Strip the domain prefix before the Username", 1 },
        { NULL }
 };
 
@@ -163,6 +166,18 @@ chap_register_digest(struct chap_digest_type *dp)
        chap_digests = dp;
 }
 
+/*
+ * Lookup a digest type by code
+ */
+struct chap_digest_type *
+chap_find_digest(int digest_code) {
+       struct chap_digest_type *dp = NULL;
+       for (dp = chap_digests; dp != NULL; dp = dp->next)
+               if (dp->code == digest_code)
+                       break;
+       return dp;
+}
+
 /*
  * chap_lowerup - we can start doing stuff now.
  */
@@ -207,9 +222,8 @@ chap_auth_peer(int unit, char *our_name, int digest_code)
                error("CHAP: peer authentication already started!");
                return;
        }
-       for (dp = chap_digests; dp != NULL; dp = dp->next)
-               if (dp->code == digest_code)
-                       break;
+
+       dp = chap_find_digest(digest_code);
        if (dp == NULL)
                fatal("CHAP digest 0x%x requested but not available",
                      digest_code);
@@ -355,6 +369,14 @@ chap_handle_response(struct chap_server_state *ss, int id,
                        /* Null terminate and clean remote name. */
                        slprintf(rname, sizeof(rname), "%.*v", len, name);
                        name = rname;
+
+                       /* strip the MS domain name */
+                       if (chapms_strip_domain && strrchr(rname, '\\')) {
+                               char tmp[MAXNAMELEN+1];
+
+                               strcpy(tmp, strrchr(rname, '\\') + 1);
+                               strcpy(rname, tmp);
+                       }
                }
 
                if (chap_verify_hook)