X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fplugins%2Fradius%2Fconfig.c;h=871cea060cb0e68cbccd99957ca1e800b55b0e8c;hb=HEAD;hp=a29e5e8da90918ffd446b4fda92ca847a4d50667;hpb=7f736dde0da3c19855997d9e67370e351e15e923;p=ppp.git diff --git a/pppd/plugins/radius/config.c b/pppd/plugins/radius/config.c index a29e5e8..e1a4814 100644 --- a/pppd/plugins/radius/config.c +++ b/pppd/plugins/radius/config.c @@ -153,6 +153,7 @@ static int set_option_auo(char *filename, int line, OPTION *option, char *p) *iptr = AUTH_RADIUS_FST; else { error("%s: auth_order: unknown keyword: %s", filename, p); + free(iptr); return (-1); } @@ -165,6 +166,7 @@ static int set_option_auo(char *filename, int line, OPTION *option, char *p) *iptr = (*iptr) | AUTH_RADIUS_SND; else { error("%s: auth_order: unknown or unexpected keyword: %s", filename, p); + free(iptr); return (-1); } } @@ -210,6 +212,7 @@ int rc_read_config(char *filename) if ((pos = strcspn(p, "\t ")) == 0) { error("%s: line %d: bogus format: %s", filename, line, p); + fclose(configfd); return (-1); } @@ -222,6 +225,7 @@ int rc_read_config(char *filename) if (option->status != ST_UNDEF) { error("%s: line %d: duplicate option line: %s", filename, line, p); + fclose(configfd); return (-1); } @@ -231,20 +235,28 @@ int rc_read_config(char *filename) switch (option->type) { case OT_STR: - if (set_option_str(filename, line, option, p) < 0) + if (set_option_str(filename, line, option, p) < 0) { + fclose(configfd); return (-1); + } break; case OT_INT: - if (set_option_int(filename, line, option, p) < 0) + if (set_option_int(filename, line, option, p) < 0) { + fclose(configfd); return (-1); + } break; case OT_SRV: - if (set_option_srv(filename, line, option, p) < 0) + if (set_option_srv(filename, line, option, p) < 0) { + fclose(configfd); return (-1); + } break; case OT_AUO: - if (set_option_auo(filename, line, option, p) < 0) + if (set_option_auo(filename, line, option, p) < 0) { + fclose(configfd); return (-1); + } break; default: fatal("rc_read_config: impossible case branch!"); @@ -271,8 +283,8 @@ char *rc_conf_str(char *optname) option = find_option(optname, OT_STR); if (option == NULL) - fatal("rc_conf_str: unkown config option requested: %s", optname); - return (char *)option->val; + fatal("rc_conf_str: unknown config option requested: %s", optname); + return (char *)option->val; } int rc_conf_int(char *optname) @@ -282,7 +294,7 @@ int rc_conf_int(char *optname) option = find_option(optname, OT_INT|OT_AUO); if (option == NULL) - fatal("rc_conf_int: unkown config option requested: %s", optname); + fatal("rc_conf_int: unknown config option requested: %s", optname); return *((int *)option->val); } @@ -293,7 +305,7 @@ SERVER *rc_conf_srv(char *optname) option = find_option(optname, OT_SRV); if (option == NULL) - fatal("rc_conf_srv: unkown config option requested: %s", optname); + fatal("rc_conf_srv: unknown config option requested: %s", optname); return (SERVER *)option->val; } @@ -480,26 +492,14 @@ int rc_find_server (char *server_name, UINT4 *ip_addr, char *secret) if ((h = strtok (buffer, " \t\n")) == NULL) /* first hostname */ continue; - memset (hostnm, '\0', AUTH_ID_LEN); - len = strlen (h); - if (len > AUTH_ID_LEN) - { - len = AUTH_ID_LEN; - } - strncpy (hostnm, h, (size_t) len); - hostnm[AUTH_ID_LEN] = '\0'; + memset (hostnm, '\0', AUTH_ID_LEN + 1); + strlcpy (hostnm, h, AUTH_ID_LEN + 1); if ((s = strtok (NULL, " \t\n")) == NULL) /* and secret field */ continue; - memset (secret, '\0', MAX_SECRET_LENGTH); - len = strlen (s); - if (len > MAX_SECRET_LENGTH) - { - len = MAX_SECRET_LENGTH; - } - strncpy (secret, s, (size_t) len); - secret[MAX_SECRET_LENGTH] = '\0'; + memset (secret, '\0', MAX_SECRET_LENGTH + 1); + strlcpy (secret, s, MAX_SECRET_LENGTH + 1); if (!strchr (hostnm, '/')) /* If single name form */ { @@ -535,7 +535,6 @@ int rc_find_server (char *server_name, UINT4 *ip_addr, char *secret) if (result == 0) { memset (buffer, '\0', sizeof (buffer)); - memset (secret, '\0', sizeof (secret)); error("rc_find_server: couldn't find RADIUS server %s in %s", server_name, rc_conf_str("servers")); return (-1);