PPP, EAP: removed malloc() and free()

Replaced pcb->eap.es_{client,server}.ea_peer pointer to a char table,
replaced strdup() with MEMCPY, etc.
This commit is contained in:
Sylvain Rochet 2015-02-28 20:29:40 +01:00
parent d884034c9f
commit 7f3913ff58
2 changed files with 20 additions and 35 deletions

View File

@ -115,7 +115,7 @@ enum eap_state_code {
struct eap_auth { struct eap_auth {
const char *ea_name; /* Our name */ const char *ea_name; /* Our name */
char *ea_peer; /* Peer's name */ char ea_peer[MAXNAMELEN +1]; /* Peer's name */
void *ea_session; /* Authentication library linkage */ void *ea_session; /* Authentication library linkage */
u_char *ea_skey; /* Shared encryption key */ u_char *ea_skey; /* Shared encryption key */
u_short ea_namelen; /* Length of our name */ u_short ea_namelen; /* Length of our name */

View File

@ -663,14 +663,19 @@ static void eap_send_request(ppp_pcb *pcb) {
pcb->eap.es_server.ea_state != eapInitial) { pcb->eap.es_server.ea_state != eapInitial) {
pcb->eap.es_server.ea_state = eapIdentify; pcb->eap.es_server.ea_state = eapIdentify;
#if PPP_REMOTENAME #if PPP_REMOTENAME
if (pcb->settings.explicit_remote) { if (pcb->settings.explicit_remote && pcb->remote_name) {
/* /*
* If we already know the peer's * If we already know the peer's
* unauthenticated name, then there's no * unauthenticated name, then there's no
* reason to ask. Go to next state instead. * reason to ask. Go to next state instead.
*/ */
pcb->eap.es_server.ea_peer = pcb->remote_name; int len = (int)strlen(pcb->remote_name);
pcb->eap.es_server.ea_peerlen = strlen(pcb->remote_name); if (len > MAXNAMELEN) {
len = MAXNAMELEN;
}
MEMCPY(pcb->eap.es_server.ea_peer, pcb->remote_name, len);
pcb->eap.es_server.ea_peer[len] = '\0';
pcb->eap.es_server.ea_peerlen = len;
eap_figure_next_state(pcb, 0); eap_figure_next_state(pcb, 0);
} }
#endif /* PPP_REMOTENAME */ #endif /* PPP_REMOTENAME */
@ -964,21 +969,6 @@ static void srp_lwrechallenge(void *arg) {
* thing. * thing.
*/ */
static void eap_lowerup(ppp_pcb *pcb) { static void eap_lowerup(ppp_pcb *pcb) {
/* Discard any (possibly authenticated) peer name. */
#if PPP_SERVER
if (pcb->eap.es_server.ea_peer != NULL
#if PPP_REMOTENAME
&& pcb->eap.es_server.ea_peer != pcb->remote_name
#endif /* PPP_REMOTENAME */
)
free(pcb->eap.es_server.ea_peer);
pcb->eap.es_server.ea_peer = NULL;
#endif /* PPP_SERVER */
if (pcb->eap.es_client.ea_peer != NULL)
free(pcb->eap.es_client.ea_peer);
pcb->eap.es_client.ea_peer = NULL;
pcb->eap.es_client.ea_state = eapClosed; pcb->eap.es_client.ea_state = eapClosed;
#if PPP_SERVER #if PPP_SERVER
pcb->eap.es_server.ea_state = eapClosed; pcb->eap.es_server.ea_state = eapClosed;
@ -1514,6 +1504,8 @@ static void eap_request(ppp_pcb *pcb, u_char *inp, int id, int len) {
/* No session key just yet */ /* No session key just yet */
pcb->eap.es_client.ea_skey = NULL; pcb->eap.es_client.ea_skey = NULL;
if (tc == NULL) { if (tc == NULL) {
int rhostnamelen;
GETCHAR(vallen, inp); GETCHAR(vallen, inp);
len--; len--;
if (vallen >= len) { if (vallen >= len) {
@ -1537,10 +1529,13 @@ static void eap_request(ppp_pcb *pcb, u_char *inp, int id, int len) {
sizeof (rhostname)); sizeof (rhostname));
} }
if (pcb->eap.es_client.ea_peer != NULL) rhostnamelen = (int)strlen(rhostname);
free(pcb->eap.es_client.ea_peer); if (rhostnamelen > MAXNAMELEN) {
pcb->eap.es_client.ea_peer = strdup(rhostname); rhostnamelen = MAXNAMELEN;
pcb->eap.es_client.ea_peerlen = strlen(rhostname); }
MEMCPY(pcb->eap.es_client.ea_peer, rhostname, rhostnamelen);
pcb->eap.es_client.ea_peer[rhostnamelen] = '\0';
pcb->eap.es_client.ea_peerlen = rhostnamelen;
GETCHAR(vallen, inp); GETCHAR(vallen, inp);
len--; len--;
@ -1741,7 +1736,6 @@ client_failure:
} }
#if PPP_SERVER #if PPP_SERVER
/* FIXME: remove malloc() and free() */
/* /*
* eap_response - Receive EAP Response message (server mode). * eap_response - Receive EAP Response message (server mode).
*/ */
@ -1784,17 +1778,8 @@ static void eap_response(ppp_pcb *pcb, u_char *inp, int id, int len) {
break; break;
} }
ppp_info("EAP: unauthenticated peer name \"%.*q\"", len, inp); ppp_info("EAP: unauthenticated peer name \"%.*q\"", len, inp);
if (pcb->eap.es_server.ea_peer != NULL if (len > MAXNAMELEN) {
#if PPP_REMOTENAME len = MAXNAMELEN;
&& pcb->eap.es_server.ea_peer != pcb->remote_name
#endif /* PPP_REMOTENAME */
)
free(pcb->eap.es_server.ea_peer);
pcb->eap.es_server.ea_peer = (char*)malloc(len + 1);
if (pcb->eap.es_server.ea_peer == NULL) {
pcb->eap.es_server.ea_peerlen = 0;
eap_figure_next_state(pcb, 1);
break;
} }
MEMCPY(pcb->eap.es_server.ea_peer, inp, len); MEMCPY(pcb->eap.es_server.ea_peer, inp, len);
pcb->eap.es_server.ea_peer[len] = '\0'; pcb->eap.es_server.ea_peer[len] = '\0';