Przeglądaj źródła

[quickfix] protection against underflow

B Thibault 9 lat temu
rodzic
commit
e639dac811

+ 2 - 2
include/curseOutput.hh

@@ -133,8 +133,8 @@ class CurseOutput
         **/
         virtual void write(const std::string &str, const OutputFlag flags) const =0;
         unsigned int write(const int &x, const int &y, JSonElement *item, unsigned int maxWidth, const OutputFlag);
-        virtual unsigned int write(const int &x, const int &y, const std::string &item, const size_t len, unsigned int maxWidth, const OutputFlag) =0;
-        virtual unsigned int write(const int &x, const int &y, const char item, unsigned int maxWidth, const OutputFlag) =0;
+        virtual unsigned int write(const unsigned int &x, const unsigned int &y, const std::string &item, const size_t len, unsigned int maxWidth, const OutputFlag) =0;
+        virtual unsigned int write(const unsigned int &x, const unsigned int &y, const char item, unsigned int maxWidth, const OutputFlag) =0;
 
         /**
          * prompt for user input, and return it

+ 2 - 2
include/curseSimpleOutput.hh

@@ -38,8 +38,8 @@ class CurseSimpleOutput: public CurseOutput
         const OutputFlag getFlag(const JSonElement *item) const;
         const OutputFlag getFlag(const JSonElement *item, const JSonElement *selection) const;
 
-        unsigned int write(const int &x, const int &y, const char item, unsigned int maxWidth, OutputFlag flags);
-        unsigned int write(const int &x, const int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags);
+        unsigned int write(const unsigned int &x, const unsigned int &y, const char item, unsigned int maxWidth, OutputFlag flags);
+        unsigned int write(const unsigned int &x, const unsigned int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags);
         void write(const std::string &str, const OutputFlag flags) const;
         bool writeKey(const std::string &key, const size_t keylen, t_Cursor &cursor, OutputFlag, unsigned int extraLen =0);
         bool writeKey(const std::string &key, const size_t keylen, const std::string &after, size_t afterlen, t_Cursor &cursor, OutputFlag flags);

+ 2 - 2
include/curseSplitOutput.hh

@@ -48,8 +48,8 @@ class CurseSplitOutput: public CurseOutput
         bool writeKey(t_subWindow &, const std::string &key, const size_t keylen, OutputFlag flags, unsigned int extraLen =0);
         bool writeKey(t_subWindow &, const std::string &key, const size_t keylen, const std::string &after, const size_t afterlen, t_Cursor &cursor, OutputFlag);
         bool writeKey(t_subWindow &, const std::string &key, const size_t keylen, const std::string &after, t_Cursor &cursor, OutputFlag);
-        unsigned int write(const int &x, const int &y, const char item, unsigned int maxWidth, OutputFlag flags);
-        unsigned int write(const int &x, const int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags);
+        unsigned int write(const unsigned int &x, const unsigned int &y, const char item, unsigned int maxWidth, OutputFlag flags);
+        unsigned int write(const unsigned int &x, const unsigned int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags);
         void write(const std::string &str, const OutputFlag flags) const;
         void displayDiffOp(WINDOW *w, const int &y, const eLevenshteinOperator &op) const;
 

+ 8 - 10
src/curseSimpleOutput.cpp

@@ -313,7 +313,7 @@ bool CurseSimpleOutput::writeContent(t_Cursor &cursor, std::list<JSonElement*> *
 
 bool CurseSimpleOutput::writeKey(const std::string &key, const size_t keylen, t_Cursor &cursor, OutputFlag flags, unsigned int extraLen)
 {
-    if (cursor.second - scrollTop <= 0)
+    if (cursor.second <= scrollTop)
     {
         cursor.second++;
         return true;
@@ -329,7 +329,7 @@ bool CurseSimpleOutput::writeKey(const std::string &key, const size_t keylen, t_
 
 bool CurseSimpleOutput::writeKey(const std::string &key, const size_t keylen, const std::string &after, size_t afterlen, t_Cursor &cursor, OutputFlag flags)
 {
-    if (cursor.second - scrollTop <= 0)
+    if (cursor.second <= scrollTop)
     {
         cursor.second++;
         return true;
@@ -350,12 +350,11 @@ bool CurseSimpleOutput::writeKey(const std::string &key, const size_t keylen, co
     return writeKey(key, keylen, after, after.size(), cursor, flags);
 }
 
-unsigned int CurseSimpleOutput::write(const int &x, const int &y, const char item, unsigned int maxWidth, OutputFlag flags)
+unsigned int CurseSimpleOutput::write(const unsigned int &x, const unsigned int &y, const char item, unsigned int maxWidth, OutputFlag flags)
 {
-    int offsetY = y - scrollTop;
     char color = OutputFlag::SPECIAL_NONE;
 
-    if (offsetY <= 0)
+    if (y <= scrollTop)
         return 1;
 
     if (flags.selected())
@@ -367,19 +366,18 @@ unsigned int CurseSimpleOutput::write(const int &x, const int &y, const char ite
 
     if (color != OutputFlag::SPECIAL_NONE)
         attron(COLOR_PAIR(color));
-    mvprintw(offsetY, x, "%c", item);
+    mvprintw(y - scrollTop, x, "%c", item);
     attroff(A_REVERSE | A_BOLD);
     if (color != OutputFlag::SPECIAL_NONE)
         attroff(COLOR_PAIR(color));
     return getNbLines(x +1, maxWidth);
 }
 
-unsigned int CurseSimpleOutput::write(const int &x, const int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags)
+unsigned int CurseSimpleOutput::write(const unsigned int &x, const unsigned int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags)
 {
-    int offsetY = y - scrollTop;
-    if (offsetY <= 0)
+    if (y <= scrollTop)
         return 1;
-    move(offsetY, x);
+    move(y - scrollTop, x);
     write(str, flags);
     return getNbLines(strlen +x, maxWidth);
 }

+ 6 - 7
src/curseSplitOutput.cpp

@@ -689,13 +689,13 @@ bool CurseSplitOutput::writeObjectEntry(t_subWindow &w, JSonObjectEntry *ent)
     return !hasReachedBottom(w.cursor.second, w.scrollTop, screenSize.second);
 }
 
-unsigned int CurseSplitOutput::write(const int &x, const int &y, const char item, unsigned int maxWidth, OutputFlag flags)
+unsigned int CurseSplitOutput::write(const unsigned int &x, const unsigned int &y, const char item, unsigned int maxWidth, OutputFlag flags)
 {
-    int offsetY = y - subWindows.at(workingWin).scrollTop;
+    unsigned int offsetY = y - subWindows.at(workingWin).scrollTop;
     WINDOW *currentWin = subWindows.at(workingWin).innerWin;
     char color = OutputFlag::SPECIAL_NONE;
 
-    if (offsetY <= 0)
+    if (y <= subWindows.at(workingWin).scrollTop) // underflow / before top of screen
         return 1;
 
     if (flags.selected())
@@ -749,16 +749,15 @@ void CurseSplitOutput::displayDiffOp(WINDOW *w, const int &y, const eLevenshtein
     }
 }
 
-unsigned int CurseSplitOutput::write(const int &x, const int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags)
+unsigned int CurseSplitOutput::write(const unsigned int &x, const unsigned int &y, const std::string &str, const size_t strlen, unsigned int maxWidth, const OutputFlag flags)
 {
     const t_subWindow &w = subWindows.at(workingWin);
     WINDOW *currentWin = w.innerWin;
-    int offsetY = y - w.scrollTop;
 
-    if (offsetY <= 0)
+    if (y <= w.scrollTop)
         return 1;
     displayDiffOp(currentWin, y, flags.diffOp());
-    wmove(subWindows.at(workingWin).innerWin, offsetY, x);
+    wmove(subWindows.at(workingWin).innerWin, y - w.scrollTop, x);
     write(str, flags);
     return getNbLines(strlen +x, maxWidth);
 }