From: Alexander Simon Date: Wed, 7 Aug 2019 11:39:18 +0000 (+0200) Subject: Fix network communication on arm64 X-Git-Tag: archive/raspbian/1.78-1+rpi1^2~4^2~25^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=55d8b880fca26ccf4b897bca1fe66796b9972345;p=pigpio.git Fix network communication on arm64 Base messages consist of four uint32 integers. Wrongly, integers are declared as a four-element uintptr_t array. The 16 bytes are written directly by recv(). This works great for arm32, but on arm64 uintptr_t is 64 bit (8 bytes). This patch reads four 32-bit integers and writes them into the uintptr_t array. --- diff --git a/pigpio.c b/pigpio.c index 6dba0d8..d78afd6 100644 --- a/pigpio.c +++ b/pigpio.c @@ -6953,6 +6953,7 @@ static void *pthSocketThreadHandler(void *fdC) { int sock = *(int*)fdC; uintptr_t p[10]; + uint32_t tmp; int opt; char buf[CMD_MAX_EXTENSION]; @@ -6964,7 +6965,21 @@ static void *pthSocketThreadHandler(void *fdC) while (1) { - if (recv(sock, p, 16, MSG_WAITALL) != 16) break; + if (sizeof(uintptr_t) == 8) + { + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[0] = (uintptr_t)tmp; + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[1] = (uintptr_t)tmp; + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[2] = (uintptr_t)tmp; + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[3] = (uintptr_t)tmp; + } + else + { + if (recv(sock, p, 16, MSG_WAITALL) != 16) break; + } if (p[3]) {