From b2497a3918a6d79808d9fd0c04734786e70d5954 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 6 Oct 2023 17:43:56 -0500 Subject: [PATCH] Rewrite extractVersionQuadFromString() to avoid copying the input string --- src/Misc.c | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/Misc.c b/src/Misc.c index da56fa0..0df1ffc 100644 --- a/src/Misc.c +++ b/src/Misc.c @@ -80,32 +80,19 @@ int gracefullyDisconnectEnetPeer(ENetHost* host, ENetPeer* peer, enet_uint32 lin } int extractVersionQuadFromString(const char* string, int* quad) { - char versionString[128]; - char* nextDot; - char* nextNumber; - int i; - - strcpy(versionString, string); - nextNumber = versionString; - - for (i = 0; i < 4; i++) { - if (i == 3) { - nextDot = strchr(nextNumber, '\0'); + const char* nextNumber = string; + for (int i = 0; i < 4; i++) { + // Parse the next component + quad[i] = (int)strtol(nextNumber, (char**)&nextNumber, 10); + + // Skip the dot if we still have version components left. + // + // We continue looping even when we're at the end of the + // input string to ensure all subsequent version components + // are zeroed. + if (*nextNumber != 0) { + nextNumber++; } - else { - nextDot = strchr(nextNumber, '.'); - } - if (nextDot == NULL) { - return -1; - } - - // Cut the string off at the next dot - *nextDot = '\0'; - - quad[i] = atoi(nextNumber); - - // Move on to the next segment - nextNumber = nextDot + 1; } return 0;