mirror of https://github.com/joan2937/pigpio
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.
This commit is contained in:
parent
5847d5c099
commit
55d8b880fc
15
pigpio.c
15
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];
|
||||
|
||||
|
@ -6963,8 +6964,22 @@ static void *pthSocketThreadHandler(void *fdC)
|
|||
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&opt, sizeof(int));
|
||||
|
||||
while (1)
|
||||
{
|
||||
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])
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue