diff --git a/ggatec/ggatec.c b/ggatec/ggatec.c index 3ca77eb..7e1027e 100644 --- a/ggatec/ggatec.c +++ b/ggatec/ggatec.c @@ -95,10 +95,14 @@ send_thread(void *arg __unused) { struct g_gate_ctl_io ggio; struct g_gate_hdr hdr; - char buf[MAXPHYS]; + static char *buf; ssize_t data; + int buflen = 1024*1024; int error; + if (buf == NULL) + buf = malloc(buflen); + g_gate_log(LOG_NOTICE, "%s: started!", __func__); ggio.gctl_version = G_GATE_VERSION; @@ -106,7 +110,7 @@ send_thread(void *arg __unused) ggio.gctl_data = buf; for (;;) { - ggio.gctl_length = sizeof(buf); + ggio.gctl_length = buflen; ggio.gctl_error = 0; g_gate_ioctl(G_GATE_CMD_START, &ggio); error = ggio.gctl_error; @@ -203,9 +207,14 @@ recv_thread(void *arg __unused) { struct g_gate_ctl_io ggio; struct g_gate_hdr hdr; - char buf[MAXPHYS]; + static char *buf; + int buflen; ssize_t data; + buflen = 1024*1024; + if (buf == NULL) + buf = malloc(buflen); + g_gate_log(LOG_NOTICE, "%s: started!", __func__); ggio.gctl_version = G_GATE_VERSION; @@ -233,6 +242,13 @@ recv_thread(void *arg __unused) ggio.gctl_length = hdr.gh_length; ggio.gctl_error = hdr.gh_error; + if (ggio.gctl_length > buflen) { + g_gate_log(LOG_ERR, "Received too large data, %llu.", ggio.gctl_length); + reconnect = 1; + pthread_kill(sendtd, SIGUSR1); + break; + } + if (ggio.gctl_error == 0 && ggio.gctl_cmd == GGATE_CMD_READ) { data = g_gate_recv(recvfd, ggio.gctl_data, ggio.gctl_length, MSG_WAITALL);