From f3959e140106334b33cf74832fc5b20d27407d0a Mon Sep 17 00:00:00 2001 From: Alexander Tkachev Date: Fri, 22 Jul 2016 20:02:36 +0600 Subject: CLOUD: Upload ListDirectory Requests Lots of checks to avoid JSON-related segfaults added. --- backends/networking/curl/curljsonrequest.cpp | 61 ++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) (limited to 'backends/networking/curl/curljsonrequest.cpp') diff --git a/backends/networking/curl/curljsonrequest.cpp b/backends/networking/curl/curljsonrequest.cpp index 4d87aa2649..7db56cfdcc 100644 --- a/backends/networking/curl/curljsonrequest.cpp +++ b/backends/networking/curl/curljsonrequest.cpp @@ -42,7 +42,7 @@ CurlJsonRequest::~CurlJsonRequest() { char *CurlJsonRequest::getPreparedContents() { //write one more byte in the end - byte zero[1] = { 0 }; + byte zero[1] = {0}; _contentsStream.write(zero, 1); //replace all "bad" bytes with '.' character @@ -114,8 +114,12 @@ bool CurlJsonRequest::jsonIsObject(Common::JSONValue *item, const char *warningP return false; } -bool CurlJsonRequest::jsonContainsString(Common::JSONObject &item, const char *key, const char *warningPrefix) { +bool CurlJsonRequest::jsonContainsString(Common::JSONObject &item, const char *key, const char *warningPrefix, bool isOptional) { if (!item.contains(key)) { + if (isOptional) { + return true; + } + warning("%s: passed item misses the \"%s\" attribute!", warningPrefix, key); return false; } @@ -127,8 +131,12 @@ bool CurlJsonRequest::jsonContainsString(Common::JSONObject &item, const char *k return false; } -bool CurlJsonRequest::jsonContainsIntegerNumber(Common::JSONObject &item, const char *key, const char *warningPrefix) { +bool CurlJsonRequest::jsonContainsIntegerNumber(Common::JSONObject &item, const char *key, const char *warningPrefix, bool isOptional) { if (!item.contains(key)) { + if (isOptional) { + return true; + } + warning("%s: passed item misses the \"%s\" attribute!", warningPrefix, key); return false; } @@ -140,4 +148,51 @@ bool CurlJsonRequest::jsonContainsIntegerNumber(Common::JSONObject &item, const return false; } +bool CurlJsonRequest::jsonContainsArray(Common::JSONObject &item, const char *key, const char *warningPrefix, bool isOptional) { + if (!item.contains(key)) { + if (isOptional) { + return true; + } + + warning("%s: passed item misses the \"%s\" attribute!", warningPrefix, key); + return false; + } + + if (item.getVal(key)->isArray()) return true; + + warning("%s: passed item's \"%s\" attribute is not an array!", warningPrefix, key); + debug(9, "%s", item.getVal(key)->stringify(true).c_str()); + return false; +} + +bool CurlJsonRequest::jsonContainsStringOrIntegerNumber(Common::JSONObject &item, const char *key, const char *warningPrefix, bool isOptional) { + if (!item.contains(key)) { + if (isOptional) { + return true; + } + + warning("%s: passed item misses the \"%s\" attribute!", warningPrefix, key); + return false; + } + + if (item.getVal(key)->isString() || item.getVal(key)->isIntegerNumber()) return true; + + warning("%s: passed item's \"%s\" attribute is neither a string or an integer!", warningPrefix, key); + debug(9, "%s", item.getVal(key)->stringify(true).c_str()); + return false; +} + +bool CurlJsonRequest::jsonContainsAttribute(Common::JSONObject &item, const char *key, const char *warningPrefix, bool isOptional) { + if (!item.contains(key)) { + if (isOptional) { + return true; + } + + warning("%s: passed item misses the \"%s\" attribute!", warningPrefix, key); + return false; + } + + return true; +} + } // End of namespace Networking -- cgit v1.2.3