Skip to content

Commit

Permalink
PPP: Add test exhibiting empty packet null-deref
Browse files Browse the repository at this point in the history
Also updates lcp.c to compile with PPP_AUTH_SUPPORT=0 in clang

Picked from 202a07da
Patch posted https://savannah.nongnu.org/patch/?10179
Ref IDF-4797
  • Loading branch information
david-cermak committed Aug 16, 2022
1 parent b5934a2 commit 8a5a30d
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 3 deletions.
8 changes: 6 additions & 2 deletions src/netif/ppp/lcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1498,7 +1498,11 @@ static int lcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {
goto bad;
break;
case CI_AUTHTYPE:
if (0
/* This is potentially dead code (#if !PPP_AUTH_SUPPORT)
* Thus the double parantheses to mark the code explicitely
* disabled when building with clang
*/
if ((0
#if CHAP_SUPPORT
|| go->neg_chap || no.neg_chap
#endif /* CHAP_SUPPORT */
Expand All @@ -1508,7 +1512,7 @@ static int lcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {
#if EAP_SUPPORT
|| go->neg_eap || no.neg_eap
#endif /* EAP_SUPPORT */
)
))
goto bad;
break;
case CI_MAGICNUMBER:
Expand Down
1 change: 1 addition & 0 deletions test/unit/Filelists.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,5 @@ set(LWIP_TESTFILES
${LWIP_TESTDIR}/tcp/test_tcp.c
${LWIP_TESTDIR}/udp/test_udp.c
${LWIP_TESTDIR}/esp_platform_hooks.c
${LWIP_TESTDIR}/ppp/test_pppos.c
)
3 changes: 2 additions & 1 deletion test/unit/Filelists.mk
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,6 @@ TESTFILES=$(TESTDIR)/lwip_unittests.c \
$(TESTDIR)/tcp/test_tcp_state.c \
$(TESTDIR)/tcp/test_tcp.c \
$(TESTDIR)/udp/test_udp.c \
$(TESTDIR)/esp_platform_hooks.c
$(TESTDIR)/esp_platform_hooks.c \
$(TESTDIR)/ppp/test_pppos.c

4 changes: 4 additions & 0 deletions test/unit/lwip_unittests.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "mdns/test_mdns.h"
#include "mqtt/test_mqtt.h"
#include "api/test_sockets.h"
#include "ppp/test_pppos.h"

#include "lwip/init.h"
#if !NO_SYS
Expand Down Expand Up @@ -81,6 +82,9 @@ int main(void)
mdns_suite,
mqtt_suite,
sockets_suite,
#if PPP_SUPPORT && PPPOS_SUPPORT
pppos_suite,
#endif /* PPP_SUPPORT && PPPOS_SUPPORT */
#endif
ip4route_suite
};
Expand Down
4 changes: 4 additions & 0 deletions test/unit/lwipopts.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@
#define LWIP_MDNS_RESPONDER 1
#define LWIP_NUM_NETIF_CLIENT_DATA (LWIP_MDNS_RESPONDER)

/* Enable PPP and PPPOS support for PPPOS test suites */
#define PPP_SUPPORT 1
#define PPPOS_SUPPORT 1

/* Minimal changes to opt.h required for etharp unit tests: */
#define ETHARP_SUPPORT_STATIC_ENTRIES 1

Expand Down
64 changes: 64 additions & 0 deletions test/unit/ppp/test_pppos.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include "test_pppos.h"

#include "lwip/netif.h"
#include "netif/ppp/pppos.h"
#include "netif/ppp/ppp.h"

#if PPP_SUPPORT && PPPOS_SUPPORT
static struct netif pppos_netif;
static ppp_pcb *ppp;

static u32_t ppp_output_cb(struct ppp_pcb_s *pcb, u8_t *data, u32_t len, void *ctx)
{
LWIP_UNUSED_ARG(pcb);
LWIP_UNUSED_ARG(data);
LWIP_UNUSED_ARG(len);
LWIP_UNUSED_ARG(ctx);

return 0;
}

static void ppp_link_status_cb(ppp_pcb *pcb, int err_code, void *ctx)
{
LWIP_UNUSED_ARG(pcb);
LWIP_UNUSED_ARG(err_code);
LWIP_UNUSED_ARG(ctx);
}

static void pppos_setup(void)
{
ppp = pppos_create(&pppos_netif, ppp_output_cb, ppp_link_status_cb, NULL);
fail_if(ppp == NULL);
ppp_connect(ppp, 0);
}

static void pppos_teardown(void)
{
}

START_TEST(test_pppos_empty_packet_with_valid_fcs)
{
u8_t two_breaks[] = { 0x7e, 0, 0, 0x7e };
u8_t other_packet[] = { 0x7e, 0x7d, 0x20, 0x00, 0x7e };
/* Set internal states of the underlying pcb */
pppos_pcb *pppos = (pppos_pcb *)ppp->link_ctx_cb;
pppos->open = 1; /* Pretend the connection is open already */
pppos->in_accm[0] = 0xf0; /* Make sure 0x0's are not escaped chars */

pppos_input(ppp, two_breaks, sizeof(two_breaks));
pppos_input(ppp, other_packet, sizeof(other_packet));

}
END_TEST

/** Create the suite including all tests for this module */
Suite *
pppos_suite(void)
{
testfunc tests[] = {
TESTFUNC(test_pppos_empty_packet_with_valid_fcs)
};
return create_suite("PPPOS", tests, sizeof(tests)/sizeof(testfunc), pppos_setup, pppos_teardown);
}

#endif /* PPP_SUPPORT && PPPOS_SUPPORT */
13 changes: 13 additions & 0 deletions test/unit/ppp/test_pppos.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef LWIP_HDR_TEST_PPPOS_H
#define LWIP_HDR_TEST_PPPOS_H

#include "../lwip_check.h"
#include "netif/ppp/ppp.h"

#if PPP_SUPPORT && PPPOS_SUPPORT

Suite* pppos_suite(void);

#endif /* PPP_SUPPORT && PPPOS_SUPPORT */

#endif /* LWIP_HDR_TEST_PPPOS_H */

0 comments on commit 8a5a30d

Please sign in to comment.