diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index f97d23c9..2f2413cd 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -3,6 +3,8 @@ name: CI on: push: branches: [master] + pull_request: + branches: '*' jobs: build: @@ -15,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install deps run: sudo apt-get install check ninja-build doxygen diff --git a/.github/workflows/codeql-buildscript.sh b/.github/workflows/codeql-buildscript.sh new file mode 100644 index 00000000..7e5ae810 --- /dev/null +++ b/.github/workflows/codeql-buildscript.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +sudo apt-get install check ninja-build doxygen +cp contrib/examples/example_app/lwipcfg.h.ci contrib/examples/example_app/lwipcfg.h +make -C contrib/ports/unix/check +mkdir build && cd build && cmake .. -G Ninja && cmake --build . diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..0876355f --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,124 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + branches: '*' + +jobs: + analyze: + name: Analyze + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners + # Consider using larger runners for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-20.04' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'cpp' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] + # Use only 'java' to analyze code written in Java, Kotlin or both + # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + queries: security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). + # If this step fails, then you should remove it and run the build manually (see below) + #- name: Autobuild + # uses: github/codeql-action/autobuild@v3 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + - run: | + ./.github/workflows/codeql-buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" + upload: false + id: step1 + + # Filter out rules with low severity or high false positve rate + # Also filter out warnings in third-party code + - name: Filter out unwanted errors and warnings + uses: advanced-security/filter-sarif@v1 + with: + patterns: | + -**:cpp/path-injection + -**:cpp/world-writable-file-creation + -**:cpp/poorly-documented-function + -**:cpp/potentially-dangerous-function + -**:cpp/use-of-goto + -**:cpp/integer-multiplication-cast-to-long + -**:cpp/comparison-with-wider-type + -**:cpp/leap-year/* + -**:cpp/ambiguously-signed-bit-field + -**:cpp/suspicious-pointer-scaling + -**:cpp/suspicious-pointer-scaling-void + -**:cpp/unsigned-comparison-zero + -**/cmake*/Modules/** + input: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif + + - name: Upload CodeQL results to code scanning + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: ${{ steps.step1.outputs.sarif-output }} + category: "/language:${{matrix.language}}" + + - name: Upload CodeQL results as an artifact + if: success() || failure() + uses: actions/upload-artifact@v4 + with: + name: codeql-results + path: ${{ steps.step1.outputs.sarif-output }} + retention-days: 5 + + - name: Fail if an error is found + run: | + ./.github/workflows/fail_on_error.py \ + ${{ steps.step1.outputs.sarif-output }}/cpp.sarif diff --git a/.github/workflows/fail_on_error.py b/.github/workflows/fail_on_error.py new file mode 100755 index 00000000..29791742 --- /dev/null +++ b/.github/workflows/fail_on_error.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +import json +import sys + +# Return whether SARIF file contains error-level results +def codeql_sarif_contain_error(filename): + with open(filename, 'r') as f: + s = json.load(f) + + for run in s.get('runs', []): + rules_metadata = run['tool']['driver']['rules'] + if not rules_metadata: + rules_metadata = run['tool']['extensions'][0]['rules'] + + for res in run.get('results', []): + if 'ruleIndex' in res: + rule_index = res['ruleIndex'] + elif 'rule' in res and 'index' in res['rule']: + rule_index = res['rule']['index'] + else: + continue + try: + rule_level = rules_metadata[rule_index]['defaultConfiguration']['level'] + except IndexError as e: + print(e, rule_index, len(rules_metadata)) + else: + if rule_level == 'error': + return True + return False + +if __name__ == "__main__": + if codeql_sarif_contain_error(sys.argv[1]): + sys.exit(1) diff --git a/.gitignore b/.gitignore index 2fbaca4f..6062b849 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.exe *lwip_unittests.xml *.suo +*.swp *.log .depend* @@ -35,8 +36,14 @@ /contrib/ports/win32/msvc/Debug /contrib/ports/win32/msvc/Debug unittests +/contrib/ports/win32/msvc/Debug fuzz +/contrib/ports/win32/msvc/Debug fuzz2 +/contrib/ports/win32/msvc/Debug fuzz3 /contrib/ports/win32/msvc/Release /contrib/ports/win32/msvc/Release unittests +/contrib/ports/win32/msvc/Release fuzz +/contrib/ports/win32/msvc/Release fuzz2 +/contrib/ports/win32/msvc/x64 /contrib/ports/win32/msvc/*.user /contrib/ports/win32/msvc/*.ncb /contrib/ports/win32/msvc/*.cache diff --git a/CHANGELOG b/CHANGELOG index 5d5f81ad..90a5834c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,58 @@ HISTORY * [Enter new changes just after this line - do not remove this line] +(STABLE-2.2.1): + + ++ New features: + + 2023-10-11: Faidon Liambotis + * Add MEM_CUSTOM_ALLOCATOR and make LIBC a subset of it + + 2023-09-29: Jiri Findejs + * mqtt: support binary Will Message + + ++ Bugfixes: + + 2024-02-19: Simon Goldschmidt + * tcpip: fix that TCPIP_CORE_LOCK is not released for LWIP_TIMERS==0 + + 2024-01-09: Simon Goldschmidt + * snmp v3, ppp: prevent possible timing attacks by using a constant-runtime-memcmp when + checking credentials + + 2023-01-04: Simon Goldschmidt + * makefsdata: update tinydir.h to newest version (1.2.6) + + 2023-10-12: Borys Szefler + * dhcp: fix memory corruption when LWIP_DHCP_MAX_DNS_SERVERS > DNS_MAX_SERVERS + + 2023-10-11: Mazakazu + * sockets: fix socket leak when using setsockopt/getsockopt hook with LWIP_NETCONN_FULLDUPLEX==1 + + 2023-10-10: Simon Goldschmidt + * sockets: fix bug #63898: allow socket option IPV6_CHECKSUM for both IPPROTO_IPV6 and IPPROTO_RAW + + 2023-10-10: Simon Goldschmidt + * ipv6: fix ip6_current_header() after reassembly + + 2023-10-07: Simon Goldschmidt + * ipv6 reassembly: fix detecting holes in reassembled packets + + 2023-10-04: Simon Goldschmidt + * apps: http client: improve the HTTP client; ensure connection settings are passed + + 2023-10-03: Simon Goldschmidt + * ipv6: frag: fix bogus icmp6 response on reassembly timeout + + 2023-09-28: Szabolcs Szekelyi + * httpd: ensure headers are parsed case-insensitive + + 2023-09-28: Erik Ekman + * Fix ND6 Router Advertisement parsing when NETIF_MAX_HWADDR_LEN is above 6. + + 2023-09-27: Hardy Griech + * Fix iperf byte counting mode + (STABLE-2.2.0): 2018-10-02: Dirk Ziegelmeier diff --git a/CMakeLists.txt b/CMakeLists.txt index 55fc44a1..62a2c102 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ set (LWIP_DEFINITIONS LWIP_DEBUG=1) if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") add_subdirectory(${LWIP_DIR}/contrib/ports/win32/example_app) -elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") +elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") add_subdirectory(${LWIP_DIR}/contrib/ports/unix/example_app) else() message(WARNING "Host ${CMAKE_SYSTEM_NAME} is not supported to build example_app") @@ -29,7 +29,9 @@ include(CPack) # Generate docs before creating source package include(src/Filelists.cmake) -add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source) -if (TARGET lwipdocs) - add_dependencies(dist lwipdocs) +if (NOT TARGET dist) + add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source) + if (TARGET lwipdocs) + add_dependencies(dist lwipdocs) + endif() endif() diff --git a/UPGRADING b/UPGRADING index 0d357906..ac77cf58 100644 --- a/UPGRADING +++ b/UPGRADING @@ -10,6 +10,7 @@ with newer versions. * The eth_addr_cmp and ip_addr_cmp set of functions have been renamed to eth_addr_eq, ip_addr_eq and so on, since they return non-zero on equality. Macros for the old names exist. * The sio_write function used by PPP now takes the data argument as const. + * The prev field in the snmp_varbind struct has been removed. (2.2.0) diff --git a/codespell_check.sh b/codespell_check.sh index 7d8d0dfb..b3c2a169 100755 --- a/codespell_check.sh +++ b/codespell_check.sh @@ -39,7 +39,9 @@ CODESPELL_OPTS="-q 2" # Disable "WARNING: Binary file" CODESPELL_OPTS+=" --check-hidden" # Disable false positives "nd => and, 2nd", "ans => and", "tolen => token", # "ofo => of", "WAN => WANT", "mut => must, mutt, moot" -CODESPELL_OPTS+=" --ignore-words-list=nd,ans,tolen,ofo,wan,mut " +CODESPELL_OPTS+=" --ignore-words-list=nd,ans,tolen,ofo,wan,mut,clen,useg,clos " +CODESPELL_OPTS+=" --ignore-words-list=devine,clinet,linz,garantie,explicite,numer " +CODESPELL_OPTS+=" --ignore-words-list=skool " # propagate all options to codespell -> pass "-w" to this script to write changes CODESPELL_OPTS+="$@" diff --git a/contrib/apps/ping/ping.c b/contrib/apps/ping/ping.c index 143fb83e..ceb97396 100644 --- a/contrib/apps/ping/ping.c +++ b/contrib/apps/ping/ping.c @@ -268,7 +268,7 @@ ping_thread(void *arg) LWIP_ASSERT("setting receive timeout failed", ret == 0); LWIP_UNUSED_ARG(ret); - while (1) { + while (ping_target != NULL) { if (ping_send(s, ping_target) == ERR_OK) { LWIP_DEBUGF( PING_DEBUG, ("ping: send ")); ip_addr_debug_print(PING_DEBUG, ping_target); @@ -285,6 +285,7 @@ ping_thread(void *arg) } sys_msleep(PING_DELAY); } + lwip_close(s); } #else /* PING_USE_SOCKETS */ @@ -297,10 +298,11 @@ ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *addr) LWIP_UNUSED_ARG(arg); LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(addr); + LWIP_ASSERT("addr != NULL", addr != NULL); LWIP_ASSERT("p != NULL", p != NULL); - if ((p->tot_len >= (PBUF_IP_HLEN + sizeof(struct icmp_echo_hdr))) && - pbuf_remove_header(p, PBUF_IP_HLEN) == 0) { + if ((p->tot_len >= (IP_HLEN + sizeof(struct icmp_echo_hdr))) && + pbuf_remove_header(p, IP_HLEN) == 0) { iecho = (struct icmp_echo_hdr *)p->payload; if ((iecho->id == PING_ID) && (iecho->seqno == lwip_htons(ping_seq_num))) { @@ -314,7 +316,7 @@ ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *addr) return 1; /* eat the packet */ } /* not eaten, restore original packet */ - pbuf_add_header(p, PBUF_IP_HLEN); + pbuf_add_header(p, IP_HLEN); } return 0; /* don't eat the packet */ @@ -376,14 +378,33 @@ void ping_send_now(void) { LWIP_ASSERT("ping_pcb != NULL", ping_pcb != NULL); + LWIP_ASSERT("ping_target != NULL", ping_target != NULL); ping_send(ping_pcb, ping_target); } +static void +ping_raw_stop(void) +{ + sys_untimeout(ping_timeout, ping_pcb); + if (ping_pcb != NULL) { + raw_remove(ping_pcb); + ping_pcb = NULL; + } +} + #endif /* PING_USE_SOCKETS */ +/** + * Initialize thread (socket mode) or timer (callback mode) to cyclically send pings + * to a target. + * Running ping is implicitly stopped. + */ void ping_init(const ip_addr_t* ping_addr) { + ping_stop(); + + LWIP_ASSERT("ping_addr != NULL", ping_addr != NULL); ping_target = ping_addr; #if PING_USE_SOCKETS @@ -393,4 +414,15 @@ ping_init(const ip_addr_t* ping_addr) #endif /* PING_USE_SOCKETS */ } +/** + * Stop sending more pings. + */ +void ping_stop(void) +{ +#if !PING_USE_SOCKETS + ping_raw_stop(); +#endif /* !PING_USE_SOCKETS */ + ping_target = NULL; +} + #endif /* LWIP_RAW */ diff --git a/contrib/apps/ping/ping.h b/contrib/apps/ping/ping.h index 1f21c7b0..b6e06080 100644 --- a/contrib/apps/ping/ping.h +++ b/contrib/apps/ping/ping.h @@ -11,6 +11,7 @@ #endif void ping_init(const ip_addr_t* ping_addr); +void ping_stop(void); #if !PING_USE_SOCKETS void ping_send_now(void); diff --git a/contrib/examples/example_app/lwipopts.h b/contrib/examples/example_app/lwipopts.h index ea2ca4bd..410b922c 100644 --- a/contrib/examples/example_app/lwipopts.h +++ b/contrib/examples/example_app/lwipopts.h @@ -130,7 +130,7 @@ a lot of data that needs to be copied, this should be set high. */ /* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One per active UDP "connection". */ #define MEMP_NUM_UDP_PCB 8 -/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP +/* MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections. */ #define MEMP_NUM_TCP_PCB 5 /* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP @@ -139,7 +139,7 @@ a lot of data that needs to be copied, this should be set high. */ /* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. */ #define MEMP_NUM_TCP_SEG 16 -/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active +/* MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. */ #define MEMP_NUM_SYS_TIMEOUT 17 diff --git a/contrib/examples/mqtt/mqtt_example.c b/contrib/examples/mqtt/mqtt_example.c index bb277d6f..9cf188df 100644 --- a/contrib/examples/mqtt/mqtt_example.c +++ b/contrib/examples/mqtt/mqtt_example.c @@ -54,6 +54,7 @@ static const struct mqtt_connect_client_info_t mqtt_client_info = 100, /* keep alive */ NULL, /* will_topic */ NULL, /* will_msg */ + 0, /* will_msg_len */ 0, /* will_qos */ 0 /* will_retain */ #if LWIP_ALTCP && LWIP_ALTCP_TLS diff --git a/contrib/examples/tftp/tftp_example.c b/contrib/examples/tftp/tftp_example.c index 3e140146..f6a28b4f 100644 --- a/contrib/examples/tftp/tftp_example.c +++ b/contrib/examples/tftp/tftp_example.c @@ -141,6 +141,7 @@ tftp_example_init_client(void) ip_addr_t srv; int ret = ipaddr_aton(LWIP_TFTP_EXAMPLE_CLIENT_REMOTEIP, &srv); LWIP_ASSERT("ipaddr_aton failed", ret == 1); + LWIP_UNUSED_ARG(ret); err = tftp_init_client(&tftp); LWIP_ASSERT("tftp_init_client failed", err == ERR_OK); diff --git a/contrib/ports/unix/lib/lwipopts.h b/contrib/ports/unix/lib/lwipopts.h index 231fc779..79319a1c 100644 --- a/contrib/ports/unix/lib/lwipopts.h +++ b/contrib/ports/unix/lib/lwipopts.h @@ -109,7 +109,7 @@ #define MEMP_NUM_UDP_PCB 4 /** - * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. + * MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections. * (requires the LWIP_TCP option) */ #define MEMP_NUM_TCP_PCB 4 @@ -133,7 +133,7 @@ #define MEMP_NUM_REASSDATA 1 /** - * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing + * MEMP_NUM_ARP_QUEUE: the number of simultaneously queued outgoing * packets (pbufs) that are waiting for an ARP request (to resolve * their destination address) to finish. * (requires the ARP_QUEUEING option) @@ -141,7 +141,7 @@ #define MEMP_NUM_ARP_QUEUE 2 /** - * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. + * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. * (requires NO_SYS==0) */ #define MEMP_NUM_SYS_TIMEOUT 8 @@ -238,7 +238,7 @@ /** * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP * fragmentation. Otherwise pbufs are allocated and reference the original - * packet data to be fragmented. + * packet data to be fragmented. */ #define IP_FRAG_USES_STATIC_BUF 0 @@ -341,7 +341,7 @@ */ #define LWIP_TCP 1 -#define LWIP_LISTEN_BACKLOG 0 +#define TCP_LISTEN_BACKLOG 0 /* ---------------------------------- @@ -359,7 +359,6 @@ * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is * designed to accommodate single full size TCP frame in one pbuf, including * TCP_MSS, IP header, and link header. -* */ #define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) diff --git a/contrib/ports/unix/port/include/arch/cc.h b/contrib/ports/unix/port/include/arch/cc.h index 7be900bf..a072f60f 100644 --- a/contrib/ports/unix/port/include/arch/cc.h +++ b/contrib/ports/unix/port/include/arch/cc.h @@ -41,6 +41,8 @@ #define LWIP_UNIX_MACH #elif defined __OpenBSD__ #define LWIP_UNIX_OPENBSD +#elif defined __FreeBSD__ +#define LWIP_UNIX_FREEBSD #elif defined __FreeBSD_kernel__ && __GLIBC__ #define LWIP_UNIX_KFREEBSD #elif defined __CYGWIN__ @@ -52,6 +54,10 @@ #define LWIP_TIMEVAL_PRIVATE 0 #include +#ifdef __cplusplus +extern "C" { +#endif + #define LWIP_ERRNO_INCLUDE #if defined(LWIP_UNIX_LINUX) || defined(LWIP_UNIX_HURD) || defined(LWIP_UNIX_KFREEBSD) @@ -86,4 +92,8 @@ typedef struct sio_status_s sio_status_t; typedef unsigned int sys_prot_t; +#ifdef __cplusplus +} +#endif + #endif /* LWIP_ARCH_CC_H */ diff --git a/contrib/ports/unix/port/include/arch/perf.h b/contrib/ports/unix/port/include/arch/perf.h index 364f3164..112a3478 100644 --- a/contrib/ports/unix/port/include/arch/perf.h +++ b/contrib/ports/unix/port/include/arch/perf.h @@ -34,6 +34,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + #ifdef PERF #define PERF_START { \ unsigned long __c1l, __c1h, __c2l, __c2h; \ @@ -60,4 +64,8 @@ void perf_print_times(struct tms *start, struct tms *end, char *key); void perf_init(char *fname); +#ifdef __cplusplus +} +#endif + #endif /* LWIP_ARCH_PERF_H */ diff --git a/contrib/ports/unix/port/include/arch/sys_arch.h b/contrib/ports/unix/port/include/arch/sys_arch.h index 567e1256..eb6d1d3e 100644 --- a/contrib/ports/unix/port/include/arch/sys_arch.h +++ b/contrib/ports/unix/port/include/arch/sys_arch.h @@ -32,6 +32,10 @@ #ifndef LWIP_ARCH_SYS_ARCH_H #define LWIP_ARCH_SYS_ARCH_H +#ifdef __cplusplus +extern "C" { +#endif + #define SYS_MBOX_NULL NULL #define SYS_SEM_NULL NULL @@ -87,4 +91,8 @@ void sys_unlock_tcpip_core(void); #define UNLOCK_TCPIP_CORE() sys_unlock_tcpip_core() #endif +#ifdef __cplusplus +} +#endif + #endif /* LWIP_ARCH_SYS_ARCH_H */ diff --git a/contrib/ports/unix/port/include/netif/fifo.h b/contrib/ports/unix/port/include/netif/fifo.h index bda352a7..7c87c829 100644 --- a/contrib/ports/unix/port/include/netif/fifo.h +++ b/contrib/ports/unix/port/include/netif/fifo.h @@ -3,6 +3,10 @@ #include "lwip/sys.h" +#ifdef __cplusplus +extern "C" { +#endif + /** How many bytes in fifo */ #define FIFOSIZE 2048 @@ -50,5 +54,9 @@ void fifoPut(fifo_t * fifo, int fd); */ void fifoInit(fifo_t * fifo); +#ifdef __cplusplus +} +#endif + #endif diff --git a/contrib/ports/unix/port/include/netif/list.h b/contrib/ports/unix/port/include/netif/list.h index 2c4d142a..8c0fe256 100644 --- a/contrib/ports/unix/port/include/netif/list.h +++ b/contrib/ports/unix/port/include/netif/list.h @@ -2,6 +2,10 @@ #ifndef LWIP_LIST_H #define LWIP_LIST_H +#ifdef __cplusplus +extern "C" { +#endif + struct elem; struct list { @@ -23,4 +27,8 @@ void list_delete(struct list *list); int list_remove(struct list *list, void *elem); void list_map(struct list *list, void (* func)(void *arg)); +#ifdef __cplusplus +} +#endif + #endif diff --git a/contrib/ports/unix/port/include/netif/pcapif.h b/contrib/ports/unix/port/include/netif/pcapif.h index ef7abd5f..a9e19720 100644 --- a/contrib/ports/unix/port/include/netif/pcapif.h +++ b/contrib/ports/unix/port/include/netif/pcapif.h @@ -34,6 +34,14 @@ #include "lwip/netif.h" +#ifdef __cplusplus +extern "C" { +#endif + err_t pcapif_init(struct netif *netif); +#ifdef __cplusplus +} +#endif + #endif /* LWIP_PCAPIF_H */ diff --git a/contrib/ports/unix/port/include/netif/sio.h b/contrib/ports/unix/port/include/netif/sio.h index b9ff131b..cb992f86 100644 --- a/contrib/ports/unix/port/include/netif/sio.h +++ b/contrib/ports/unix/port/include/netif/sio.h @@ -6,6 +6,10 @@ #include "netif/fifo.h" /*#include "netif/pppif.h"*/ +#ifdef __cplusplus +extern "C" { +#endif + struct sio_status_s { int fd; fifo_t myfifo; @@ -56,5 +60,9 @@ void sio_flush( sio_status_t * siostat ); */ void sio_change_baud( sioBaudrates baud, sio_status_t * siostat ); +#ifdef __cplusplus +} +#endif + #endif diff --git a/contrib/ports/unix/port/include/netif/tapif.h b/contrib/ports/unix/port/include/netif/tapif.h index 4c0fa6b3..c156e1db 100644 --- a/contrib/ports/unix/port/include/netif/tapif.h +++ b/contrib/ports/unix/port/include/netif/tapif.h @@ -34,10 +34,18 @@ #include "lwip/netif.h" +#ifdef __cplusplus +extern "C" { +#endif + err_t tapif_init(struct netif *netif); void tapif_poll(struct netif *netif); #if NO_SYS int tapif_select(struct netif *netif); #endif /* NO_SYS */ +#ifdef __cplusplus +} +#endif + #endif /* LWIP_TAPIF_H */ diff --git a/contrib/ports/unix/port/include/netif/vdeif.h b/contrib/ports/unix/port/include/netif/vdeif.h index 01df2d14..e3183924 100644 --- a/contrib/ports/unix/port/include/netif/vdeif.h +++ b/contrib/ports/unix/port/include/netif/vdeif.h @@ -34,10 +34,18 @@ #include "lwip/netif.h" +#ifdef __cplusplus +extern "C" { +#endif + err_t vdeif_init(struct netif *netif); void vdeif_poll(struct netif *netif); #if NO_SYS int vdeif_select(struct netif *netif); #endif /* NO_SYS */ +#ifdef __cplusplus +} +#endif + #endif /* LWIP_VDEIF_H */ diff --git a/contrib/ports/unix/port/netif/sio.c b/contrib/ports/unix/port/netif/sio.c index 8d8be9be..41bbba5d 100644 --- a/contrib/ports/unix/port/netif/sio.c +++ b/contrib/ports/unix/port/netif/sio.c @@ -1,7 +1,10 @@ /* Author: Magnus Ivarsson */ /* to get rid of implicit function declarations */ +#ifndef __FreeBSD__ +/* defining this on FreeBSD hides non-standard defines that sio.c depends on */ #define _XOPEN_SOURCE 600 +#endif #define _GNU_SOURCE /* build with Darwin C extensions not part of POSIX, i.e. FASYNC, SIGIO. @@ -35,8 +38,10 @@ #include #include -#if defined(LWIP_UNIX_OPENBSD) +#if defined(LWIP_UNIX_OPENBSD) || defined(LWIP_UNIX_MACH) #include +#elif defined(LWIP_UNIX_FREEBSD) +#include #endif #include #include diff --git a/contrib/ports/unix/posixlib/CMakeLists.txt b/contrib/ports/unix/posixlib/CMakeLists.txt index cf35f7e7..ee8af054 100644 --- a/contrib/ports/unix/posixlib/CMakeLists.txt +++ b/contrib/ports/unix/posixlib/CMakeLists.txt @@ -84,7 +84,7 @@ install(DIRECTORY "${LWIP_DIR}/contrib/ports/unix/port/include/netif" FILES_MATCHING PATTERN "*.h" ) -install(DIRECTORY "${LWIP_DIR}/contrib/ports/unix/linuxlib/include/posix" +install(DIRECTORY "${LWIP_DIR}/contrib/ports/unix/posixlib/include/posix" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lwip" FILES_MATCHING PATTERN "*.h" ) diff --git a/contrib/ports/unix/posixlib/include/posix/sockets.h b/contrib/ports/unix/posixlib/include/posix/sockets.h index f3900666..2370bb7f 100644 --- a/contrib/ports/unix/posixlib/include/posix/sockets.h +++ b/contrib/ports/unix/posixlib/include/posix/sockets.h @@ -120,7 +120,7 @@ const char *lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size); int lwip_inet_pton(int af, const char *src, void *dst); #endif -/* Unsuported indetifiers */ +/* Unsupported identifiers */ #ifndef SO_NO_CHECK #define SO_NO_CHECK 0xFF #endif diff --git a/contrib/ports/win32/include/arch/cc.h b/contrib/ports/win32/include/arch/cc.h index 0a0c0321..ded66c60 100644 --- a/contrib/ports/win32/include/arch/cc.h +++ b/contrib/ports/win32/include/arch/cc.h @@ -80,7 +80,11 @@ typedef int sys_prot_t; #define S16_F "hd" #define X16_F "hx" +#ifdef _WIN64 +#define SZT_F "llu" +#else #define SZT_F "lu" +#endif #endif /* _MSC_VER */ /* Compiler hints for packing structures */ diff --git a/contrib/ports/win32/msvc/libcheck.vcxproj b/contrib/ports/win32/msvc/libcheck.vcxproj index c33fdab6..dc4fe459 100644 --- a/contrib/ports/win32/msvc/libcheck.vcxproj +++ b/contrib/ports/win32/msvc/libcheck.vcxproj @@ -5,14 +5,23 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {EBB156DC-01BF-47B2-B69C-1A750B6B5F09} libcheck + 10.0 @@ -21,20 +30,37 @@ true v143 + + StaticLibrary + MultiByte + true + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + + + + + + + <_ProjectFileVersion>10.0.40219.1 @@ -43,6 +69,14 @@ $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + Disabled @@ -55,6 +89,17 @@ EditAndContinue + + + Disabled + ..\check;..\..\..\..\..\check\src;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;HAVE_CONFIG_H;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level3 + ProgramDatabase + + MaxSpeed @@ -67,6 +112,18 @@ ProgramDatabase + + + MaxSpeed + true + ..\check;..\..\..\..\..\check\src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreaded + true + Level3 + ProgramDatabase + + diff --git a/contrib/ports/win32/msvc/lwIP.vcxproj b/contrib/ports/win32/msvc/lwIP.vcxproj index 5e7587f1..0184b290 100644 --- a/contrib/ports/win32/msvc/lwIP.vcxproj +++ b/contrib/ports/win32/msvc/lwIP.vcxproj @@ -1,25 +1,58 @@  + + Debug fuzz + Win32 + + + Debug fuzz + x64 + Debug unittests Win32 + + Debug unittests + x64 + Debug Win32 + + Debug + x64 + + + Release fuzz + Win32 + + + Release fuzz + x64 + Release unittests Win32 + + Release unittests + x64 + Release Win32 + + Release + x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28} + 10.0 @@ -28,24 +61,72 @@ MultiByte v143 + + StaticLibrary + false + MultiByte + v143 + + + StaticLibrary + false + MultiByte + v143 + + + StaticLibrary + false + MultiByte + v143 + StaticLibrary false MultiByte v143 + + StaticLibrary + false + MultiByte + v143 + + + StaticLibrary + false + MultiByte + v143 + + + StaticLibrary + false + MultiByte + v143 + StaticLibrary false MultiByte v143 + + StaticLibrary + false + MultiByte + v143 + StaticLibrary false MultiByte v143 + + StaticLibrary + false + MultiByte + v143 + @@ -53,30 +134,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + $(Platform)\$(Configuration)\$(ProjectName)\ + MaxSpeed @@ -101,6 +242,30 @@ true + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + Disabled @@ -125,6 +290,30 @@ true + + + Disabled + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + Disabled @@ -149,6 +338,78 @@ true + + + Disabled + ..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + EditAndContinue + Default + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + MaxSpeed @@ -173,50 +434,178 @@ true + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + true + true + true + true true + true true + true + true + true true + true Document true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true Document true + true + true + true true + true true + true + true + true true + true Document @@ -224,9 +613,17 @@ Document true + true + true + true true + true true + true + true + true true + true @@ -243,17 +640,33 @@ true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true true + true + true + true true + true @@ -266,15 +679,31 @@ ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) @@ -362,9 +791,17 @@ true + true + true + true true + true true + true + true + true true + true @@ -393,15 +830,25 @@ ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) + ..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories) true + true true + true diff --git a/contrib/ports/win32/msvc/lwIP_Test.sln b/contrib/ports/win32/msvc/lwIP_Test.sln index ce59abd2..a6b89dfb 100644 --- a/contrib/ports/win32/msvc/lwIP_Test.sln +++ b/contrib/ports/win32/msvc/lwIP_Test.sln @@ -1,5 +1,7 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C++ Express 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34031.279 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP_Test", "lwIP_Test.vcxproj", "{8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP pcapif", "lwIP_pcapif.vcxproj", "{6F44E49E-9F21-4144-91EC-53B92AEF62CE}" @@ -11,25 +13,43 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Debug|Win32.ActiveCfg = Debug|Win32 {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Debug|Win32.Build.0 = Debug|Win32 + {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Debug|x64.ActiveCfg = Debug|x64 + {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Debug|x64.Build.0 = Debug|x64 {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Release|Win32.ActiveCfg = Release|Win32 {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Release|Win32.Build.0 = Release|Win32 + {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Release|x64.ActiveCfg = Release|x64 + {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Release|x64.Build.0 = Release|x64 {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Debug|Win32.ActiveCfg = Debug|Win32 {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Debug|Win32.Build.0 = Debug|Win32 + {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Debug|x64.ActiveCfg = Debug|x64 + {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Debug|x64.Build.0 = Debug|x64 {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Release|Win32.ActiveCfg = Release|Win32 {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Release|Win32.Build.0 = Release|Win32 + {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Release|x64.ActiveCfg = Release|x64 + {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Release|x64.Build.0 = Release|x64 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.ActiveCfg = Debug|Win32 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.Build.0 = Debug|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x64.ActiveCfg = Debug|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x64.Build.0 = Debug|x64 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.ActiveCfg = Release|Win32 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.Build.0 = Release|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x64.ActiveCfg = Release|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x64.Build.0 = Release|x64 {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Debug|Win32.ActiveCfg = Debug|Win32 {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Debug|Win32.Build.0 = Debug|Win32 + {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Debug|x64.ActiveCfg = Debug|x64 + {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Debug|x64.Build.0 = Debug|x64 {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Release|Win32.ActiveCfg = Release|Win32 {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Release|Win32.Build.0 = Release|Win32 + {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Release|x64.ActiveCfg = Release|x64 + {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/contrib/ports/win32/msvc/lwIP_Test.vcxproj b/contrib/ports/win32/msvc/lwIP_Test.vcxproj index 37d4dab2..22b39c88 100644 --- a/contrib/ports/win32/msvc/lwIP_Test.vcxproj +++ b/contrib/ports/win32/msvc/lwIP_Test.vcxproj @@ -5,14 +5,23 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D} lwIP_test + 10.0 @@ -21,12 +30,24 @@ MultiByte v143 + + Application + false + MultiByte + v143 + Application false MultiByte v143 + + Application + false + MultiByte + v143 + @@ -34,17 +55,26 @@ + + + + + + + + <_ProjectFileVersion>10.0.40219.1 - .\$(Configuration)\ - .\$(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ false + false true + true @@ -88,6 +118,47 @@ Packet.dll;wpcap.dll;%(DelayLoadDLLs) + + + .\Release/test.tlb + + + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + MultiThreaded + true + + + $(IntDir)$(TargetName).pch + $(IntDir)$(ProjectName).pdb + Level4 + true + Default + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0407 + + + Packet.lib;wpcap.lib;%(AdditionalDependencies) + true + $(PCAP_DIR)\Lib;..\..\..\..\..\winpcap\WpdPack\Lib\x64;%(AdditionalLibraryDirectories) + .\Release/test.pdb + Console + false + + + true + $(TargetDir)$(TargetName).map + Packet.dll;wpcap.dll;%(DelayLoadDLLs) + + .\Debug/test.tlb @@ -127,6 +198,47 @@ false $(TargetDir)$(TargetName).map Packet.dll;wpcap.dll;%(DelayLoadDLLs) + false + + + + + .\Debug/test.tlb + + + + + Disabled + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..;%(AdditionalIncludeDirectories) + _CONSOLE;WIN32;_DEBUG;LWIP_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(TargetName).pch + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0407 + + + Packet.lib;wpcap.lib;%(AdditionalDependencies) + true + $(PCAP_DIR)\Lib;..\..\..\..\..\winpcap\WpdPack\Lib\x64;%(AdditionalLibraryDirectories) + true + Console + false + + + false + $(TargetDir)$(TargetName).map + Packet.dll;wpcap.dll;%(DelayLoadDLLs) diff --git a/contrib/ports/win32/msvc/lwIP_fuzz.sln b/contrib/ports/win32/msvc/lwIP_fuzz.sln new file mode 100644 index 00000000..11b52e32 --- /dev/null +++ b/contrib/ports/win32/msvc/lwIP_fuzz.sln @@ -0,0 +1,78 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34031.279 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP", "lwIP.vcxproj", "{2CC276FA-B226-49C9-8F82-7FCD5A228E28}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwip_fuzz", "lwip_fuzz.vcxproj", "{71B3B3F4-621C-11EE-8C99-0242AC120002}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_fuzz2|x64 = Debug_fuzz2|x64 + Debug_fuzz2|x86 = Debug_fuzz2|x86 + Debug_fuzz3|x64 = Debug_fuzz3|x64 + Debug_fuzz3|x86 = Debug_fuzz3|x86 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release_fuzz2|x64 = Release_fuzz2|x64 + Release_fuzz2|x86 = Release_fuzz2|x86 + Release_fuzz3|x64 = Release_fuzz3|x64 + Release_fuzz3|x86 = Release_fuzz3|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz2|x64.ActiveCfg = Debug fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz2|x64.Build.0 = Debug fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz2|x86.ActiveCfg = Debug fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz2|x86.Build.0 = Debug fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz3|x64.ActiveCfg = Debug fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz3|x64.Build.0 = Debug fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz3|x86.ActiveCfg = Debug fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug_fuzz3|x86.Build.0 = Debug fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x64.ActiveCfg = Debug fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x64.Build.0 = Debug fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x86.ActiveCfg = Debug fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x86.Build.0 = Debug fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz2|x64.ActiveCfg = Release fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz2|x64.Build.0 = Release fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz2|x86.ActiveCfg = Release fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz2|x86.Build.0 = Release fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz3|x64.ActiveCfg = Release fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz3|x64.Build.0 = Release fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz3|x86.ActiveCfg = Release fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release_fuzz3|x86.Build.0 = Release fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x64.ActiveCfg = Release fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x64.Build.0 = Release fuzz|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x86.ActiveCfg = Release fuzz|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x86.Build.0 = Release fuzz|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz2|x64.ActiveCfg = Debug fuzz2|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz2|x64.Build.0 = Debug fuzz2|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz2|x86.ActiveCfg = Debug fuzz2|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz2|x86.Build.0 = Debug fuzz2|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz3|x64.ActiveCfg = Debug fuzz3|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz3|x64.Build.0 = Debug fuzz3|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz3|x86.ActiveCfg = Debug fuzz3|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug_fuzz3|x86.Build.0 = Debug fuzz3|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug|x64.ActiveCfg = Debug|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug|x64.Build.0 = Debug|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug|x86.ActiveCfg = Debug|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Debug|x86.Build.0 = Debug|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz2|x64.ActiveCfg = Release fuzz2|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz2|x64.Build.0 = Release fuzz2|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz2|x86.ActiveCfg = Release fuzz2|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz2|x86.Build.0 = Release fuzz2|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz3|x64.ActiveCfg = Release fuzz3|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz3|x64.Build.0 = Release fuzz3|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz3|x86.ActiveCfg = Release fuzz3|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release_fuzz3|x86.Build.0 = Release fuzz3|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release|x64.ActiveCfg = Release|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release|x64.Build.0 = Release|x64 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release|x86.ActiveCfg = Release|Win32 + {71B3B3F4-621C-11EE-8C99-0242AC120002}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj b/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj index 1bfdfb17..b055d6ab 100644 --- a/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj +++ b/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj @@ -5,15 +5,24 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + lwIP pcapif {6F44E49E-9F21-4144-91EC-53B92AEF62CE} lwIP pcapif + 10.0 @@ -22,12 +31,24 @@ MultiByte v143 + + StaticLibrary + false + MultiByte + v143 + StaticLibrary false MultiByte v143 + + StaticLibrary + false + MultiByte + v143 + @@ -35,15 +56,23 @@ + + + + + + + + <_ProjectFileVersion>10.0.40219.1 - .\$(Configuration)\ - .\$(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ @@ -67,6 +96,28 @@ + + + Disabled + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;.\;$(PCAP_DIR)\Include;..\..\..\..\..\winpcap\WpdPack\Include\;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + ProgramDatabase + Default + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0407 + + + MaxSpeed @@ -93,6 +144,32 @@ true + + + MaxSpeed + OnlyExplicitInline + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;.\;$(PCAP_DIR)\Include;..\..\..\..\..\winpcap\WpdPack\Include\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreaded + true + + + $(IntDir)$(TargetName).pch + $(IntDir)$(ProjectName).pdb + Level4 + true + Default + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0407 + + + true + + diff --git a/contrib/ports/win32/msvc/lwIP_unittests.sln b/contrib/ports/win32/msvc/lwIP_unittests.sln index 2dfefb06..2e383361 100644 --- a/contrib/ports/win32/msvc/lwIP_unittests.sln +++ b/contrib/ports/win32/msvc/lwIP_unittests.sln @@ -1,5 +1,7 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C++ Express 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34031.279 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwip_unittests", "lwip_unittests.vcxproj", "{6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP", "lwIP.vcxproj", "{2CC276FA-B226-49C9-8F82-7FCD5A228E28}" @@ -9,23 +11,40 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Debug|Win32.ActiveCfg = Debug|Win32 {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Debug|Win32.Build.0 = Debug|Win32 + {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Debug|x64.ActiveCfg = Debug|x64 + {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Debug|x64.Build.0 = Debug|x64 {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Release|Win32.ActiveCfg = Release|Win32 {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Release|Win32.Build.0 = Release|Win32 + {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Release|x64.ActiveCfg = Release|x64 + {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Release|x64.Build.0 = Release|x64 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.ActiveCfg = Debug unittests|Win32 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.Build.0 = Debug unittests|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x64.ActiveCfg = Debug unittests|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|x64.Build.0 = Debug unittests|x64 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.ActiveCfg = Release unittests|Win32 {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.Build.0 = Release unittests|Win32 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x64.ActiveCfg = Release unittests|x64 + {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|x64.Build.0 = Release unittests|x64 {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Debug|Win32.ActiveCfg = Debug|Win32 {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Debug|Win32.Build.0 = Debug|Win32 + {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Debug|x64.ActiveCfg = Debug|x64 + {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Debug|x64.Build.0 = Debug|x64 {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Release|Win32.ActiveCfg = Release|Win32 {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Release|Win32.Build.0 = Release|Win32 + {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Release|x64.ActiveCfg = Release|x64 + {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {18F9EDCF-BE44-4F9F-A7F6-5DCF2B7687C5} + EndGlobalSection EndGlobal diff --git a/contrib/ports/win32/msvc/lwip_fuzz.vcxproj b/contrib/ports/win32/msvc/lwip_fuzz.vcxproj new file mode 100644 index 00000000..fe42ca52 --- /dev/null +++ b/contrib/ports/win32/msvc/lwip_fuzz.vcxproj @@ -0,0 +1,476 @@ + + + + + Debug fuzz2 + Win32 + + + Debug fuzz2 + x64 + + + Debug fuzz3 + Win32 + + + Debug fuzz3 + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release fuzz2 + Win32 + + + Release fuzz2 + x64 + + + Release fuzz3 + Win32 + + + Release fuzz3 + x64 + + + Release + Win32 + + + Release + x64 + + + + {71B3B3F4-621C-11EE-8C99-0242AC120002} + lwip_fuzz + 10.0 + + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ + $(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Level4 + EditAndContinue + 4820 + + + true + false + + + MachineX86 + + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level4 + ProgramDatabase + 4820 + + + true + false + + + + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Level4 + EditAndContinue + 4820 + + + true + false + + + MachineX86 + + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level4 + ProgramDatabase + 4820 + + + true + false + + + + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Level4 + EditAndContinue + 4820 + + + true + false + + + MachineX86 + + + + + Disabled + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level4 + ProgramDatabase + 4820 + + + true + false + + + + + + + MaxSpeed + true + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Level4 + ProgramDatabase + + + true + true + true + false + + + MachineX86 + + + + + MaxSpeed + true + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Level4 + ProgramDatabase + + + true + true + true + false + + + + + + + MaxSpeed + true + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Level4 + ProgramDatabase + + + true + true + true + false + + + MachineX86 + + + + + MaxSpeed + true + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Level4 + ProgramDatabase + + + true + true + true + false + + + + + + + MaxSpeed + true + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Level4 + ProgramDatabase + + + true + true + true + false + + + MachineX86 + + + + + MaxSpeed + true + ..\..\..\..\test\fuzz;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Level4 + ProgramDatabase + + + true + true + true + false + + + + + + + {2cc276fa-b226-49c9-8f82-7fcd5a228e28} + false + + + + + + + + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + + + + + \ No newline at end of file diff --git a/contrib/ports/win32/msvc/lwip_unittests.vcxproj b/contrib/ports/win32/msvc/lwip_unittests.vcxproj index 17577d9a..270ba284 100644 --- a/contrib/ports/win32/msvc/lwip_unittests.vcxproj +++ b/contrib/ports/win32/msvc/lwip_unittests.vcxproj @@ -5,14 +5,23 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2} lwip_unittests + 10.0 @@ -21,26 +30,49 @@ true v143 + + Application + MultiByte + true + v143 + Application MultiByte v143 + + Application + MultiByte + v143 + + + + + + + <_ProjectFileVersion>10.0.40219.1 $(Configuration)\$(ProjectName)\ $(Configuration)\$(ProjectName)\ + + $(Platform)\$(Configuration)\$(ProjectName)\ + + + $(Platform)\$(Configuration)\$(ProjectName)\ + Disabled @@ -59,6 +91,26 @@ MachineX86 + false + + + + + Disabled + ..\check;..\..\..\..\..\check\src;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + _LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level4 + ProgramDatabase + 4820 + + + true + false + + + false @@ -82,6 +134,26 @@ MachineX86 + + + MaxSpeed + true + ..\check;..\..\..\..\..\check\src;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + Level4 + ProgramDatabase + + + true + true + true + false + + + + diff --git a/contrib/ports/win32/msvc/makefsdata.vcxproj b/contrib/ports/win32/msvc/makefsdata.vcxproj index 5881642d..c5d2c72d 100644 --- a/contrib/ports/win32/msvc/makefsdata.vcxproj +++ b/contrib/ports/win32/msvc/makefsdata.vcxproj @@ -5,10 +5,18 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + @@ -17,6 +25,7 @@ {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D} makefsdata Win32Proj + 10.0 @@ -25,27 +34,45 @@ true v143 + + Application + Unicode + true + v143 + Application Unicode v143 + + Application + Unicode + v143 + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(Configuration)\$(ProjectName)\ true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ + true false + false @@ -70,6 +97,27 @@ MachineX86 + + + Disabled + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + ProgramDatabase + + + true + Console + false + + + + MaxSpeed @@ -95,6 +143,30 @@ MachineX86 + + + MaxSpeed + true + ..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + true + ProgramDatabase + + + true + Console + true + true + false + + + + diff --git a/contrib/ports/win32/pcapif.c b/contrib/ports/win32/pcapif.c index 58a42b4e..6bf58f02 100644 --- a/contrib/ports/win32/pcapif.c +++ b/contrib/ports/win32/pcapif.c @@ -679,12 +679,17 @@ pcapif_shutdown(struct netif *netif) #endif /* PCAPIF_RX_USE_THREAD */ if (pa->adapter) { pcap_breakloop(pa->adapter); - pcap_close(pa->adapter); } #if PCAPIF_RX_USE_THREAD /* wait for rxthread to end */ - while(pa->rx_running); + while (pa->rx_running) { + Sleep(100); + } #endif /* PCAPIF_RX_USE_THREAD */ + if (pa->adapter) { + pcap_close(pa->adapter); + pa->adapter = NULL; + } #if PCAPIF_HANDLE_LINKSTATE pcapifh_linkstate_close(pa->link_state); #endif /* PCAPIF_HANDLE_LINKSTATE */ diff --git a/contrib/ports/win32/pcapif_helper.c b/contrib/ports/win32/pcapif_helper.c index 03b92e0d..9cc889c1 100644 --- a/contrib/ports/win32/pcapif_helper.c +++ b/contrib/ports/win32/pcapif_helper.c @@ -115,7 +115,7 @@ pcapifh_free_readonly_mem(void *data) } /** - * Npcap keeps its DLLs in a different directory for compatiblity with winpcap. + * Npcap keeps its DLLs in a different directory for compatibility with winpcap. * Make sure they get found by adding that directory to the DLL search path. */ void pcapifh_init_npcap(void) diff --git a/doc/doxygen/lwip.Doxyfile b/doc/doxygen/lwip.Doxyfile index 4b4d2ec5..f68fa0c5 100644 --- a/doc/doxygen/lwip.Doxyfile +++ b/doc/doxygen/lwip.Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "lwIP" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "2.2.0" +PROJECT_NUMBER = "2.2.1" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/src/Filelists.cmake b/src/Filelists.cmake index 3a0430e4..228e0f0c 100644 --- a/src/Filelists.cmake +++ b/src/Filelists.cmake @@ -14,7 +14,7 @@ endif() set(LWIP_VERSION_MAJOR "2") set(LWIP_VERSION_MINOR "2") -set(LWIP_VERSION_REVISION "0") +set(LWIP_VERSION_REVISION "1") # LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases # LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions # Numbers 1..31 are reserved for release candidates diff --git a/src/api/netdb.c b/src/api/netdb.c index e07ab049..73028c8e 100644 --- a/src/api/netdb.c +++ b/src/api/netdb.c @@ -40,6 +40,7 @@ #if LWIP_DNS && LWIP_SOCKET #include "lwip/err.h" +#include "lwip/errno.h" #include "lwip/mem.h" #include "lwip/memp.h" #include "lwip/ip_addr.h" @@ -62,7 +63,7 @@ int h_errno; #endif /* LWIP_DNS_API_DECLARE_H_ERRNO */ /** LWIP_DNS_API_HOSTENT_STORAGE: if set to 0 (default), lwip_gethostbyname() - * returns the same global variabe for all calls (in all threads). + * returns the same global variable for all calls (in all threads). * When set to 1, your port should provide a function * struct hostent* sys_thread_hostent( struct hostent* h); * which have to do a copy of "h" and return a pointer ont the "per-thread" @@ -382,7 +383,9 @@ lwip_getaddrinfo(const char *nodename, const char *servname, /* set up sockaddr */ inet6_addr_from_ip6addr(&sa6->sin6_addr, ip_2_ip6(&addr)); sa6->sin6_family = AF_INET6; +#if LWIP_SOCKET_HAVE_SA_LEN sa6->sin6_len = sizeof(struct sockaddr_in6); +#endif /* LWIP_SOCKET_HAVE_SA_LEN */ sa6->sin6_port = lwip_htons((u16_t)port_nr); sa6->sin6_scope_id = ip6_addr_zone(ip_2_ip6(&addr)); ai->ai_family = AF_INET6; @@ -393,7 +396,9 @@ lwip_getaddrinfo(const char *nodename, const char *servname, /* set up sockaddr */ inet_addr_from_ip4addr(&sa4->sin_addr, ip_2_ip4(&addr)); sa4->sin_family = AF_INET; +#if LWIP_SOCKET_HAVE_SA_LEN sa4->sin_len = sizeof(struct sockaddr_in); +#endif /* LWIP_SOCKET_HAVE_SA_LEN */ sa4->sin_port = lwip_htons((u16_t)port_nr); ai->ai_family = AF_INET; #endif /* LWIP_IPV4 */ diff --git a/src/api/sockets.c b/src/api/sockets.c index b9111943..b97bdd7e 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -660,7 +660,7 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) { struct lwip_sock *sock, *nsock; struct netconn *newconn; - ip_addr_t naddr; + ip_addr_t naddr = {0}; u16_t port = 0; int newsock; err_t err; @@ -699,25 +699,6 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) LWIP_ASSERT("invalid socket index", (newsock >= LWIP_SOCKET_OFFSET) && (newsock < NUM_SOCKETS + LWIP_SOCKET_OFFSET)); nsock = &sockets[newsock - LWIP_SOCKET_OFFSET]; - /* See event_callback: If data comes in right away after an accept, even - * though the server task might not have created a new socket yet. - * In that case, newconn->socket is counted down (newconn->socket--), - * so nsock->rcvevent is >= 1 here! - */ - SYS_ARCH_PROTECT(lev); - recvevent = (s16_t)(-1 - newconn->callback_arg.socket); - newconn->callback_arg.socket = newsock; - SYS_ARCH_UNPROTECT(lev); - - if (newconn->callback) { - LOCK_TCPIP_CORE(); - while (recvevent > 0) { - recvevent--; - newconn->callback(newconn, NETCONN_EVT_RCVPLUS, 0); - } - UNLOCK_TCPIP_CORE(); - } - /* Note that POSIX only requires us to check addr is non-NULL. addrlen must * not be NULL if addr is valid. */ @@ -738,7 +719,28 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) *addrlen = IPADDR_SOCKADDR_GET_LEN(&tempaddr); } MEMCPY(addr, &tempaddr, *addrlen); + } + /* See event_callback: If data comes in right away after an accept, even + * though the server task might not have created a new socket yet. + * In that case, newconn->socket is counted down (newconn->socket--), + * so nsock->rcvevent is >= 1 here! + */ + SYS_ARCH_PROTECT(lev); + recvevent = (s16_t)(-1 - newconn->callback_arg.socket); + newconn->callback_arg.socket = newsock; + SYS_ARCH_UNPROTECT(lev); + + if (newconn->callback) { + LOCK_TCPIP_CORE(); + while (recvevent > 0) { + recvevent--; + newconn->callback(newconn, NETCONN_EVT_RCVPLUS, 0); + } + UNLOCK_TCPIP_CORE(); + } + + if ((addr != NULL) && (addrlen != NULL)) { LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock)); ip_addr_debug_print_val(SOCKETS_DEBUG, naddr); LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", port)); @@ -2920,6 +2922,49 @@ lwip_sockopt_to_ipopt(int optname) } } +#if LWIP_IPV6 && LWIP_RAW +static void +lwip_getsockopt_impl_ipv6_checksum(int s, struct lwip_sock* sock, void* optval) +{ + if (sock->conn->pcb.raw->chksum_reqd == 0) { + *(int*)optval = -1; + } + else { + *(int*)optval = sock->conn->pcb.raw->chksum_offset; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM) = %d\n", + s, (*(int*)optval))); +} + +static int +lwip_setsockopt_impl_ipv6_checksum(int s, struct lwip_sock* sock, const void* optval, socklen_t optlen) +{ + /* It should not be possible to disable the checksum generation with ICMPv6 + * as per RFC 3542 chapter 3.1 */ + if (sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) { + done_socket(sock); + return EINVAL; + } + + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW); + if (*(const int*)optval < 0) { + sock->conn->pcb.raw->chksum_reqd = 0; + } + else if (*(const int*)optval & 1) { + /* Per RFC3542, odd offsets are not allowed */ + done_socket(sock); + return EINVAL; + } + else { + sock->conn->pcb.raw->chksum_reqd = 1; + sock->conn->pcb.raw->chksum_offset = (u16_t) * (const int*)optval; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM, ..) -> %d\n", + s, sock->conn->pcb.raw->chksum_reqd)); + return 0; +} +#endif + /** lwip_getsockopt_impl: the actual implementation of getsockopt: * same argument as lwip_getsockopt, either called directly or through callback */ @@ -2934,6 +2979,7 @@ lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *opt #ifdef LWIP_HOOK_SOCKETS_GETSOCKOPT if (LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) { + done_socket(sock); return err; } #endif @@ -3169,6 +3215,12 @@ lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *opt /* Level: IPPROTO_IPV6 */ case IPPROTO_IPV6: switch (optname) { +#if LWIP_IPV6 && LWIP_RAW + case IPV6_CHECKSUM: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW); + lwip_getsockopt_impl_ipv6_checksum(s, sock, optval); + break; +#endif /* LWIP_IPV6 && LWIP_RAW */ case IPV6_V6ONLY: LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int); *(int *)optval = (netconn_get_ipv6only(sock->conn) ? 1 : 0); @@ -3219,13 +3271,7 @@ lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *opt #if LWIP_IPV6 && LWIP_RAW case IPV6_CHECKSUM: LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW); - if (sock->conn->pcb.raw->chksum_reqd == 0) { - *(int *)optval = -1; - } else { - *(int *)optval = sock->conn->pcb.raw->chksum_offset; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM) = %d\n", - s, (*(int *)optval)) ); + lwip_getsockopt_impl_ipv6_checksum(s, sock, optval); break; #endif /* LWIP_IPV6 && LWIP_RAW */ default: @@ -3355,6 +3401,7 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ #ifdef LWIP_HOOK_SOCKETS_SETSOCKOPT if (LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) { + done_socket(sock); return err; } #endif @@ -3646,7 +3693,15 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ /* Level: IPPROTO_IPV6 */ case IPPROTO_IPV6: switch (optname) { - case IPV6_V6ONLY: +#if LWIP_IPV6 && LWIP_RAW + case IPV6_CHECKSUM: + err = lwip_setsockopt_impl_ipv6_checksum(s, sock, optval, optlen); + if (err) { + return err; + } + break; +#endif /* LWIP_IPV6 && LWIP_RAW */ + case IPV6_V6ONLY: LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); if (*(const int *)optval) { netconn_set_ipv6only(sock->conn, 1); @@ -3744,26 +3799,10 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ switch (optname) { #if LWIP_IPV6 && LWIP_RAW case IPV6_CHECKSUM: - /* It should not be possible to disable the checksum generation with ICMPv6 - * as per RFC 3542 chapter 3.1 */ - if (sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) { - done_socket(sock); - return EINVAL; + err = lwip_setsockopt_impl_ipv6_checksum(s, sock, optval, optlen); + if (err) { + return err; } - - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW); - if (*(const int *)optval < 0) { - sock->conn->pcb.raw->chksum_reqd = 0; - } else if (*(const int *)optval & 1) { - /* Per RFC3542, odd offsets are not allowed */ - done_socket(sock); - return EINVAL; - } else { - sock->conn->pcb.raw->chksum_reqd = 1; - sock->conn->pcb.raw->chksum_offset = (u16_t) * (const int *)optval; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM, ..) -> %d\n", - s, sock->conn->pcb.raw->chksum_reqd)); break; #endif /* LWIP_IPV6 && LWIP_RAW */ default: diff --git a/src/api/tcpip.c b/src/api/tcpip.c index 3aecbd43..0891f9e0 100644 --- a/src/api/tcpip.c +++ b/src/api/tcpip.c @@ -68,11 +68,20 @@ sys_mutex_t lock_tcpip_core; static void tcpip_thread_handle_msg(struct tcpip_msg *msg); #if !LWIP_TIMERS -/* wait for a message with timers disabled (e.g. pass a timer-check trigger into tcpip_thread) */ -#define TCPIP_MBOX_FETCH(mbox, msg) sys_mbox_fetch(mbox, msg) + +/** Wait for a message with timers disabled (e.g. pass a timer-check trigger into tcpip_thread) */ +static void +tcpip_mbox_fetch(sys_mbox_t* mbox, void** msg) +{ + LWIP_ASSERT_CORE_LOCKED(); + + UNLOCK_TCPIP_CORE(); + sys_mbox_fetch(mbox, msg); + LOCK_TCPIP_CORE(); +} + #else /* !LWIP_TIMERS */ -/* wait for a message, timeouts are processed while waiting */ -#define TCPIP_MBOX_FETCH(mbox, msg) tcpip_timeouts_mbox_fetch(mbox, msg) + /** * Wait (forever) for a message to arrive in an mbox. * While waiting, timeouts are processed. @@ -81,7 +90,7 @@ static void tcpip_thread_handle_msg(struct tcpip_msg *msg); * @param msg the place to store the message */ static void -tcpip_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg) +tcpip_mbox_fetch(sys_mbox_t *mbox, void **msg) { u32_t sleeptime, res; @@ -139,7 +148,7 @@ tcpip_thread(void *arg) while (1) { /* MAIN Loop */ LWIP_TCPIP_THREAD_ALIVE(); /* wait for a message, timeouts are processed while waiting */ - TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg); + tcpip_mbox_fetch(&tcpip_mbox, (void **)&msg); if (msg == NULL) { LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n")); LWIP_ASSERT("tcpip_thread: invalid message", 0); @@ -428,7 +437,7 @@ tcpip_untimeout(sys_timeout_handler h, void *arg) /** * Sends a message to TCPIP thread to call a function. Caller thread blocks on - * on a provided semaphore, which ist NOT automatically signalled by TCPIP thread, + * on a provided semaphore, which is NOT automatically signalled by TCPIP thread, * this has to be done by the user. * It is recommended to use LWIP_TCPIP_CORE_LOCKING since this is the way * with least runtime overhead. diff --git a/src/apps/altcp_tls/altcp_tls_mbedtls.c b/src/apps/altcp_tls/altcp_tls_mbedtls.c index a8c2fc2e..9e619126 100644 --- a/src/apps/altcp_tls/altcp_tls_mbedtls.c +++ b/src/apps/altcp_tls/altcp_tls_mbedtls.c @@ -48,7 +48,7 @@ * GOOD custom entropy * * Missing things / @todo: - * - some unhandled/untested things migh be caught by LWIP_ASSERTs... + * - some unhandled/untested things might be caught by LWIP_ASSERTs... */ #include "lwip/opt.h" @@ -133,6 +133,15 @@ static err_t altcp_mbedtls_handle_rx_appldata(struct altcp_pcb *conn, altcp_mbed static int altcp_mbedtls_bio_send(void *ctx, const unsigned char *dataptr, size_t size); +static void +altcp_mbedtls_flush_output(altcp_mbedtls_state_t* state) +{ + int flushed = mbedtls_ssl_flush_output(&state->ssl_context); + if (flushed) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_flush_output failed: %d\n", flushed)); + } +} + /* callback functions from inner/lower connection: */ /** Accept callback from lower connection (i.e. TCP) @@ -531,7 +540,7 @@ altcp_mbedtls_lower_sent(void *arg, struct altcp_pcb *inner_conn, u16_t len) /* remove ACKed bytes from overhead adjust counter */ state->overhead_bytes_adjust -= len; /* try to send more if we failed before (may increase overhead adjust counter) */ - mbedtls_ssl_flush_output(&state->ssl_context); + altcp_mbedtls_flush_output(state); /* remove calculated overhead from ACKed bytes len */ app_len = len - (u16_t)overhead; /* update application write counter and inform application */ @@ -559,7 +568,7 @@ altcp_mbedtls_lower_poll(void *arg, struct altcp_pcb *inner_conn) if (conn->state) { altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state; /* try to send more if we failed before */ - mbedtls_ssl_flush_output(&state->ssl_context); + altcp_mbedtls_flush_output(state); if (altcp_mbedtls_handle_rx_appldata(conn, state) == ERR_ABRT) { return ERR_ABRT; } @@ -1233,7 +1242,7 @@ altcp_mbedtls_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t allow sending more if this succeeded (this is a hack because neither returning 0 nor MBEDTLS_ERR_SSL_WANT_WRITE worked for me) */ if (state->ssl_context.out_left) { - mbedtls_ssl_flush_output(&state->ssl_context); + altcp_mbedtls_flush_output(state); if (state->ssl_context.out_left) { return ERR_MEM; } diff --git a/src/apps/http/http_client.c b/src/apps/http/http_client.c index 1973e79e..32c6f6c2 100644 --- a/src/apps/http/http_client.c +++ b/src/apps/http/http_client.c @@ -229,12 +229,15 @@ http_parse_response_status(struct pbuf *p, u16_t *http_version, u16_t *http_stat } else { status_num_len = end1 - space1 - 1; } - memset(status_num, 0, sizeof(status_num)); - if (pbuf_copy_partial(p, status_num, (u16_t)status_num_len, space1 + 1) == status_num_len) { - int status = atoi(status_num); - if ((status > 0) && (status <= 0xFFFF)) { - *http_status = (u16_t)status; - return ERR_OK; + if (status_num_len < sizeof(status_num)) { + if (pbuf_copy_partial(p, status_num, (u16_t)status_num_len, space1 + 1) == status_num_len) { + int status; + status_num[status_num_len] = 0; + status = atoi(status_num); + if ((status > 0) && (status <= 0xFFFF)) { + *http_status = (u16_t)status; + return ERR_OK; + } } } } @@ -261,11 +264,14 @@ http_wait_headers(struct pbuf *p, u32_t *content_length, u16_t *total_header_len if (content_len_line_end != 0xFFFF) { char content_len_num[16]; u16_t content_len_num_len = (u16_t)(content_len_line_end - content_len_hdr - 16); - memset(content_len_num, 0, sizeof(content_len_num)); - if (pbuf_copy_partial(p, content_len_num, content_len_num_len, content_len_hdr + 16) == content_len_num_len) { - int len = atoi(content_len_num); - if ((len >= 0) && ((u32_t)len < HTTPC_CONTENT_LEN_INVALID)) { - *content_length = (u32_t)len; + if (content_len_num_len < sizeof(content_len_num)) { + if (pbuf_copy_partial(p, content_len_num, content_len_num_len, content_len_hdr + 16) == content_len_num_len) { + int len; + content_len_num[content_len_num_len] = 0; + len = atoi(content_len_num); + if ((len >= 0) && ((u32_t)len < HTTPC_CONTENT_LEN_INVALID)) { + *content_length = (u32_t)len; + } } } } @@ -489,7 +495,7 @@ static int httpc_create_request_string(const httpc_connection_t *settings, const char* server_name, int server_port, const char* uri, int use_host, char *buffer, size_t buffer_size) { - if (settings->use_proxy) { + if (settings && settings->use_proxy) { LWIP_ASSERT("server_name != NULL", server_name != NULL); if (server_port != HTTP_DEFAULT_PORT) { return snprintf(buffer, buffer_size, HTTPC_REQ_11_PROXY_PORT_FORMAT(server_name, server_port, uri, server_name)); @@ -517,6 +523,7 @@ httpc_init_connection_common(httpc_state_t **connection, const httpc_connection_ size_t server_name_len, uri_len; #endif + LWIP_ERROR("httpc connection settings not give", settings != NULL, return ERR_ARG;); LWIP_ASSERT("uri != NULL", uri != NULL); /* get request len */ @@ -561,12 +568,12 @@ httpc_init_connection_common(httpc_state_t **connection, const httpc_connection_ req->uri = req->server_name + server_name_len + 1; memcpy(req->uri, uri, uri_len + 1); #endif - req->pcb = altcp_new(settings->altcp_allocator); + req->pcb = altcp_new(settings ? settings->altcp_allocator : NULL); if(req->pcb == NULL) { httpc_free_state(req); return ERR_MEM; } - req->remote_port = settings->use_proxy ? settings->proxy_port : server_port; + req->remote_port = (settings && settings->use_proxy) ? settings->proxy_port : server_port; altcp_arg(req->pcb, req); altcp_recv(req->pcb, httpc_tcp_recv); altcp_err(req->pcb, httpc_tcp_err); @@ -626,7 +633,7 @@ httpc_init_connection_addr(httpc_state_t **connection, const httpc_connection_t * @param settings connection settings (callbacks, proxy, etc.) * @param recv_fn the http body (not the headers) are passed to this callback * @param callback_arg argument passed to all the callbacks - * @param connection retreives the connection handle (to match in callbacks) + * @param connection retrieves the connection handle (to match in callbacks) * @return ERR_OK if starting the request succeeds (callback_fn will be called later) * or an error code */ @@ -671,7 +678,7 @@ httpc_get_file(const ip_addr_t* server_addr, u16_t port, const char* uri, const * @param settings connection settings (callbacks, proxy, etc.) * @param recv_fn the http body (not the headers) are passed to this callback * @param callback_arg argument passed to all the callbacks - * @param connection retreives the connection handle (to match in callbacks) + * @param connection retrieves the connection handle (to match in callbacks) * @return ERR_OK if starting the request succeeds (callback_fn will be called later) * or an error code */ @@ -689,12 +696,12 @@ httpc_get_file_dns(const char* server_name, u16_t port, const char* uri, const h return err; } - if (settings->use_proxy) { + if (settings && settings->use_proxy) { err = httpc_get_internal_addr(req, &settings->proxy_addr); } else { err = httpc_get_internal_dns(req, server_name); } - if(err != ERR_OK) { + if (err != ERR_OK) { httpc_free_state(req); return err; } @@ -727,12 +734,17 @@ httpc_fs_init(httpc_filestate_t **filestate_out, const char* local_file_name, { httpc_filestate_t *filestate; size_t file_len, alloc_len; + mem_size_t alloc_mem_size; FILE *f; file_len = strlen(local_file_name); alloc_len = sizeof(httpc_filestate_t) + file_len + 1; - - filestate = (httpc_filestate_t *)mem_malloc((mem_size_t)alloc_len); + alloc_mem_size = (mem_size_t)alloc_len; + if (alloc_mem_size < alloc_len) { + /* overflow */ + return ERR_MEM; + } + filestate = (httpc_filestate_t *)mem_malloc(alloc_mem_size); if (filestate == NULL) { return ERR_MEM; } @@ -812,7 +824,7 @@ httpc_fs_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err) * @param uri uri to get from the server, remember leading "/"! * @param settings connection settings (callbacks, proxy, etc.) * @param callback_arg argument passed to all the callbacks - * @param connection retreives the connection handle (to match in callbacks) + * @param connection retrieves the connection handle (to match in callbacks) * @return ERR_OK if starting the request succeeds (callback_fn will be called later) * or an error code */ @@ -864,7 +876,7 @@ httpc_get_file_to_disk(const ip_addr_t* server_addr, u16_t port, const char* uri * @param uri uri to get from the server, remember leading "/"! * @param settings connection settings (callbacks, proxy, etc.) * @param callback_arg argument passed to all the callbacks - * @param connection retreives the connection handle (to match in callbacks) + * @param connection retrieves the connection handle (to match in callbacks) * @return ERR_OK if starting the request succeeds (callback_fn will be called later) * or an error code */ diff --git a/src/apps/http/httpd.c b/src/apps/http/httpd.c index 9477e855..3e9d2348 100644 --- a/src/apps/http/httpd.c +++ b/src/apps/http/httpd.c @@ -471,6 +471,32 @@ http_state_alloc(void) return ret; } +/** Make sure the post code knows that the connection is closed */ +static void +http_state_close_post(struct http_state* hs) +{ +#if LWIP_HTTPD_SUPPORT_POST + if (hs != NULL) { + if ((hs->post_content_len_left != 0) +#if LWIP_HTTPD_POST_MANUAL_WND + || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0)) +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + ) { + /* prevent calling httpd_post_finished twice */ + hs->post_content_len_left = 0; +#if LWIP_HTTPD_POST_MANUAL_WND + hs->unrecved_bytes = 0; +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + /* make sure the post code knows that the connection is closed */ + http_uri_buf[0] = 0; + httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN); + } + } +#else /* LWIP_HTTPD_SUPPORT_POST*/ + LWIP_UNUSED_ARG(hs); +#endif /* LWIP_HTTPD_SUPPORT_POST*/ +} + /** Free a struct http_state. * Also frees the file data if dynamic. */ @@ -505,6 +531,7 @@ http_state_eof(struct http_state *hs) hs->req = NULL; } #endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + http_state_close_post(hs); } /** Free a struct http_state. @@ -598,20 +625,7 @@ http_close_or_abort_conn(struct altcp_pcb *pcb, struct http_state *hs, u8_t abor err_t err; LWIP_DEBUGF(HTTPD_DEBUG, ("Closing connection %p\n", (void *)pcb)); -#if LWIP_HTTPD_SUPPORT_POST - if (hs != NULL) { - if ((hs->post_content_len_left != 0) -#if LWIP_HTTPD_POST_MANUAL_WND - || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0)) -#endif /* LWIP_HTTPD_POST_MANUAL_WND */ - ) { - /* make sure the post code knows that the connection is closed */ - http_uri_buf[0] = 0; - httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN); - } - } -#endif /* LWIP_HTTPD_SUPPORT_POST*/ - + http_state_close_post(hs); altcp_arg(pcb, NULL); altcp_recv(pcb, NULL); @@ -1818,7 +1832,7 @@ http_post_request(struct pbuf *inp, struct http_state *hs, #define HTTP_HDR_CONTENT_LEN "Content-Length: " #define HTTP_HDR_CONTENT_LEN_LEN 16 #define HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN 10 - char *scontent_len = lwip_strnstr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1)); + char *scontent_len = lwip_strnistr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1)); if (scontent_len != NULL) { char *scontent_len_end = lwip_strnstr(scontent_len + HTTP_HDR_CONTENT_LEN_LEN, CRLF, HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN); if (scontent_len_end != NULL) { @@ -2086,8 +2100,8 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct altcp_pcb *pc #if LWIP_HTTPD_SUPPORT_11_KEEPALIVE /* This is HTTP/1.0 compatible: for strict 1.1, a connection would always be persistent unless "close" was specified. */ - if (!is_09 && (lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) || - lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) { + if (!is_09 && (lwip_strnistr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) || + lwip_strnistr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) { hs->keepalive = 1; } else { hs->keepalive = 0; @@ -2401,7 +2415,7 @@ http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const cha search for the end of the header. */ char *file_start = lwip_strnstr(hs->file, CRLF CRLF, hs->left); if (file_start != NULL) { - int diff = file_start + 4 - hs->file; + size_t diff = file_start + 4 - hs->file; hs->file += diff; hs->left -= (u32_t)diff; } diff --git a/src/apps/http/makefsdata/makefsdata b/src/apps/http/makefsdata/makefsdata index 667eb888..7f1d4d2b 100644 --- a/src/apps/http/makefsdata/makefsdata +++ b/src/apps/http/makefsdata/makefsdata @@ -21,7 +21,7 @@ while($file = ) { print(HEADER "HTTP/1.0 200 OK\r\n"); } print(HEADER "Server: lwIP/pre-0.6 (http://www.sics.se/~adam/lwip/)\r\n"); - if($file =~ /\.html$/) { + if($file =~ /\.s?html?$/) { print(HEADER "Content-type: text/html\r\n"); } elsif($file =~ /\.gif$/) { print(HEADER "Content-type: image/gif\r\n"); diff --git a/src/apps/http/makefsdata/makefsdata.c b/src/apps/http/makefsdata/makefsdata.c index 240c72e4..62d77a32 100644 --- a/src/apps/http/makefsdata/makefsdata.c +++ b/src/apps/http/makefsdata/makefsdata.c @@ -77,7 +77,7 @@ static int deflate_level; /* default compression level, can be changed via comma #define CHDIR(path) SetCurrentDirectoryA(path) #define CHDIR_SUCCEEDED(ret) (ret == TRUE) -#elif __linux__ +#elif __linux__ || __APPLE__ #define GETCWD(path, len) getcwd(path, len) #define GETCWD_SUCCEEDED(ret) (ret != NULL) @@ -895,6 +895,10 @@ static int is_ssi_file(const char *filename) /* build up the relative path to this file */ size_t sublen = strlen(curSubdir); size_t freelen = sizeof(curSubdir) - sublen - 1; + if (sublen + strlen(filename) + 1 >= sizeof(curSubdir)) { + /* prevent buffer overflow */ + return 0; + } strncat(curSubdir, "/", freelen); strncat(curSubdir, filename, freelen - 1); curSubdir[sizeof(curSubdir) - 1] = 0; diff --git a/src/apps/http/makefsdata/tinydir.h b/src/apps/http/makefsdata/tinydir.h index e08eb84e..0b536fa4 100644 --- a/src/apps/http/makefsdata/tinydir.h +++ b/src/apps/http/makefsdata/tinydir.h @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2019, tinydir authors: +Copyright (c) 2013-2021, tinydir authors: - Cong Xu - Lautis Sun - Baudouin Feildel @@ -125,8 +125,13 @@ extern "C" { # define _TINYDIR_FUNC static __inline #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # define _TINYDIR_FUNC static __inline__ -#else +#elif defined(__cplusplus) # define _TINYDIR_FUNC static inline +#elif defined(__GNUC__) +/* Suppress unused function warning */ +# define _TINYDIR_FUNC __attribute__((unused)) static +#else +# define _TINYDIR_FUNC static #endif /* readdir_r usage; define TINYDIR_USE_READDIR_R to use it (if supported) */ @@ -543,7 +548,9 @@ int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file) if (_tstat( #elif (defined _BSD_SOURCE) || (defined _DEFAULT_SOURCE) \ || ((defined _XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)) \ - || ((defined _POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) + || ((defined _POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) \ + || ((defined __APPLE__) && (defined __MACH__)) \ + || (defined BSD) if (lstat( #else if (stat( @@ -636,7 +643,7 @@ int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path) int result = 0; int found = 0; _tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX]; - _tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX]; + _tinydir_char_t file_name_buf[_TINYDIR_PATH_MAX]; _tinydir_char_t *dir_name; _tinydir_char_t *base_name; #if (defined _MSC_VER || defined __MINGW32__) diff --git a/src/apps/lwiperf/lwiperf.c b/src/apps/lwiperf/lwiperf.c index 26b1e3b5..144c8bd2 100644 --- a/src/apps/lwiperf/lwiperf.c +++ b/src/apps/lwiperf/lwiperf.c @@ -302,7 +302,7 @@ lwiperf_tcp_client_send_more(lwiperf_state_tcp_t *conn) /* this session is byte-limited */ u32_t amount_bytes = lwip_htonl(conn->settings.amount); /* @todo: this can send up to 1*MSS more than requested... */ - if (amount_bytes >= conn->bytes_transferred) { + if (conn->bytes_transferred >= amount_bytes) { /* all requested bytes transferred -> close the connection */ lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_CLIENT); return ERR_OK; diff --git a/src/apps/mdns/mdns.c b/src/apps/mdns/mdns.c index 394d9d1c..84f267a6 100644 --- a/src/apps/mdns/mdns.c +++ b/src/apps/mdns/mdns.c @@ -1792,7 +1792,7 @@ mdns_probe_conflict(struct netif *netif, s8_t slot) } /** - * Loockup matching request for response MDNS packet + * Lookup matching request for response MDNS packet */ #if LWIP_MDNS_SEARCH static struct mdns_request * diff --git a/src/apps/mqtt/mqtt.c b/src/apps/mqtt/mqtt.c index 699061b2..af4b331a 100644 --- a/src/apps/mqtt/mqtt.c +++ b/src/apps/mqtt/mqtt.c @@ -318,7 +318,7 @@ mqtt_append_request(struct mqtt_request_t **tail, struct mqtt_request_t *r) LWIP_ASSERT("mqtt_append_request: tail != NULL", tail != NULL); - /* Iterate trough queue to find head, and count total timeout time */ + /* Iterate through queue to find head, and count total timeout time */ for (iter = *tail; iter != NULL; iter = iter->next) { time_before += iter->timeout_diff; head = iter; @@ -1337,9 +1337,16 @@ mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, LWIP_ERROR("mqtt_client_connect: client_info->will_topic length overflow", len <= 0xFF, return ERR_VAL); LWIP_ERROR("mqtt_client_connect: client_info->will_topic length must be > 0", len > 0, return ERR_VAL); will_topic_len = (u8_t)len; - len = strlen(client_info->will_msg); - LWIP_ERROR("mqtt_client_connect: client_info->will_msg length overflow", len <= 0xFF, return ERR_VAL); - will_msg_len = (u8_t)len; + if (client_info->will_msg_len == 0) + { + len = strlen(client_info->will_msg); + LWIP_ERROR("mqtt_client_connect: client_info->will_msg length overflow", len <= 0xFF, return ERR_VAL); + will_msg_len = (u8_t)len; + } + else + { + will_msg_len = client_info->will_msg_len; + } len = remaining_length + 2 + will_topic_len + 2 + will_msg_len; LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL); remaining_length = (u16_t)len; diff --git a/src/apps/netbiosns/netbiosns.c b/src/apps/netbiosns/netbiosns.c index 479c375b..4b1383e7 100644 --- a/src/apps/netbiosns/netbiosns.c +++ b/src/apps/netbiosns/netbiosns.c @@ -391,7 +391,7 @@ netbiosns_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t resp->resp_hdr.authorityRRs = 0; resp->resp_hdr.additionalRRs = 0; - /* prepare NetBIOS header datas */ + /* prepare NetBIOS header data */ MEMCPY( resp->resp_name.encname, netbios_question_hdr->encname, sizeof(netbios_question_hdr->encname)); resp->resp_name.nametype = netbios_question_hdr->nametype; resp->resp_name.type = netbios_question_hdr->type; diff --git a/src/apps/smtp/smtp.c b/src/apps/smtp/smtp.c index a1780bda..498af7f5 100644 --- a/src/apps/smtp/smtp.c +++ b/src/apps/smtp/smtp.c @@ -1305,7 +1305,7 @@ smtp_process(void *arg, struct altcp_pcb *pcb, struct pbuf *p) LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process: received response code: %d\n", response_code)); if (smtp_is_response_finished(s) != ERR_OK) { LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process: partly received response code: %d\n", response_code)); - /* wait for next packet to complete the respone */ + /* wait for next packet to complete the response */ return; } } else { diff --git a/src/apps/snmp/snmp_core.c b/src/apps/snmp/snmp_core.c index 04e0c317..fc64c428 100644 --- a/src/apps/snmp/snmp_core.c +++ b/src/apps/snmp/snmp_core.c @@ -584,7 +584,7 @@ snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len) /** * Combine two OIDs into struct snmp_obj_id - * @param target Assignmet target + * @param target Assignment target * @param oid1 OID 1 * @param oid1_len OID 1 length * @param oid2 OID 2 diff --git a/src/apps/snmp/snmp_msg.c b/src/apps/snmp/snmp_msg.c index 9cd4b071..f8c75bb7 100644 --- a/src/apps/snmp/snmp_msg.c +++ b/src/apps/snmp/snmp_msg.c @@ -328,7 +328,6 @@ snmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t por struct snmp_varbind vb; vb.next = NULL; - vb.prev = NULL; vb.type = SNMP_ASN1_TYPE_COUNTER32; vb.value_len = sizeof(u32_t); @@ -1058,7 +1057,7 @@ snmp_parse_inbound_frame(struct snmp_request *request) IF_PARSE_EXEC(snmpv3_get_user((char *)request->msg_user_name, &auth, key, NULL, NULL)); IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, auth, hmac)); - if (memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH)) { + if (lwip_memcmp_consttime(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH)) { snmp_stats.wrongdigests++; request->msg_flags = SNMP_V3_NOAUTHNOPRIV; request->error_status = SNMP_ERR_AUTHORIZATIONERROR; diff --git a/src/apps/snmp/snmp_traps.c b/src/apps/snmp/snmp_traps.c index 4acbe604..465fb9c9 100644 --- a/src/apps/snmp/snmp_traps.c +++ b/src/apps/snmp/snmp_traps.c @@ -137,7 +137,6 @@ static s32_t req_id = 1; * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1 * @param enable switch if 0 destination is disabled >0 enabled. * - * @retval void */ void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable) @@ -154,7 +153,6 @@ snmp_trap_dst_enable(u8_t dst_idx, u8_t enable) * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1 * @param dst IPv4 address in host order. * - * @retval void */ void snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst) @@ -171,7 +169,6 @@ snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst) * * @param enable enable SNMP traps * - * @retval void */ void snmp_set_auth_traps_enabled(u8_t enable) @@ -200,7 +197,6 @@ snmp_get_auth_traps_enabled(void) * * @param snmp_version version that will be used for sending traps * - * @retval void */ void snmp_set_default_trap_version(u8_t snmp_version) @@ -274,7 +270,6 @@ snmp_prepare_trap_oid(struct snmp_obj_id *dest_snmp_trap_oid, const struct snmp_ * @param generic_trap SNMP v1 generic trap * @param specific_trap SNMP v1 specific trap * @param varbinds list of varbinds - * @retval void */ static void snmp_prepare_necessary_msg_fields(struct snmp_msg_trap *trap_msg, const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds) @@ -351,13 +346,11 @@ snmp_send_trap_or_notification_or_inform_generic(struct snmp_msg_trap *trap_msg, u16_t tot_len = 0; err_t err = ERR_OK; u32_t timestamp = 0; - struct snmp_varbind *original_varbinds = varbinds; - struct snmp_varbind *original_prev = NULL; + struct snmp_obj_id snmp_trap_oid = { 0 }; /* used for converting SNMPv1 generic/specific trap parameter to SNMPv2 snmpTrapOID */ struct snmp_varbind snmp_v2_special_varbinds[] = { /* First varbind is used to store sysUpTime */ { NULL, /* *next */ - NULL, /* *prev */ { /* oid */ 8, /* oid len */ {1, 3, 6, 1, 2, 1, 1, 3} /* oid for sysUpTime */ @@ -369,7 +362,6 @@ snmp_send_trap_or_notification_or_inform_generic(struct snmp_msg_trap *trap_msg, /* Second varbind is used to store snmpTrapOID */ { NULL, /* *next */ - NULL, /* *prev */ { /* oid */ 10, /* oid len */ {1, 3, 6, 1, 6, 3, 1, 1, 4, 1} /* oid for snmpTrapOID */ @@ -383,7 +375,6 @@ snmp_send_trap_or_notification_or_inform_generic(struct snmp_msg_trap *trap_msg, LWIP_ASSERT_SNMP_LOCKED(); snmp_v2_special_varbinds[0].next = &snmp_v2_special_varbinds[1]; - snmp_v2_special_varbinds[1].prev = &snmp_v2_special_varbinds[0]; snmp_v2_special_varbinds[0].value = ×tamp; @@ -391,15 +382,10 @@ snmp_send_trap_or_notification_or_inform_generic(struct snmp_msg_trap *trap_msg, /* see rfc3584 */ if (trap_msg->snmp_version == SNMP_VERSION_2c) { - struct snmp_obj_id snmp_trap_oid = { 0 }; /* used for converting SNMPv1 generic/specific trap parameter to SNMPv2 snmpTrapOID */ err = snmp_prepare_trap_oid(&snmp_trap_oid, eoid, generic_trap, specific_trap); if (err == ERR_OK) { snmp_v2_special_varbinds[1].value_len = snmp_trap_oid.len * sizeof(snmp_trap_oid.id[0]); snmp_v2_special_varbinds[1].value = snmp_trap_oid.id; - if (varbinds != NULL) { - original_prev = varbinds->prev; - varbinds->prev = &snmp_v2_special_varbinds[1]; - } varbinds = snmp_v2_special_varbinds; /* After inserting two varbinds at the beginning of the list, make sure that pointer is pointing to the first element */ } } @@ -422,9 +408,6 @@ snmp_send_trap_or_notification_or_inform_generic(struct snmp_msg_trap *trap_msg, } } } - if ((trap_msg->snmp_version == SNMP_VERSION_2c) && (original_varbinds != NULL)) { - original_varbinds->prev = original_prev; - } req_id++; return err; } @@ -498,7 +481,6 @@ snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds) /** * @ingroup snmp_traps * Send coldstart trap - * @retval void */ void snmp_coldstart_trap(void) @@ -509,7 +491,6 @@ snmp_coldstart_trap(void) /** * @ingroup snmp_traps * Send authentication failure trap (used internally by agent) - * @retval void */ void snmp_authfail_trap(void) @@ -727,7 +708,6 @@ snmp_trap_header_enc_pdu(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pb * Encodes trap header part that is SNMP v1 header specific. * @param trap Trap message * @param pbuf_stream stream used for storing data inside pbuf - * @retval void */ static err_t snmp_trap_header_enc_v1_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream) @@ -781,7 +761,6 @@ snmp_trap_header_enc_v1_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_st * * @param trap Trap message * @param pbuf_stream stream used for storing data inside pbuf - * @retval void */ static err_t snmp_trap_header_enc_v2c_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream) @@ -814,7 +793,6 @@ snmp_trap_header_enc_v2c_specific(struct snmp_msg_trap *trap, struct snmp_pbuf_s * * @param trap Trap message * @param pbuf_stream stream used for storing data inside pbuf - * @retval void */ static err_t snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream) diff --git a/src/apps/sntp/sntp.c b/src/apps/sntp/sntp.c index 0e7f3652..36375305 100644 --- a/src/apps/sntp/sntp.c +++ b/src/apps/sntp/sntp.c @@ -914,7 +914,8 @@ sntp_getkodreceived(u8_t idx) * Initialize one of the NTP servers by name * * @param idx the index of the NTP server to set must be < SNTP_MAX_SERVERS - * @param server DNS name of the NTP server to set, to be resolved at contact time + * @param server DNS name of the NTP server to set, to be resolved at contact + * time. Note sntp stores the pointer, it doesn't copy the string. */ void sntp_setservername(u8_t idx, const char *server) diff --git a/src/apps/tftp/tftp.c b/src/apps/tftp/tftp.c index ddfdbfc0..aab1d9ce 100644 --- a/src/apps/tftp/tftp.c +++ b/src/apps/tftp/tftp.c @@ -157,7 +157,7 @@ send_request(const ip_addr_t *addr, u16_t port, u16_t opcode, const char* fname, static err_t send_error(const ip_addr_t *addr, u16_t port, enum tftp_error code, const char *str) { - int str_length = strlen(str); + size_t str_length = strlen(str); struct pbuf *p; u16_t *payload; err_t ret; diff --git a/src/core/def.c b/src/core/def.c index 282fb41d..11ad31b6 100644 --- a/src/core/def.c +++ b/src/core/def.c @@ -261,3 +261,26 @@ lwip_itoa(char *result, size_t bufsize, int number) memmove(res, tmp, (size_t)((result + bufsize) - tmp)); } #endif + +#ifndef lwip_memcmp_consttime +/** + * @ingroup sys_nonstandard + * The goal of this function is to compare memory with constant runtime in order to prevent + * timing attacks to various parts in the stack. + * To do that, in contrast to memcmp(), it only returns: + * 0: equal + * != 0: not equal + */ +int lwip_memcmp_consttime(const void* s1, const void* s2, size_t len) +{ + size_t i; + const unsigned char* a1 = (const unsigned char*)s1; + const unsigned char* a2 = (const unsigned char*)s2; + unsigned char ret = 0; + + for (i = 0; i < len; i++) { + ret |= a1[i] ^ a2[i]; + } + return ret; +} +#endif diff --git a/src/core/init.c b/src/core/init.c index 0013a899..b906eff4 100644 --- a/src/core/init.c +++ b/src/core/init.c @@ -196,8 +196,11 @@ PACK_STRUCT_END #if (LWIP_ALTCP && LWIP_EVENT_API) #error "The application layered tcp API does not work with LWIP_EVENT_API" #endif -#if (MEM_LIBC_MALLOC && MEM_USE_POOLS) -#error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" +#if (MEM_CUSTOM_ALLOCATOR && !(defined(MEM_CUSTOM_FREE) && defined(MEM_CUSTOM_MALLOC) && defined(MEM_CUSTOM_CALLOC))) +#error "All of MEM_CUSTOM_FREE/MEM_CUSTOM_MALLOC/MEM_CUSTOM_CALLOC must be provided if MEM_CUSTOM_ALLOCATOR is enabled in your lwipopts.h" +#endif +#if (MEM_USE_POOLS && MEM_CUSTOM_ALLOCATOR) +#error "MEM_USE_POOLS may not be used with a custom allocator (MEM_CUSTOM_ALLOCATOR or MEM_LIBC_MALLOC) enabled in your lwipopts.h" #endif #if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" diff --git a/src/core/ipv4/acd.c b/src/core/ipv4/acd.c index 2c7d867c..92f3b5a3 100644 --- a/src/core/ipv4/acd.c +++ b/src/core/ipv4/acd.c @@ -143,7 +143,7 @@ acd_add(struct netif *netif, struct acd *acd, /** * @ingroup acd - * Remvoe ACD client from the client list + * Remove ACD client from the client list * * @param netif network interface from which to remove the acd client * @param acd acd module to be removed from the list diff --git a/src/core/ipv4/dhcp.c b/src/core/ipv4/dhcp.c index d9ed8b0f..12e00683 100644 --- a/src/core/ipv4/dhcp.c +++ b/src/core/ipv4/dhcp.c @@ -1600,7 +1600,7 @@ again: /* special case: there might be more than one server */ LWIP_DHCP_INPUT_ERROR("len %% 4 == 0", len % 4 == 0, return ERR_VAL;); /* limit number of DNS servers */ - decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS); + decode_len = LWIP_MIN(len, 4 * LWIP_DHCP_PROVIDE_DNS_SERVERS); LWIP_DHCP_INPUT_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_DNS_SERVER; break; diff --git a/src/core/ipv4/icmp.c b/src/core/ipv4/icmp.c index 9a82a67a..f35ff4b5 100644 --- a/src/core/ipv4/icmp.c +++ b/src/core/ipv4/icmp.c @@ -213,6 +213,7 @@ icmp_input(struct pbuf *p, struct netif *inp) ip4_addr_copy(iphdr->src, *src); ip4_addr_copy(iphdr->dest, *ip4_current_src_addr()); ICMPH_TYPE_SET(iecho, ICMP_ER); + p->if_idx = NETIF_NO_INDEX; /* we're reusing this pbuf, so reset its if_idx */ #if CHECKSUM_GEN_ICMP IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP) { /* adjust the checksum */ diff --git a/src/core/ipv6/ip6.c b/src/core/ipv6/ip6.c index 90e90dda..2c25f8ad 100644 --- a/src/core/ipv6/ip6.c +++ b/src/core/ipv6/ip6.c @@ -1011,9 +1011,10 @@ netif_found: goto ip6_input_cleanup; } - /* Returned p point to IPv6 header. + /* Returned p points to IPv6 header. * Update all our variables and pointers and continue. */ ip6hdr = (struct ip6_hdr *)p->payload; + ip_data.current_ip6_header = ip6hdr; nexth = &IP6H_NEXTH(ip6hdr); hlen = hlen_tot = IP6_HLEN; pbuf_remove_header(p, IP6_HLEN); diff --git a/src/core/ipv6/ip6_frag.c b/src/core/ipv6/ip6_frag.c index 16bcf950..ba91cfd4 100644 --- a/src/core/ipv6/ip6_frag.c +++ b/src/core/ipv6/ip6_frag.c @@ -162,7 +162,7 @@ ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr) ipr->p = iprh->next_pbuf; /* Restore the part that we've overwritten with our helper structure, or we * might send garbage (and disclose a pointer) in the ICMPv6 reply. */ - MEMCPY(p->payload, ipr->orig_hdr, sizeof(iprh)); + MEMCPY(p->payload, ipr->orig_hdr, sizeof(*iprh)); /* Then, move back to the original ipv6 header (we are now pointing to Fragment header). This cannot fail since we already checked when receiving this fragment. */ if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)ipr->iphdr))) { @@ -447,6 +447,19 @@ ip6_reass(struct pbuf *p) } } #endif /* IP_REASS_CHECK_OVERLAP */ + /* Check if the fragments received so far have no gaps. */ + if (iprh_prev != NULL) { + if (iprh_prev->end != start) { + /* There is a fragment missing between the current + * and the previous fragment */ + valid = 0; + } + } + if (end != iprh_tmp->start) { + /* There is a fragment missing between the current + * and the following fragment */ + valid = 0; + } /* the new pbuf should be inserted before this */ next_pbuf = q; if (iprh_prev != NULL) { @@ -658,6 +671,7 @@ ip6_reass(struct pbuf *p) } /* Return the pbuf chain */ + MIB2_STATS_INC(mib2.ip6reasmoks); return p; } /* the datagram is not (yet?) reassembled completely */ diff --git a/src/core/ipv6/nd6.c b/src/core/ipv6/nd6.c index 3b13c21e..f7b5f563 100644 --- a/src/core/ipv6/nd6.c +++ b/src/core/ipv6/nd6.c @@ -687,7 +687,7 @@ nd6_input(struct pbuf *p, struct netif *inp) case ND6_OPTION_TYPE_SOURCE_LLADDR: { struct lladdr_option *lladdr_opt; - if (option_len < sizeof(struct lladdr_option)) { + if (option_len < (ND6_LLADDR_OPTION_MIN_LENGTH + inp->hwaddr_len)) { goto lenerr_drop_free_return; } lladdr_opt = (struct lladdr_option *)buffer; @@ -1176,7 +1176,7 @@ nd6_tmr(void) /** Send a neighbor solicitation message for a specific neighbor cache entry * - * @param entry the neightbor cache entry for which to send the message + * @param entry the neighbor cache entry for which to send the message * @param flags one of ND6_SEND_FLAG_* */ static void @@ -1707,7 +1707,7 @@ nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif) /* Look for valid routers. A reachable router is preferred. */ valid_router = -1; for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - /* Is the router netif both set and apppropriate? */ + /* Is the router netif both set and appropriate? */ if (default_router_list[i].neighbor_entry != NULL) { router_netif = default_router_list[i].neighbor_entry->netif; if ((router_netif != NULL) && (netif != NULL ? netif == router_netif : diff --git a/src/core/mem.c b/src/core/mem.c index 8566edce..0aa34a26 100644 --- a/src/core/mem.c +++ b/src/core/mem.c @@ -60,6 +60,7 @@ #include "lwip/stats.h" #include "lwip/err.h" +#include /* snprintf */ #include #if MEM_LIBC_MALLOC @@ -151,7 +152,7 @@ mem_overflow_init_raw(void *p, size_t size) } #endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */ -#if MEM_LIBC_MALLOC || MEM_USE_POOLS +#if MEM_CUSTOM_ALLOCATOR || MEM_USE_POOLS /** mem_init is not used when using pools instead of a heap or using * C library malloc(). @@ -171,23 +172,9 @@ mem_trim(void *mem, mem_size_t size) LWIP_UNUSED_ARG(size); return mem; } -#endif /* MEM_LIBC_MALLOC || MEM_USE_POOLS */ +#endif /* MEM_CUSTOM_ALLOCATOR || MEM_USE_POOLS */ -#if MEM_LIBC_MALLOC -/* lwIP heap implemented using C library malloc() */ - -/* in case C library malloc() needs extra protection, - * allow these defines to be overridden. - */ -#ifndef mem_clib_free -#define mem_clib_free free -#endif -#ifndef mem_clib_malloc -#define mem_clib_malloc malloc -#endif -#ifndef mem_clib_calloc -#define mem_clib_calloc calloc -#endif +#if MEM_CUSTOM_ALLOCATOR #if LWIP_STATS && MEM_STATS #define MEM_LIBC_STATSHELPER_SIZE LWIP_MEM_ALIGN_SIZE(sizeof(mem_size_t)) @@ -206,7 +193,7 @@ mem_trim(void *mem, mem_size_t size) void * mem_malloc(mem_size_t size) { - void *ret = mem_clib_malloc(size + MEM_LIBC_STATSHELPER_SIZE); + void *ret = MEM_CUSTOM_MALLOC(size + MEM_LIBC_STATSHELPER_SIZE); if (ret == NULL) { MEM_STATS_INC_LOCKED(err); } else { @@ -233,7 +220,7 @@ mem_free(void *rmem) rmem = (u8_t *)rmem - MEM_LIBC_STATSHELPER_SIZE; MEM_STATS_DEC_USED_LOCKED(used, *(mem_size_t *)rmem); #endif - mem_clib_free(rmem); + MEM_CUSTOM_FREE(rmem); } #elif MEM_USE_POOLS @@ -805,7 +792,7 @@ mem_trim(void *rmem, mem_size_t new_size) /* else { next struct mem is used but size between mem and mem2 is not big enough to create another struct mem - -> don't do anyhting. + -> don't do anything. -> the remaining space stays unused since it is too small } */ #if MEM_OVERFLOW_CHECK @@ -977,14 +964,14 @@ mem_malloc_adjust_lfree: #endif /* MEM_USE_POOLS */ -#if MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS) +#if MEM_CUSTOM_ALLOCATOR && (!LWIP_STATS || !MEM_STATS) void * mem_calloc(mem_size_t count, mem_size_t size) { - return mem_clib_calloc(count, size); + return MEM_CUSTOM_CALLOC(count, size); } -#else /* MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS) */ +#else /* MEM_CUSTOM_ALLOCATOR && (!LWIP_STATS || !MEM_STATS) */ /** * Contiguously allocates enough space for count objects that are size bytes * of memory each and returns a pointer to the allocated memory. @@ -1014,4 +1001,4 @@ mem_calloc(mem_size_t count, mem_size_t size) } return p; } -#endif /* MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS) */ +#endif /* MEM_CUSTOM_ALLOCATOR && (!LWIP_STATS || !MEM_STATS) */ diff --git a/src/core/netif.c b/src/core/netif.c index d3a06774..98e0553f 100644 --- a/src/core/netif.c +++ b/src/core/netif.c @@ -1409,7 +1409,7 @@ netif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32_t i0, u32_t i1, if (ip6_addr_isvalid(netif_ip6_addr_state(netif, addr_idx))) { netif_do_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr); } - /* @todo: remove/readd mib2 ip6 entries? */ + /* @todo: remove/re-add mib2 ip6 entries? */ ip_addr_copy(netif->ip6_addr[addr_idx], new_ipaddr); diff --git a/src/core/pbuf.c b/src/core/pbuf.c index 1fb64d41..54a6e0e4 100644 --- a/src/core/pbuf.c +++ b/src/core/pbuf.c @@ -186,6 +186,8 @@ pbuf_init_alloced_pbuf(struct pbuf *p, void *payload, u16_t tot_len, u16_t len, p->flags = flags; p->ref = 1; p->if_idx = NETIF_NO_INDEX; + + LWIP_PBUF_CUSTOM_DATA_INIT(p); } /** @@ -858,6 +860,7 @@ pbuf_cat(struct pbuf *h, struct pbuf *t) LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)", ((h != NULL) && (t != NULL)), return;); + LWIP_ASSERT("Creating an infinite loop", h != t); /* proceed to last pbuf of chain */ for (p = h; p->next != NULL; p = p->next) { @@ -1094,12 +1097,15 @@ pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset * a copy into the user-supplied buffer. * * @param p the pbuf from which to copy data - * @param buffer the application supplied buffer - * @param bufsize size of the application supplied buffer - * @param len length of data to copy (dataptr must be big enough). No more - * than buf->tot_len will be copied, irrespective of len + * @param buffer the application supplied buffer. May be NULL if the caller does not + * want to copy. In this case, offset + len should be checked against p->tot_len, + * since there's no way for the caller to know why NULL is returned. + * @param bufsize size of the application supplied buffer (when buffer is != NULL) + * @param len length of data to copy (p and buffer must be big enough) * @param offset offset into the packet buffer from where to begin copying len bytes - * @return the number of bytes copied, or 0 on failure + * @return - pointer into pbuf payload if that is already contiguous (no copy needed) + * - pointer to 'buffer' if data was not contiguous and had to be copied + * - NULL on error */ void * pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset) @@ -1108,8 +1114,7 @@ pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t le u16_t out_offset; LWIP_ERROR("pbuf_get_contiguous: invalid buf", (p != NULL), return NULL;); - LWIP_ERROR("pbuf_get_contiguous: invalid dataptr", (buffer != NULL), return NULL;); - LWIP_ERROR("pbuf_get_contiguous: invalid dataptr", (bufsize >= len), return NULL;); + LWIP_ERROR("pbuf_get_contiguous: invalid bufsize", (buffer == NULL) || (bufsize >= len), return NULL;); q = pbuf_skip_const(p, offset, &out_offset); if (q != NULL) { @@ -1117,6 +1122,10 @@ pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t le /* all data in this pbuf, return zero-copy */ return (u8_t *)q->payload + out_offset; } + if (buffer == NULL) { + /* the caller does not want to copy */ + return NULL; + } /* need to copy */ if (pbuf_copy_partial(q, buffer, len, out_offset) != len) { /* copying failed: pbuf is too short */ diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c index c7a1f7b7..1b17e40f 100644 --- a/src/core/tcp_in.c +++ b/src/core/tcp_in.c @@ -1564,7 +1564,7 @@ tcp_receive(struct tcp_pcb *pcb) recv_data = inseg.p; /* Since this pbuf now is the responsibility of the application, we delete our reference to it so that we won't - (mistakingly) deallocate it. */ + (mistakenly) deallocate it. */ inseg.p = NULL; } if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { @@ -1687,10 +1687,20 @@ tcp_receive(struct tcp_pcb *pcb) ->ooseq. We check the lengths to see which one to discard. */ if (inseg.len > next->len) { + struct tcp_seg* cseg; + + /* If next segment is the last segment in ooseq + and smaller than inseg, that means it has been + trimmed before to fit our window, so we just + break here. */ + if (next->next == NULL) { + break; + } + /* The incoming segment is larger than the old segment. We replace some segments with the new one. */ - struct tcp_seg *cseg = tcp_seg_copy(&inseg); + cseg = tcp_seg_copy(&inseg); if (cseg != NULL) { if (prev != NULL) { prev->next = cseg; diff --git a/src/core/tcp_out.c b/src/core/tcp_out.c index 64579ee5..cfcc55dd 100644 --- a/src/core/tcp_out.c +++ b/src/core/tcp_out.c @@ -301,7 +301,7 @@ tcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum, /** Checks if tcp_write is allowed or not (checks state, snd_buf and snd_queuelen). * * @param pcb the tcp pcb to check for - * @param len length of data to send (checked agains snd_buf) + * @param len length of data to send (checked against snd_buf) * @return ERR_OK if tcp_write is allowed to proceed, another err_t otherwise */ static err_t @@ -1987,6 +1987,9 @@ tcp_rst_common(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, LWIP_ASSERT("tcp_rst: invalid local_ip", local_ip != NULL); LWIP_ASSERT("tcp_rst: invalid remote_ip", remote_ip != NULL); + /* these two are passed only for checks, disable warnings without asserts */ + LWIP_UNUSED_ARG(local_ip); + LWIP_UNUSED_ARG(remote_ip); optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb); diff --git a/src/core/udp.c b/src/core/udp.c index 23c2be27..c787ae0a 100644 --- a/src/core/udp.c +++ b/src/core/udp.c @@ -988,7 +988,7 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { if (pcb != ipcb) { /* By default, we don't allow to bind to a port that any other udp - PCB is already bound to, unless *all* PCBs with that port have tha + PCB is already bound to, unless *all* PCBs with that port have the REUSEADDR flag set. */ #if SO_REUSE if (!ip_get_option(pcb, SOF_REUSEADDR) || diff --git a/src/include/lwip/apps/http_client.h b/src/include/lwip/apps/http_client.h index d39e1bf8..3ba6d803 100644 --- a/src/include/lwip/apps/http_client.h +++ b/src/include/lwip/apps/http_client.h @@ -53,7 +53,7 @@ extern "C" { /** * @ingroup httpc - * HTTPC_HAVE_FILE_IO: define this to 1 to have functions dowloading directly + * HTTPC_HAVE_FILE_IO: define this to 1 to have functions downloading directly * to disk via fopen/fwrite. * These functions are example implementations of the interface only. */ @@ -116,7 +116,7 @@ typedef void (*httpc_result_fn)(void *arg, httpc_result_t httpc_result, u32_t rx * @param connection http client connection * @param arg argument specified when initiating the request * @param hdr header pbuf(s) (may contain data also) - * @param hdr_len length of the heders in 'hdr' + * @param hdr_len length of the headers in 'hdr' * @param content_len content length as received in the headers (-1 if not received) * @return if != ERR_OK is returned, the connection is aborted */ diff --git a/src/include/lwip/apps/mqtt.h b/src/include/lwip/apps/mqtt.h index bece4005..f1583fc4 100644 --- a/src/include/lwip/apps/mqtt.h +++ b/src/include/lwip/apps/mqtt.h @@ -79,6 +79,8 @@ struct mqtt_connect_client_info_t { const char* will_topic; /** will_msg, see will_topic */ const char* will_msg; + /** will_msg length, 0 to compute length from will_msg string */ + u8_t will_msg_len; /** will_qos, see will_topic */ u8_t will_qos; /** will_retain, see will_topic */ diff --git a/src/include/lwip/apps/snmp.h b/src/include/lwip/apps/snmp.h index dc5bb0d0..d01f99b8 100644 --- a/src/include/lwip/apps/snmp.h +++ b/src/include/lwip/apps/snmp.h @@ -55,8 +55,6 @@ struct snmp_varbind { /** pointer to next varbind, NULL for last in list */ struct snmp_varbind *next; - /** pointer to previous varbind, NULL for first in list */ - struct snmp_varbind *prev; /** object identifier */ struct snmp_obj_id oid; diff --git a/src/include/lwip/apps/sntp_opts.h b/src/include/lwip/apps/sntp_opts.h index cb627716..1fad9a84 100644 --- a/src/include/lwip/apps/sntp_opts.h +++ b/src/include/lwip/apps/sntp_opts.h @@ -158,14 +158,14 @@ /** SNTP receive timeout - in milliseconds * Also used as retry timeout - this shouldn't be too low. - * Default is 15 seconds. Must not be beolw 15 seconds by specification (i.e. 15000) + * Default is 15 seconds. Must not be below 15 seconds by specification (i.e. 15000) */ #if !defined SNTP_RECV_TIMEOUT || defined __DOXYGEN__ #define SNTP_RECV_TIMEOUT 15000 #endif /** SNTP update delay - in milliseconds - * Default is 1 hour. Must not be beolw 60 seconds by specification (i.e. 60000) + * Default is 1 hour. Must not be below 60 seconds by specification (i.e. 60000) */ #if !defined SNTP_UPDATE_DELAY || defined __DOXYGEN__ #define SNTP_UPDATE_DELAY 3600000 diff --git a/src/include/lwip/arch.h b/src/include/lwip/arch.h index 596c1c9e..c659a80c 100644 --- a/src/include/lwip/arch.h +++ b/src/include/lwip/arch.h @@ -382,7 +382,7 @@ extern "C" { #define LWIP_PROVIDE_ERRNO #endif -/* Use a special, reproducable version of rand() for fuzz tests? */ +/* Use a special, reproducible version of rand() for fuzz tests? */ #ifdef LWIP_RAND_FOR_FUZZ #ifdef LWIP_RAND #undef LWIP_RAND diff --git a/src/include/lwip/def.h b/src/include/lwip/def.h index d6bf7630..fd7c6a21 100644 --- a/src/include/lwip/def.h +++ b/src/include/lwip/def.h @@ -148,6 +148,16 @@ char* lwip_strnstr(const char* buffer, const char* token, size_t n); /* This can be #defined to strnistr() depending on your platform */ char* lwip_strnistr(const char* buffer, const char* token, size_t n); #endif +#ifndef lwip_memcmp_consttime +/* This could be #defined to something existing on your platform + * The goal of this function is to compare memory with constant runtime in order to prevent + * timing attacks to various parts in the stack. + * To do that, in contrast to memcmp(), it only returns: + * 0: equal + * != 0: not equal + */ +int lwip_memcmp_consttime(const void* s1, const void* s2, size_t len); +#endif #ifdef __cplusplus } diff --git a/src/include/lwip/init.h b/src/include/lwip/init.h index 43e5e04f..f579da48 100644 --- a/src/include/lwip/init.h +++ b/src/include/lwip/init.h @@ -54,7 +54,7 @@ extern "C" { /** x.X.x: Minor version of the stack */ #define LWIP_VERSION_MINOR 2 /** x.x.X: Revision of the stack */ -#define LWIP_VERSION_REVISION 0 +#define LWIP_VERSION_REVISION 1 /** For release candidates, this is set to 1..254 * For official releases, this is set to 255 (LWIP_RC_RELEASE) * For development versions (Git), this is set to 0 (LWIP_RC_DEVELOPMENT) */ diff --git a/src/include/lwip/mem.h b/src/include/lwip/mem.h index ff208d25..6819ee48 100644 --- a/src/include/lwip/mem.h +++ b/src/include/lwip/mem.h @@ -43,7 +43,7 @@ extern "C" { #endif -#if MEM_LIBC_MALLOC +#if MEM_CUSTOM_ALLOCATOR #include "lwip/arch.h" diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h index c27dd034..2573285f 100644 --- a/src/include/lwip/opt.h +++ b/src/include/lwip/opt.h @@ -245,10 +245,28 @@ /** * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library * instead of the lwip internal allocator. Can save code size if you - * already use it. + * already use it. Specialized case of MEM_CUSTOM_ALLOCATOR. + * @see MEM_CUSTOM_ALLOCATOR */ #if !defined MEM_LIBC_MALLOC || defined __DOXYGEN__ #define MEM_LIBC_MALLOC 0 +#elif MEM_LIBC_MALLOC +#define MEM_CUSTOM_ALLOCATOR 1 +#define MEM_CUSTOM_FREE free +#define MEM_CUSTOM_MALLOC malloc +#define MEM_CUSTOM_CALLOC calloc +#endif + +/** + * MEM_CUSTOM_ALLOCATOR==1: Use malloc/free/realloc provided by a custom + * implementation instead of the lwip internal allocator. Can save code size if + * you already use it. If enabled, you have to define those functions: + * \#define MEM_CUSTOM_FREE my_free + * \#define MEM_CUSTOM_MALLOC my_malloc + * \#define MEM_CUSTOM_CALLOC my_calloc + */ +#if !defined MEM_CUSTOM_ALLOCATOR || defined __DOXYGEN__ +#define MEM_CUSTOM_ALLOCATOR 0 #endif /** @@ -671,7 +689,7 @@ #endif /** - * LWIP_VLAN_PCP==1: Enable outgoing VLAN taggning of frames on a per-PCB basis + * LWIP_VLAN_PCP==1: Enable outgoing VLAN tagging of frames on a per-PCB basis * for QoS purposes. With this feature enabled, each PCB has a new variable: * "netif_hints.tci" (Tag Control Identifier). * The TCI contains three fields: VID, CFI and PCP. @@ -969,12 +987,12 @@ #define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS #endif -/** LWIP_DHCP_DISCOVER_ADD_HOSTNAME: Set to 1 to include hostname opt in discover packets. +/** LWIP_DHCP_DISCOVER_ADD_HOSTNAME: Set to 0 to not include hostname opt in discover packets. * If the hostname is not set in the DISCOVER packet, then some servers might issue an OFFER with hostname * configured and consequently reject the REQUEST with any other hostname. */ #if !defined LWIP_DHCP_DISCOVER_ADD_HOSTNAME || defined __DOXYGEN__ -#define LWIP_DHCP_DISCOVER_ADD_HOSTNAME 0 +#define LWIP_DHCP_DISCOVER_ADD_HOSTNAME 1 #endif /* LWIP_DHCP_DISCOVER_ADD_HOSTNAME */ /** * @} @@ -1610,10 +1628,22 @@ /** * LWIP_PBUF_CUSTOM_DATA: Store private data on pbufs (e.g. timestamps) * This extends struct pbuf so user can store custom data on every pbuf. + * e.g.: + * \#define LWIP_PBUF_CUSTOM_DATA u32_t myref; */ #if !defined LWIP_PBUF_CUSTOM_DATA || defined __DOXYGEN__ #define LWIP_PBUF_CUSTOM_DATA #endif + +/** + * LWIP_PBUF_CUSTOM_DATA_INIT: Initialize private data on pbufs. + * e.g. for the above example definition: + * \#define LWIP_PBUF_CUSTOM_DATA(p) (p)->myref = 0 + */ +#if !defined LWIP_PBUF_CUSTOM_DATA_INIT || defined __DOXYGEN__ +#define LWIP_PBUF_CUSTOM_DATA_INIT(p) +#endif + /** * @} */ @@ -2238,7 +2268,7 @@ * MEM_STATS==1: Enable mem.c stats. */ #if !defined MEM_STATS || defined __DOXYGEN__ -#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) +#define MEM_STATS ((MEM_CUSTOM_ALLOCATOR == 0) && (MEM_USE_POOLS == 0)) #endif /** diff --git a/src/include/lwip/prot/nd6.h b/src/include/lwip/prot/nd6.h index c270d07c..a92d34d9 100644 --- a/src/include/lwip/prot/nd6.h +++ b/src/include/lwip/prot/nd6.h @@ -153,6 +153,7 @@ PACK_STRUCT_END /** Link-layer address option. */ #define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01) #define ND6_OPTION_TYPE_TARGET_LLADDR (0x02) +#define ND6_LLADDR_OPTION_MIN_LENGTH (2) #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif diff --git a/src/include/lwip/snmp.h b/src/include/lwip/snmp.h index 8704d0b4..24315897 100644 --- a/src/include/lwip/snmp.h +++ b/src/include/lwip/snmp.h @@ -1,6 +1,6 @@ /** * @file - * SNMP support API for implementing netifs and statitics for MIB2 + * SNMP support API for implementing netifs and statistics for MIB2 */ /* diff --git a/src/include/lwip/stats.h b/src/include/lwip/stats.h index b570dbac..8c94320b 100644 --- a/src/include/lwip/stats.h +++ b/src/include/lwip/stats.h @@ -122,7 +122,7 @@ struct stats_sys { /** SNMP MIB2 stats */ struct stats_mib2 { - /* IP */ + /* IPv4 */ u32_t ipinhdrerrors; u32_t ipinaddrerrors; u32_t ipinunknownprotos; @@ -140,6 +140,9 @@ struct stats_mib2 { u32_t ipforwdatagrams; u32_t ipinreceives; + /* IPv6 */ + u32_t ip6reasmoks; + /* TCP */ u32_t tcpactiveopens; u32_t tcppassiveopens; diff --git a/src/include/netif/ppp/pppoe.h b/src/include/netif/ppp/pppoe.h index 8994d38c..b5f7ed11 100644 --- a/src/include/netif/ppp/pppoe.h +++ b/src/include/netif/ppp/pppoe.h @@ -128,7 +128,7 @@ PACK_STRUCT_END #define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ #define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ #define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ -#define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */ +#define PPPOE_TAG_GENERIC_ERR 0x0203 /* generic error */ #define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ #define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ diff --git a/src/include/netif/ppp/vj.h b/src/include/netif/ppp/vj.h index 4e6601c1..a9ba7863 100644 --- a/src/include/netif/ppp/vj.h +++ b/src/include/netif/ppp/vj.h @@ -53,7 +53,7 @@ extern "C" { * * There are 5 numbers which can change (they are always inserted * in the following order): TCP urgent pointer, window, - * acknowlegement, sequence number and IP ID. (The urgent pointer + * acknowledgement, sequence number and IP ID. (The urgent pointer * is different from the others in that its value is sent, not the * change in value.) Since typical use of SLIP links is biased * toward small packets (see comments on MTU/MSS below), changes diff --git a/src/netif/ppp/auth.c b/src/netif/ppp/auth.c index 3e174187..1f271752 100644 --- a/src/netif/ppp/auth.c +++ b/src/netif/ppp/auth.c @@ -1012,8 +1012,8 @@ int auth_check_passwd(ppp_pcb *pcb, char *auser, unsigned int userlen, char *apa secretpasswdlen = strlen(pcb->settings.passwd); if (secretuserlen == userlen && secretpasswdlen == passwdlen - && !memcmp(auser, pcb->settings.user, userlen) - && !memcmp(apasswd, pcb->settings.passwd, passwdlen) ) { + && !lwip_memcmp_consttime(auser, pcb->settings.user, userlen) + && !lwip_memcmp_consttime(apasswd, pcb->settings.passwd, passwdlen) ) { *msg = "Login ok"; *msglen = sizeof("Login ok")-1; return 1; diff --git a/src/netif/ppp/fsm.c b/src/netif/ppp/fsm.c index 2ba1207b..90a227c8 100644 --- a/src/netif/ppp/fsm.c +++ b/src/netif/ppp/fsm.c @@ -787,8 +787,9 @@ void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen) } outp = (u_char*)p->payload; - if (datalen) /* && data != outp + PPP_HDRLEN + HEADERLEN) -- was only for fsm_sconfreq() */ - MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen); + if (datalen && data != NULL) { /* && data != outp + PPP_HDRLEN + HEADERLEN) -- was only for fsm_sconfreq() */ + MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen); + } MAKEHEADER(outp, f->protocol); PUTCHAR(code, outp); PUTCHAR(id, outp); diff --git a/src/netif/ppp/lcp.c b/src/netif/ppp/lcp.c index 8b51a8f6..3bc0092b 100644 --- a/src/netif/ppp/lcp.c +++ b/src/netif/ppp/lcp.c @@ -1499,7 +1499,7 @@ static int lcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) { break; case CI_AUTHTYPE: /* This is potentially dead code (#if !PPP_AUTH_SUPPORT) - * Thus the double parantheses to mark the code explicitely + * Thus the double parentheses to mark the code explicitly * disabled when building with clang */ if ((0 diff --git a/test/fuzz/fuzz_common.c b/test/fuzz/fuzz_common.c index a275265c..ef00e9de 100644 --- a/test/fuzz/fuzz_common.c +++ b/test/fuzz/fuzz_common.c @@ -214,6 +214,7 @@ static void input_pkt(struct netif *netif, const u8_t *data, size_t len) static void input_pkts(enum lwip_fuzz_type type, struct netif *netif, const u8_t *data, size_t len) { + size_t packet_nr = 0; remfuzz_ptr = data; remfuzz_len = len; @@ -228,6 +229,7 @@ static void input_pkts(enum lwip_fuzz_type type, struct netif *netif, const u8_t #ifdef LWIP_FUZZ_SYS_NOW u32_t external_delay = 0; #endif + packet_nr++; if (type == LWIP_FUZZ_MULTIPACKET_TIME) { #ifdef LWIP_FUZZ_SYS_NOW /* Extract external delay time from fuzz pool */ @@ -265,7 +267,7 @@ static void input_pkts(enum lwip_fuzz_type type, struct netif *netif, const u8_t #if LWIP_TCP static struct altcp_pcb *tcp_client_pcb; /* a pcb for the TCP client */ static struct altcp_pcb *tcp_server_pcb; /* a pcb for the TCP server */ -static u16_t tcp_remote_port; /* a TCP port number of the destionation */ +static u16_t tcp_remote_port; /* a TCP port number of the destination */ static u16_t tcp_local_port; /* a TCP port number of the local server */ /** @@ -517,7 +519,7 @@ udp_app_fuzz_input(struct udp_pcb *pcb, const ip_addr_t *addr, u16_t port) * We use udp_send(). * * server: - * The pcb does NOT have infomation about the destionation. + * The pcb does NOT have information about the destination. * We use udp_sendto(). */ if (addr == NULL) { @@ -694,8 +696,8 @@ u32_t lwip_fuzz_rand(void) static s32_t state[1] = {0xdeadbeef}; uint64_t val = state[0] & 0xffffffff; val = ((val * 1103515245) + 12345) & 0x7fffffff; - state[0] = val; - result = val; + state[0] = (s32_t)val; + result = (u32_t)val; return result; #endif } diff --git a/test/unit/api/test_sockets.c b/test/unit/api/test_sockets.c index 3faa5ff9..1bcce341 100644 --- a/test/unit/api/test_sockets.c +++ b/test/unit/api/test_sockets.c @@ -252,7 +252,7 @@ static void test_sockets_msgapi_update_iovs(struct msghdr *msg, size_t bytes) { msg_iovlen_t i; - /* note: this modifies the underyling iov_base and iov_len for a partial + /* note: this modifies the underlying iov_base and iov_len for a partial read for an individual vector. This updates the msg->msg_iov pointer to skip fully consumed vectors */ diff --git a/test/unit/core/test_pbuf.c b/test/unit/core/test_pbuf.c index 6163e4fa..9c5df33b 100644 --- a/test/unit/core/test_pbuf.c +++ b/test/unit/core/test_pbuf.c @@ -88,6 +88,7 @@ START_TEST(test_pbuf_copy_zero_pbuf) fail_unless(p2->ref == 1); p3 = pbuf_alloc(PBUF_RAW, p1->tot_len, PBUF_POOL); + fail_unless(p3 != NULL); err = pbuf_copy(p3, p1); fail_unless(err == ERR_VAL); @@ -161,8 +162,8 @@ START_TEST(test_pbuf_copy_partial_pbuf) b->payload = packet; pbuf_cat(a, b); dest = pbuf_alloc(PBUF_RAW, 14, PBUF_RAM); - memset(dest->payload, 0, dest->len); fail_unless(dest != NULL); + memset(dest->payload, 0, dest->len); /* Don't copy if data will not fit */ err = pbuf_copy_partial_pbuf(dest, a, a->tot_len, 4); @@ -198,6 +199,7 @@ START_TEST(test_pbuf_split_64k_on_small_pbufs) LWIP_UNUSED_ARG(_i); p = pbuf_alloc(PBUF_RAW, 1, PBUF_POOL); + fail_unless(p != NULL); pbuf_split_64k(p, &rest); fail_unless(p->tot_len == 1); pbuf_free(p); @@ -267,9 +269,14 @@ START_TEST(test_pbuf_take_at_edge) u8_t *out; int i; u8_t testdata[] = { 0x01, 0x08, 0x82, 0x02 }; - struct pbuf *p = pbuf_alloc(PBUF_RAW, 1024, PBUF_POOL); - struct pbuf *q = p->next; + struct pbuf *p; + struct pbuf *q; LWIP_UNUSED_ARG(_i); + + p = pbuf_alloc(PBUF_RAW, 1024, PBUF_POOL); + fail_unless(p != NULL); + q = p->next; + /* alloc big enough to get a chain of pbufs */ fail_if(p->tot_len == p->len); memset(p->payload, 0, p->len); @@ -319,9 +326,14 @@ START_TEST(test_pbuf_get_put_at_edge) u8_t *out; u8_t testdata = 0x01; u8_t getdata; - struct pbuf *p = pbuf_alloc(PBUF_RAW, 1024, PBUF_POOL); - struct pbuf *q = p->next; + struct pbuf *p; + struct pbuf *q; LWIP_UNUSED_ARG(_i); + + p = pbuf_alloc(PBUF_RAW, 1024, PBUF_POOL); + fail_unless(p != NULL); + q = p->next; + /* alloc big enough to get a chain of pbufs */ fail_if(p->tot_len == p->len); memset(p->payload, 0, p->len); diff --git a/test/unit/dhcp/test_dhcp.c b/test/unit/dhcp/test_dhcp.c index ac8a2191..0a75e549 100644 --- a/test/unit/dhcp/test_dhcp.c +++ b/test/unit/dhcp/test_dhcp.c @@ -155,6 +155,11 @@ static void tick_lwip(void) } } +static u32_t get_bad_xid(const struct netif *netif) +{ + return ~netif_dhcp_data(netif)->xid; +} + static void send_pkt(struct netif *netif, const u8_t *data, size_t len) { struct pbuf *p, *q; @@ -493,7 +498,7 @@ START_TEST(test_dhcp) dhcp_start(&net_test); fail_unless(txpacket == 1); /* DHCP discover sent */ - xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */ + xid = get_bad_xid(&net_test); memcpy(&dhcp_offer[46], &xid, 4); send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer)); @@ -508,7 +513,7 @@ START_TEST(test_dhcp) send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer)); fail_unless(txpacket == 2, "TX %d packets, expected 2", txpacket); /* DHCP request sent */ - xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */ + xid = get_bad_xid(&net_test); memcpy(&dhcp_ack[46], &xid, 4); send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack)); @@ -568,7 +573,7 @@ START_TEST(test_dhcp_nak) dhcp_start(&net_test); fail_unless(txpacket == 1); /* DHCP discover sent */ - xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */ + xid = get_bad_xid(&net_test); memcpy(&dhcp_offer[46], &xid, 4); send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer)); @@ -583,7 +588,7 @@ START_TEST(test_dhcp_nak) send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer)); fail_unless(txpacket == 2); /* DHCP request sent */ - xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */ + xid = get_bad_xid(&net_test); memcpy(&dhcp_ack[46], &xid, 4); send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack)); @@ -941,7 +946,7 @@ START_TEST(test_dhcp_nak_no_endmarker) dhcp = netif_dhcp_data(&net_test); fail_unless(txpacket == 1); /* DHCP discover sent */ - xid = dhcp->xid; /* Write bad xid, not using htonl! */ + xid = get_bad_xid(&net_test); memcpy(&dhcp_offer[46], &xid, 4); send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer)); diff --git a/test/unit/ip4/test_ip4.c b/test/unit/ip4/test_ip4.c index af715daf..64ec1c4f 100644 --- a/test/unit/ip4/test_ip4.c +++ b/test/unit/ip4/test_ip4.c @@ -147,6 +147,7 @@ START_TEST(test_ip4_frag) LWIP_UNUSED_ARG(_i); linkoutput_ctr = 0; + linkoutput_byte_ctr = 0; /* Verify that 8000 byte payload is split into six packets */ fail_unless(data != NULL); diff --git a/test/unit/ip6/test_ip6.c b/test/unit/ip6/test_ip6.c index 43ffcf78..a030ee5a 100644 --- a/test/unit/ip6/test_ip6.c +++ b/test/unit/ip6/test_ip6.c @@ -66,6 +66,50 @@ ip6_test_handle_timers(int count) } } +/* Helper functions */ +static void +create_ip6_input_fragment(u32_t ip_id, u16_t start, u16_t len, int last, u8_t next_hdr) +{ + struct pbuf* p; + struct netif* input_netif = netif_list; /* just use any netif */ + fail_unless((start & 7) == 0); + fail_unless(((len & 7) == 0) || last); + fail_unless(input_netif != NULL); + + p = pbuf_alloc(PBUF_RAW, len + sizeof(struct ip6_frag_hdr) + + sizeof(struct ip6_hdr), PBUF_RAM); + fail_unless(p != NULL); + if (p != NULL) { + err_t err; + struct ip6_frag_hdr* fraghdr; + + struct ip6_hdr* ip6hdr = (struct ip6_hdr*)p->payload; + IP6H_VTCFL_SET(ip6hdr, 6, 0, 0); + IP6H_PLEN_SET(ip6hdr, len + sizeof(struct ip6_frag_hdr)); + IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_FRAGMENT); + IP6H_HOPLIM_SET(ip6hdr, 64); + ip6_addr_copy_to_packed(ip6hdr->src, *netif_ip6_addr(input_netif, 0)); + ip6hdr->src.addr[3]++; + ip6_addr_copy_to_packed(ip6hdr->dest, *netif_ip6_addr(input_netif, 0)); + + fraghdr = (struct ip6_frag_hdr*)(ip6hdr + 1); + fraghdr->_nexth = next_hdr; + fraghdr->reserved = 0; + if (last) { + fraghdr->_fragment_offset = htons(start & ~7); + } else { + fraghdr->_fragment_offset = htons((start & ~7) | 1); + } + fraghdr->_identification = htonl(ip_id); + + err = ip6_input(p, input_netif); + if (err != ERR_OK) { + pbuf_free(p); + } + fail_unless(err == ERR_OK); + } +} + /* Setups/teardown functions */ static void @@ -432,6 +476,50 @@ START_TEST(test_ip6_frag) } END_TEST +static void test_ip6_reass_helper(u32_t ip_id, const u16_t *segments, size_t num_segs, u16_t seglen) +{ + ip_addr_t my_addr = IPADDR6_INIT_HOST(0x20010db8, 0x0, 0x0, 0x1); + size_t i; + + memset(&lwip_stats.mib2, 0, sizeof(lwip_stats.mib2)); + memset(&lwip_stats.ip6_frag, 0, sizeof(lwip_stats.ip6_frag)); + + netif_set_up(&test_netif6); + netif_ip6_addr_set(&test_netif6, 0, ip_2_ip6(&my_addr)); + netif_ip6_addr_set_state(&test_netif6, 0, IP6_ADDR_VALID); + + for (i = 0; i < num_segs; i++) { + u16_t seg = segments[i]; + int last = seg + 1U == num_segs; + create_ip6_input_fragment(ip_id, seg * seglen, seglen, last, IP6_NEXTH_UDP); + fail_unless(lwip_stats.ip6_frag.recv == i + 1); + fail_unless(lwip_stats.ip6_frag.err == 0); + fail_unless(lwip_stats.ip6_frag.memerr == 0); + fail_unless(lwip_stats.ip6_frag.drop == 0); + if (i + 1 == num_segs) { + fail_unless(lwip_stats.mib2.ip6reasmoks == 1); + } + else { + fail_unless(lwip_stats.mib2.ip6reasmoks == 0); + } + } +} + +START_TEST(test_ip6_reass) +{ +#define NUM_SEGS 9 + const u16_t t1[NUM_SEGS] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; + const u16_t t2[NUM_SEGS] = { 8, 0, 1, 2, 3, 4, 7, 6, 5 }; + const u16_t t3[NUM_SEGS] = { 1, 2, 3, 4, 5, 6, 7, 8, 0 }; + const u16_t t4[NUM_SEGS] = { 8, 2, 4, 6, 7, 5, 3, 1, 0 }; + LWIP_UNUSED_ARG(_i); + + test_ip6_reass_helper(128, t1, NUM_SEGS, 200); + test_ip6_reass_helper(129, t2, NUM_SEGS, 208); + test_ip6_reass_helper(130, t3, NUM_SEGS, 8); + test_ip6_reass_helper(130, t4, NUM_SEGS, 1448); +} + /** Create the suite including all tests for this module */ Suite * ip6_suite(void) @@ -444,7 +532,8 @@ ip6_suite(void) TESTFUNC(test_ip6_lladdr), TESTFUNC(test_ip6_dest_unreachable_chained_pbuf), TESTFUNC(test_ip6_frag_pbuf_len_assert), - TESTFUNC(test_ip6_frag) + TESTFUNC(test_ip6_frag), + TESTFUNC(test_ip6_reass) }; return create_suite("IPv6", tests, sizeof(tests)/sizeof(testfunc), ip6_setup, ip6_teardown); } diff --git a/test/unit/lwip_unittests.c b/test/unit/lwip_unittests.c index 8d47e45c..d088a066 100644 --- a/test/unit/lwip_unittests.c +++ b/test/unit/lwip_unittests.c @@ -58,9 +58,15 @@ void lwip_check_ensure_no_alloc(unsigned int skip) } for (i = 0, mask = 1; i < MEMP_MAX; i++, mask <<= 1) { if (!(skip & mask)) { +#if defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY fail_unless(lwip_stats.memp[i]->used == 0, "memp pool '%s' still has %d entries allocated", lwip_stats.memp[i]->name, lwip_stats.memp[i]->used); +#else + fail_unless(lwip_stats.memp[i]->used == 0, + "memp pool %d still has %d entries allocated", + i, lwip_stats.memp[i]->used); +#endif } } } diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index 0ee09dff..03579ee7 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -59,7 +59,7 @@ #define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_RAND_SRC_PORT) /* Minimal changes to opt.h required for tcp unit tests: */ -#define MEM_SIZE 16000 +#define MEM_SIZE 17000 #define TCP_SND_QUEUELEN 40 #define MEMP_NUM_TCP_SEG TCP_SND_QUEUELEN #define TCP_SND_BUF (12 * TCP_MSS) @@ -91,4 +91,27 @@ /* Check lwip_stats.mem.illegal instead of asserting */ #define LWIP_MEM_ILLEGAL_FREE(msg) /* to nothing */ +/* autodetect if we are running the tests on 32-bit or 64-bit */ +#if defined(_WIN32) || defined(_WIN64) +#if defined(_WIN64) +#define PTR64 +#else +#define PTR32 +#endif +#elif defined(__GNUC__) +#if defined(__x86_64__) || defined(__ppc64__) +#define PTR64 +#else +#define PTR32 +#endif +#elif UINTPTR_MAX > UINT_MAX +#define PTR64 +#else +#define PTR32 +#endif + +#ifdef PTR64 +#define IPV6_FRAG_COPYHEADER 1 +#endif + #endif /* LWIP_HDR_LWIPOPTS_H */ diff --git a/test/unit/mqtt/test_mqtt.c b/test/unit/mqtt/test_mqtt.c index 7cff13ea..9722aa66 100644 --- a/test/unit/mqtt/test_mqtt.c +++ b/test/unit/mqtt/test_mqtt.c @@ -77,7 +77,7 @@ START_TEST(basic_connect) "dumm", NULL, NULL, 10, - NULL, NULL, 0, 0 + NULL, NULL, 0, 0, 0 }; struct pbuf *p; unsigned char rxbuf[] = {0x20, 0x02, 0x00, 0x00}; diff --git a/test/unit/tcp/test_tcp.c b/test/unit/tcp/test_tcp.c index 42324d47..2efcbbf3 100644 --- a/test/unit/tcp/test_tcp.c +++ b/test/unit/tcp/test_tcp.c @@ -517,7 +517,7 @@ START_TEST(test_tcp_fast_retx_recover) /* queue data4, don't send it (unsent-oversize is != 0) */ err = tcp_write(pcb, data4, sizeof(data4), TCP_WRITE_FLAG_COPY); EXPECT_RET(err == ERR_OK); - /* 3nd duplicate ACK for data1 (data2 and data3 are lost) -> fast retransmission */ + /* 3rd duplicate ACK for data1 (data2 and data3 are lost) -> fast retransmission */ p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); EXPECT_RET(p != NULL); test_tcp_input(p, &netif); diff --git a/test/unit/tcp/test_tcp_oos.c b/test/unit/tcp/test_tcp_oos.c index a190e7dc..43d722b2 100644 --- a/test/unit/tcp/test_tcp_oos.c +++ b/test/unit/tcp/test_tcp_oos.c @@ -515,7 +515,7 @@ START_TEST(test_tcp_recv_ooseq_overrun_rxwin) } } - /* pass in one more segment, cleary overrunning the rxwin */ + /* pass in one more segment, clearly overrunning the rxwin */ p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); EXPECT_RET(p_ovr != NULL); /* pass the segment to tcp_input */ @@ -602,7 +602,7 @@ START_TEST(test_tcp_recv_ooseq_overrun_rxwin_edge) } } - /* pass in one more segment, cleary overrunning the rxwin */ + /* pass in one more segment, clearly overrunning the rxwin */ p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); EXPECT_RET(p_ovr != NULL); /* pass the segment to tcp_input */