From 76e267968d713f59b8a4966e509c7f09ad2b4e62 Mon Sep 17 00:00:00 2001 From: Alba Mendez Date: Tue, 14 Mar 2023 17:03:35 +0100 Subject: [PATCH 1/2] send length + data at the same time --- .../remotesmartcardreader/app/VPCDWorker.java | 11 +++++------ virtualsmartcard/src/vpcd/vpcd.c | 9 +++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/remote-reader/app/src/main/java/com/vsmartcard/remotesmartcardreader/app/VPCDWorker.java b/remote-reader/app/src/main/java/com/vsmartcard/remotesmartcardreader/app/VPCDWorker.java index 7db54c6..cfa1066 100644 --- a/remote-reader/app/src/main/java/com/vsmartcard/remotesmartcardreader/app/VPCDWorker.java +++ b/remote-reader/app/src/main/java/com/vsmartcard/remotesmartcardreader/app/VPCDWorker.java @@ -179,13 +179,12 @@ class VPCDWorker extends AsyncTask { private void sendToVPCD(byte[] data) throws IOException { /* convert length to network byte order. Note that Java always uses network byte order internally. */ - byte[] length = new byte[2]; - length[0] = (byte) (data.length >> 8); - length[1] = (byte) (data.length & 0xff); - outputStream.write(length); - - outputStream.write(data, 0, data.length); + byte[] packet = new byte[2 + data.length]; + packet[0] = (byte) (data.length >> 8); + packet[1] = (byte) (data.length & 0xff); + System.arraycopy(data, 0, packet, 2, data.length); + outputStream.write(packet); outputStream.flush(); } diff --git a/virtualsmartcard/src/vpcd/vpcd.c b/virtualsmartcard/src/vpcd/vpcd.c index d656744..a2047fe 100644 --- a/virtualsmartcard/src/vpcd/vpcd.c +++ b/virtualsmartcard/src/vpcd/vpcd.c @@ -219,6 +219,7 @@ static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t length, const unsigned ch { ssize_t r; uint16_t size; + char *sendBuffer; if (!ctx || length > 0xFFFF) { errno = EINVAL; @@ -226,11 +227,11 @@ static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t length, const unsigned ch } /* send size of message on 2 bytes */ + sendBuffer = (char *) alloca(length + 2); size = htons((uint16_t) length); - r = sendall(ctx->client_sock, (void *) &size, sizeof size); - if (r == sizeof size) - /* send message */ - r = sendall(ctx->client_sock, buffer, length); + memcpy(sendBuffer, &size, 2); + memcpy(sendBuffer + 2, buffer, length); + r = sendall(ctx->client_sock, sendBuffer, length + 2); if (r < 0) vicc_eject(ctx); From 8c8116724e852b9c58a8157d49cf8c1dec652422 Mon Sep 17 00:00:00 2001 From: Alba Mendez Date: Thu, 16 Mar 2023 10:58:12 +0100 Subject: [PATCH 2/2] swap alloca for malloc --- virtualsmartcard/src/vpcd/vpcd.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/virtualsmartcard/src/vpcd/vpcd.c b/virtualsmartcard/src/vpcd/vpcd.c index a2047fe..882feb1 100644 --- a/virtualsmartcard/src/vpcd/vpcd.c +++ b/virtualsmartcard/src/vpcd/vpcd.c @@ -226,8 +226,14 @@ static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t length, const unsigned ch return -1; } + /* allocate buffer for outgoing message */ + sendBuffer = (char *) malloc(length + 2); + if (sendBuffer == NULL) { + errno = ENOMEM; + return -1; + } + /* send size of message on 2 bytes */ - sendBuffer = (char *) alloca(length + 2); size = htons((uint16_t) length); memcpy(sendBuffer, &size, 2); memcpy(sendBuffer + 2, buffer, length); @@ -236,6 +242,7 @@ static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t length, const unsigned ch if (r < 0) vicc_eject(ctx); + free(sendBuffer); return r; }