summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey V. Lobanov <svlobanov@users.noreply.github.com>2025-09-06 22:59:45 +0300
committerGitHub <noreply@github.com>2025-09-06 22:59:45 +0300
commita1ea24c51af8f911cd776338cc19c0c9e4df27fa (patch)
tree4275da3278f5f7c22fb8431310f80617d352a5bf
parent5b876695127bafde4a35dd037831f7fe5f665dca (diff)
parentc1529bcf0f788ee61097a818fff3a8e27d473e61 (diff)
downloadaccel-ppp-a1ea24c51af8f911cd776338cc19c0c9e4df27fa.tar.gz
accel-ppp-a1ea24c51af8f911cd776338cc19c0c9e4df27fa.zip
Merge pull request #256 from svlobanov/asan-ubsan
ci: add tests execution with asan and ubsan
-rw-r--r--.github/workflows/run-tests-asan-ubsan.yml75
-rw-r--r--accel-pppd/ctrl/ipoe/dhcpv4.c4
-rw-r--r--accel-pppd/ctrl/ipoe/dhcpv4_options.c35
-rw-r--r--accel-pppd/ctrl/ipoe/ipoe.c2
-rw-r--r--accel-pppd/ppp/ppp_lcp.c3
5 files changed, 104 insertions, 15 deletions
diff --git a/.github/workflows/run-tests-asan-ubsan.yml b/.github/workflows/run-tests-asan-ubsan.yml
new file mode 100644
index 00000000..81fa2fb0
--- /dev/null
+++ b/.github/workflows/run-tests-asan-ubsan.yml
@@ -0,0 +1,75 @@
+name: Run tests with ASAN and UBSAN
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - master
+
+jobs:
+ Test-in-GH-ASAN-UBSAN:
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - distro: "ubuntu-latest"
+ sanitizer: "address"
+ env_name: "ASAN_OPTIONS"
+ env_value: "abort_on_error=1:detect_leaks=1:print_stacktrace=1"
+ - distro: "ubuntu-latest"
+ sanitizer: "undefined"
+ env_name: "UBSAN_OPTIONS"
+ env_value: "print_stacktrace=1"
+
+ runs-on: ${{ matrix.distro }}
+ steps:
+ - name: Install build tools (using apt)
+ run: >
+ sudo apt update &&
+ NEEDRESTART_SUSPEND=1 DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true sudo -E apt -y install
+ git build-essential cmake gcc linux-headers-`uname -r`
+ libpcre2-dev libssl-dev liblua5.1-0-dev kmod python3-pip
+ iproute2 ppp pppoe isc-dhcp-client
+
+ - name: Install testing tools (using pip)
+ run: >
+ sudo apt -y install python3-pytest python3-pytest-dependency python3-pytest-order ||
+ sudo pip3 install pytest pytest-dependency pytest-order ||
+ sudo pip3 install --break-system-packages pytest pytest-dependency pytest-order
+
+ - name: Check out repository code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: mkdir build
+ run: mkdir build
+
+ - name: cmake (with ${{ matrix.sanitizer }})
+ working-directory: ./build
+ run: >
+ CFLAGS="-fsanitize=${{ matrix.sanitizer }} -fno-sanitize-recover=all -fno-omit-frame-pointer -O2 -g"
+ LDFLAGS="-fsanitize=${{ matrix.sanitizer }}"
+ cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCMAKE_INSTALL_PREFIX=/usr
+ -DKDIR=/usr/src/linux-headers-`uname -r`
+ -DLUA=TRUE -DSHAPER=TRUE -DRADIUS=TRUE ..
+
+ - name: make && make install
+ working-directory: ./build
+ run: make && sudo make install
+
+ - name: Insert and check kernel modules (ipoe and vlan-mon)
+ # if: ${{ false }}
+ run: |
+ sudo insmod build/drivers/vlan_mon/driver/vlan_mon.ko
+ sudo insmod build/drivers/ipoe/driver/ipoe.ko
+ lsmod | grep ipoe
+ lsmod | grep vlan_mon
+
+ - name: Run tests
+ timeout-minutes: 5
+ working-directory: ./tests
+ env:
+ ${{ matrix.env_name }}: ${{ matrix.env_value }}
+ run: sudo -E python3 -m pytest -Wall --order-dependencies -v \ No newline at end of file
diff --git a/accel-pppd/ctrl/ipoe/dhcpv4.c b/accel-pppd/ctrl/ipoe/dhcpv4.c
index 1f77b418..d80a80f3 100644
--- a/accel-pppd/ctrl/ipoe/dhcpv4.c
+++ b/accel-pppd/ctrl/ipoe/dhcpv4.c
@@ -356,9 +356,9 @@ static int dhcpv4_parse_packet(struct dhcpv4_packet *pack, int len)
else if (opt->type == 62)
pack->client_id = opt;
else if (opt->type == 50)
- pack->request_ip = *(uint32_t *)opt->data;
+ memcpy(&pack->request_ip, opt->data, 4);
else if (opt->type == 54)
- pack->server_id = *(uint32_t *)opt->data;
+ memcpy(&pack->server_id, opt->data, 4);
}
if (pack->msg_type == 0 || pack->msg_type > 8)
diff --git a/accel-pppd/ctrl/ipoe/dhcpv4_options.c b/accel-pppd/ctrl/ipoe/dhcpv4_options.c
index 0175dee7..bffcfa5c 100644
--- a/accel-pppd/ctrl/ipoe/dhcpv4_options.c
+++ b/accel-pppd/ctrl/ipoe/dhcpv4_options.c
@@ -113,18 +113,28 @@ void dhcpv4_print_options(struct dhcpv4_packet *pack, void (*print)(const char *
static void print_int(const struct dhcpv4_option *opt, int elem_size, void (*print)(const char *fmt, ...))
{
- if (opt->len == 2)
- print("%i", ntohs(*(int16_t *)(opt->data)));
- else
- print("%i", ntohl(*(int32_t *)(opt->data)));
+ if (opt->len == 2) {
+ int16_t val;
+ memcpy(&val, opt->data, sizeof(val));
+ print("%i", ntohs(val));
+ } else {
+ int32_t val;
+ memcpy(&val, opt->data, sizeof(val));
+ print("%i", ntohl(val));
+ }
}
static void print_uint(const struct dhcpv4_option *opt, int elem_size, void (*print)(const char *fmt, ...))
{
- if (opt->len == 2)
- print("%u", ntohs(*(uint16_t *)(opt->data)));
- else
- print("%u", ntohl(*(uint32_t *)(opt->data)));
+ if (opt->len == 2) {
+ uint16_t val;
+ memcpy(&val, opt->data, sizeof(val));
+ print("%u", ntohs(val));
+ } else {
+ uint32_t val;
+ memcpy(&val, opt->data, sizeof(val));
+ print("%u", ntohl(val));
+ }
}
static void print_ip(const struct dhcpv4_option *opt, int elem_size, void (*print)(const char *fmt, ...))
@@ -133,7 +143,8 @@ static void print_ip(const struct dhcpv4_option *opt, int elem_size, void (*prin
uint32_t ip;
for (i = 0; i < n; i++) {
- ip = ntohl(*(uint32_t *)(opt->data + i*elem_size));
+ memcpy(&ip, opt->data + i*elem_size, sizeof(ip));
+ ip = ntohl(ip);
if (i)
print(",");
@@ -170,8 +181,10 @@ static void print_route(const struct dhcpv4_option *opt, int elem_size, void (*p
uint32_t ip, gw;
for (i = 0; i < n; i++) {
- ip = ntohl(*(uint32_t *)(opt->data + i*8));
- gw = ntohl(*(uint32_t *)(opt->data + i*8 + 4));
+ memcpy(&ip, opt->data + i*8, sizeof(ip));
+ memcpy(&gw, opt->data + i*8 + 4, sizeof(gw));
+ ip = ntohl(ip);
+ gw = ntohl(gw);
if (i)
print(",");
diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c
index 418b4f2a..6ce35a69 100644
--- a/accel-pppd/ctrl/ipoe/ipoe.c
+++ b/accel-pppd/ctrl/ipoe/ipoe.c
@@ -3483,7 +3483,7 @@ static void load_gw_addr(struct conf_sect_t *sect)
continue;
}
- a->mask1 = ((1 << a->mask) - 1) << (32 - a->mask);
+ a->mask1 = (int)(((1u << a->mask) - 1u) << (32 - a->mask));
list_add_tail(&a->entry, &conf_gw_addr);
}
}
diff --git a/accel-pppd/ppp/ppp_lcp.c b/accel-pppd/ppp/ppp_lcp.c
index c5f9f2de..62c0f897c 100644
--- a/accel-pppd/ppp/ppp_lcp.c
+++ b/accel-pppd/ppp/ppp_lcp.c
@@ -614,7 +614,8 @@ static void send_echo_reply(struct ppp_lcp_t *lcp)
lcp->last_echo_ts = _time();
hdr->code = ECHOREP;
- *(uint32_t *)(hdr + 1) = htonl(lcp->magic);
+ uint32_t magic = htonl(lcp->magic);
+ memcpy((char *)hdr + sizeof(struct lcp_hdr_t), &magic, sizeof(magic));
if (conf_ppp_verbose)
log_ppp_debug("send [LCP EchoRep id=%x <magic %08x>]\n", hdr->id, lcp->magic);