From cba3ba244b99f54393f2faba57d2e0ec64c0f94f Mon Sep 17 00:00:00 2001 From: mrwastl Date: Mon, 27 Jun 2011 22:24:52 +0200 Subject: paranoia mode for strcmp --- common.c | 16 ++++++++++++++++ common.h | 1 + service.c | 13 +++++++------ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/common.c b/common.c index e6c2113..439540d 100644 --- a/common.c +++ b/common.c @@ -3,6 +3,7 @@ #include #include +#include #if APIVERSNUM < 10503 #include @@ -141,3 +142,18 @@ GLCD::cType DurationType(int Index, const std::string &Format) } return false; } + +int ParanoiaStrcmp(const char *s1, const char *s2) +{ + if (! s1 || ! s2) + return -1; + + // s1 must be under 'our' control (and thus valid), s2 may be a string w/ unexpected content + size_t n = strlen(s1); + + int rv = strncmp(s1, s2, n); + if (rv == 0) + return (s2[n] == '\0') ? 0 : -1; + else + return rv; +} diff --git a/common.h b/common.h index 579da60..6412d17 100644 --- a/common.h +++ b/common.h @@ -1,2 +1,3 @@ GLCD::cType TimeType(time_t Time, const std::string &Format); GLCD::cType DurationType(int Index, const std::string &Format); +int ParanoiaStrcmp(const char *s1, const char *s2); diff --git a/service.c b/service.c index 9399e75..15d761c 100644 --- a/service.c +++ b/service.c @@ -12,6 +12,7 @@ #include #include "service.h" +#include "common.h" #include @@ -269,9 +270,9 @@ bool cGraphLCDService::NeedsUpdate(uint64_t CurrentTime) if ( (currRTSData.rds_info != checkRTSData.rds_info) || (currRTSData.rds_pty != checkRTSData.rds_pty) || - (checkRTSData.rds_text && (strcmp(currRTSData.rds_text, checkRTSData.rds_text) != 0)) || - (checkRTSData.rds_title && (strcmp(currRTSData.rds_title, checkRTSData.rds_title) != 0)) || - (checkRTSData.rds_artist && (strcmp(currRTSData.rds_artist, checkRTSData.rds_artist) != 0)) + (ParanoiaStrcmp(currRTSData.rds_text, checkRTSData.rds_text) != 0) || + (ParanoiaStrcmp(currRTSData.rds_title, checkRTSData.rds_title) != 0) || + (ParanoiaStrcmp(currRTSData.rds_artist, checkRTSData.rds_artist) != 0) ) { currRTSData.rds_info = checkRTSData.rds_info; @@ -300,9 +301,9 @@ bool cGraphLCDService::NeedsUpdate(uint64_t CurrentTime) if (cPluginManager::CallFirstService("LcrService-v1.0", &checkLcrData)) { lcrActive = true; if ( - (((const char*)checkLcrData.destination) && (strcmp(currLcrData.destination, checkLcrData.destination) != 0)) || - (((const char*)checkLcrData.price) && (strcmp(currLcrData.price, checkLcrData.price) != 0)) || - (((const char*)checkLcrData.pulse) && (strcmp(currLcrData.pulse, checkLcrData.pulse) != 0)) + (ParanoiaStrcmp(currLcrData.destination, checkLcrData.destination) != 0) || + (ParanoiaStrcmp(currLcrData.price, checkLcrData.price) != 0) || + (ParanoiaStrcmp(currLcrData.pulse, checkLcrData.pulse) != 0) ) { currLcrData.destination = checkLcrData.destination; -- cgit v1.2.3