Fix bug in IP address parsing from gai

This commit is contained in:
Hackintosh Five 2023-06-14 00:42:04 +01:00
parent c767d81251
commit 6cb990d57d
2 changed files with 40 additions and 116 deletions

@ -32,6 +32,8 @@
#ifndef LWIP_LWIPOPTS_H #ifndef LWIP_LWIPOPTS_H
#define LWIP_LWIPOPTS_H #define LWIP_LWIPOPTS_H
#define LWIP_DEBUG 0
#ifdef LWIP_OPTTEST_FILE #ifdef LWIP_OPTTEST_FILE
#include "lwipopts_test.h" #include "lwipopts_test.h"
#else /* LWIP_OPTTEST_FILE */ #else /* LWIP_OPTTEST_FILE */
@ -74,35 +76,35 @@
#define LWIP_NETIF_STATUS_CALLBACK 1 #define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_EXT_STATUS_CALLBACK 1 #define LWIP_NETIF_EXT_STATUS_CALLBACK 1
#ifdef LWIP_DEBUG #if LWIP_DEBUG
#define LWIP_DBG_MIN_LEVEL 0 #define LWIP_DBG_MIN_LEVEL 0
#define PPP_DEBUG LWIP_DBG_OFF #define PPP_DEBUG LWIP_DBG_ON
#define MEM_DEBUG LWIP_DBG_OFF #define MEM_DEBUG LWIP_DBG_ON
#define MEMP_DEBUG LWIP_DBG_OFF #define MEMP_DEBUG LWIP_DBG_ON
#define PBUF_DEBUG LWIP_DBG_OFF #define PBUF_DEBUG LWIP_DBG_ON
#define API_LIB_DEBUG LWIP_DBG_OFF #define API_LIB_DEBUG LWIP_DBG_ON
#define API_MSG_DEBUG LWIP_DBG_OFF #define API_MSG_DEBUG LWIP_DBG_ON
#define TCPIP_DEBUG LWIP_DBG_OFF #define TCPIP_DEBUG LWIP_DBG_ON
#define NETIF_DEBUG LWIP_DBG_OFF #define NETIF_DEBUG LWIP_DBG_ON
#define SOCKETS_DEBUG LWIP_DBG_OFF #define SOCKETS_DEBUG LWIP_DBG_ON
#define DNS_DEBUG LWIP_DBG_OFF #define DNS_DEBUG LWIP_DBG_ON
#define AUTOIP_DEBUG LWIP_DBG_OFF #define AUTOIP_DEBUG LWIP_DBG_ON
#define DHCP_DEBUG LWIP_DBG_OFF #define DHCP_DEBUG LWIP_DBG_ON
#define IP_DEBUG LWIP_DBG_OFF #define IP_DEBUG LWIP_DBG_ON
#define IP_REASS_DEBUG LWIP_DBG_OFF #define IP_REASS_DEBUG LWIP_DBG_ON
#define ICMP_DEBUG LWIP_DBG_OFF #define ICMP_DEBUG LWIP_DBG_ON
#define IGMP_DEBUG LWIP_DBG_OFF #define IGMP_DEBUG LWIP_DBG_ON
#define UDP_DEBUG LWIP_DBG_OFF #define UDP_DEBUG LWIP_DBG_ON
#define TCP_DEBUG LWIP_DBG_OFF #define TCP_DEBUG LWIP_DBG_ON
#define TCP_INPUT_DEBUG LWIP_DBG_OFF #define TCP_INPUT_DEBUG LWIP_DBG_ON
#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF #define TCP_OUTPUT_DEBUG LWIP_DBG_ON
#define TCP_RTO_DEBUG LWIP_DBG_OFF #define TCP_RTO_DEBUG LWIP_DBG_ON
#define TCP_CWND_DEBUG LWIP_DBG_OFF #define TCP_CWND_DEBUG LWIP_DBG_ON
#define TCP_WND_DEBUG LWIP_DBG_OFF #define TCP_WND_DEBUG LWIP_DBG_ON
#define TCP_FR_DEBUG LWIP_DBG_OFF #define TCP_FR_DEBUG LWIP_DBG_ON
#define TCP_QLEN_DEBUG LWIP_DBG_OFF #define TCP_QLEN_DEBUG LWIP_DBG_ON
#define TCP_RST_DEBUG LWIP_DBG_OFF #define TCP_RST_DEBUG LWIP_DBG_ON
#endif #endif
#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT) #define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT)
@ -213,7 +215,7 @@ a lot of data that needs to be copied, this should be set high. */
/* ---------- ARP options ---------- */ /* ---------- ARP options ---------- */
#define LWIP_ARP 1 #define LWIP_ARP 1
#define ARP_TABLE_SIZE 0 #define ARP_TABLE_SIZE 10
#define ARP_QUEUEING 1 #define ARP_QUEUEING 1

@ -48,18 +48,9 @@
#include <event2/event.h> #include <event2/event.h>
#include <event2/listener.h> #include <event2/listener.h>
//#include "lwip/opt.h"
//#include "lwip/debug.h"
//#include "lwip/err.h"
//#include "lwip/init.h"
#include "lwip/ip.h" #include "lwip/ip.h"
#include "lwip/tcp.h" #include "lwip/tcp.h"
#include "lwip/init.h" #include "lwip/init.h"
//#include "lwip/dns.h"
//#include "lwip/netif.h"
//#include "lwip/stats.h"
//#include "lwip/sys.h"
//#include "lwip/tcp.h"
enum { enum {
STATE_NEW = 0, STATE_NEW = 0,
@ -110,39 +101,6 @@ struct ocp_sock {
struct netif *netif; struct netif *netif;
}; };
struct socks_auth {
u8_t ver;
u8_t n_methods;
u8_t methods;
} PACK_STRUCT_STRUCT;
struct socks_req {
u8_t ver;
u8_t cmd;
u8_t rsv;
u8_t atyp;
union {
struct {
u32_t dst_addr;
u16_t dst_port;
u8_t end;
} ipv4;
struct {
u8_t fqdn_len;
u8_t fqdn_name[255]; /* variable length */
u16_t port;
} fqdn;
} u;
} PACK_STRUCT_STRUCT;
struct socks_reply {
u8_t ver;
u8_t rep;
u8_t rsv;
u8_t atyp;
u32_t bnd_addr;
u16_t bnd_port;
} PACK_STRUCT_STRUCT;
static struct event_base *event_base; static struct event_base *event_base;
@ -152,14 +110,10 @@ static struct ocp_sock *ocp_sock_bind_list;
static int ocp_sock_used; static int ocp_sock_used;
static int ocp_sock_max; static int ocp_sock_max;
/* nonstatic debug cmd option, exported in lwipopts.h */
unsigned char debug_flags = 0;
static int allow_remote; static int allow_remote;
static int tcpdump_enabled;
static int got_sighup; static int got_sighup;
static int got_sigusr1; static int got_sigusr1;
static char *dns_domain;
static void start_connection(struct ocp_sock *s); static void start_connection(struct ocp_sock *s);
@ -354,10 +308,6 @@ static err_t recv_cb(void *ctx, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
return ERR_OK; return ERR_OK;
} }
/**********************************************************************
* SOCKS protocol
**********************************************************************/
/********************************************************************** /**********************************************************************
* Connection setup * Connection setup
**********************************************************************/ **********************************************************************/
@ -640,6 +590,7 @@ static void fwd_add(const char *opt)
} }
ip_addr_t addr; ip_addr_t addr;
if (addrinfo->ai_addr->sa_family == AF_INET6) { if (addrinfo->ai_addr->sa_family == AF_INET6) {
IP_SET_TYPE(&addr, IPADDR_TYPE_V6);
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addrinfo->ai_addr; struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addrinfo->ai_addr;
//addr.u_addr.ip6.zone = addr6->sin6_scope_id; //addr.u_addr.ip6.zone = addr6->sin6_scope_id;
addr.u_addr.ip6.addr[0] = addr.u_addr.ip6.addr[0] =
@ -663,6 +614,7 @@ static void fwd_add(const char *opt)
addr6->sin6_addr.s6_addr[14] << 8 | addr6->sin6_addr.s6_addr[14] << 8 |
addr6->sin6_addr.s6_addr[15] << 0; addr6->sin6_addr.s6_addr[15] << 0;
} else { } else {
IP_SET_TYPE(&addr, IPADDR_TYPE_V4);
struct sockaddr_in *addr4 = (struct sockaddr_in *) addrinfo->ai_addr; struct sockaddr_in *addr4 = (struct sockaddr_in *) addrinfo->ai_addr;
addr.u_addr.ip4.addr = addr4->sin_addr.s_addr; addr.u_addr.ip4.addr = addr4->sin_addr.s_addr;
} }
@ -683,13 +635,8 @@ static void fwd_add(const char *opt)
static struct option longopts[] = { static struct option longopts[] = {
{ "ip", 1, NULL, 'I' }, { "ip", 1, NULL, 'I' },
{ "mtu", 1, NULL, 'M' }, { "mtu", 1, NULL, 'M' },
{ "dns", 1, NULL, 'd' },
{ "domain", 1, NULL, 'o' },
{ "localfw", 1, NULL, 'L' }, { "localfw", 1, NULL, 'L' },
{ "dynfw", 1, NULL, 'D' },
{ "allow-remote", 0, NULL, 'g' }, { "allow-remote", 0, NULL, 'g' },
{ "verbose", 0, NULL, 'v' },
{ "tcpdump", 0, NULL, 'T' },
{ NULL } { NULL }
}; };
@ -697,12 +644,13 @@ int main(int argc, char **argv)
{ {
int opt, i, vpnfd; int opt, i, vpnfd;
char *str; char *str;
char *ip_str, *mtu_str, *dns_str; char *ip_str, *mtu_str;
ip_addr_t ip, netmask, gw, dns; ip_addr_t ip;
ip4_addr_t netmask, gw;
struct ocp_sock *s; struct ocp_sock *s;
struct netif netif; struct netif netif;
ip_str = mtu_str = dns_str = NULL; ip_str = mtu_str = NULL;
ocp_sock_free_list = &ocp_sock_pool[0]; ocp_sock_free_list = &ocp_sock_pool[0];
for (i = 1; i < MAX_CONN; i++) for (i = 1; i < MAX_CONN; i++)
@ -721,21 +669,9 @@ int main(int argc, char **argv)
ip_str = getenv("INTERNAL_IP4_ADDRESS"); ip_str = getenv("INTERNAL_IP4_ADDRESS");
mtu_str = getenv("INTERNAL_IP4_MTU"); mtu_str = getenv("INTERNAL_IP4_MTU");
dns_domain = getenv("CISCO_DEF_DOMAIN");
str = getenv("INTERNAL_IP4_DNS");
if (str) {
char *p;
/* this could contain many addresses; just use the first one */
dns_str = xstrdup(str);
p = strchr(dns_str, ' ');
if (p)
*p = 0;
}
/* override with command line options */ /* override with command line options */
while ((opt = getopt_long(argc, argv, while ((opt = getopt_long(argc, argv,
"I:M:d:o:D:k:gL:vT", longopts, NULL)) != -1) { "I:M:gL:", longopts, NULL)) != -1) {
switch (opt) { switch (opt) {
case 'I': case 'I':
ip_str = optarg; ip_str = optarg;
@ -743,26 +679,12 @@ int main(int argc, char **argv)
case 'M': case 'M':
mtu_str = optarg; mtu_str = optarg;
break; break;
case 'd':
dns_str = optarg;
break;
case 'o':
dns_domain = optarg;
break;
case 'g': case 'g':
allow_remote = 1; allow_remote = 1;
break; break;
case 'L': case 'L':
fwd_add(optarg); fwd_add(optarg);
break; break;
case 'v':
debug_flags = LWIP_DBG_ON | LWIP_DBG_TRACE |
LWIP_DBG_STATE | LWIP_DBG_FRESH |
LWIP_DBG_HALT;
break;
case 'T':
tcpdump_enabled = 1;
break;
default: default:
die("unknown option: %c\n", opt); die("unknown option: %c\n", opt);
} }
@ -787,9 +709,9 @@ int main(int argc, char **argv)
s->netif = &netif; s->netif = &netif;
lwip_init(); lwip_init();
ip_addr_set_zero(&netmask); ip4_addr_set_zero(&netmask);
ip_addr_set_zero(&gw); ip4_addr_set_zero(&gw);
netif_add(&netif, &ip.u_addr.ip4, &netmask.u_addr.ip4, &gw.u_addr.ip4, s, init_oc_netif, ip_input); netif_add(&netif, ip_2_ip4(&ip), &netmask, &gw, s, init_oc_netif, ip_input);
netif.mtu = ocp_atoi(mtu_str); netif.mtu = ocp_atoi(mtu_str);
netif_set_default(&netif); netif_set_default(&netif);