Browse Source

Fix PROGMEM read in ErrorCode message

This could cause the printer to crash. The Serial Stream would show
a garbled string.

Also included in this commit:
* The buffer size is increased from 64 bytes to 192 bytes.  We need to
take into account the length of the ErrorTitle and ErrorDescription.
* Fix overwrite in ErrorCode message buffer.
Guðni Már Gilbert 3 years ago
parent
commit
6fab95f145
2 changed files with 10 additions and 7 deletions
  1. 8 4
      Firmware/mmu2.cpp
  2. 2 3
      Firmware/mmu2_error_converter.cpp

+ 8 - 4
Firmware/mmu2.cpp

@@ -609,10 +609,14 @@ void MMU2::ReportError(ErrorCode ec) {
         lastErrorCode = ec;
 
         // Log error format: MMU2:E=32766 TextDescription
-        char msg[64];
-        snprintf(msg, sizeof(msg), "MMU2:E=%hu", (uint16_t)ec);
+
+        // The longest error description in errors_list.h is 144 bytes.
+        // and the longest error title is 20 bytes. msg buffer needs
+        // to have enough space to fit both.
+        char msg[192];
+        int len = snprintf(msg, sizeof(msg), "MMU2:E=%hu", (uint16_t)ec);
         // Append a human readable form of the error code(s)
-        TranslateErr((uint16_t)ec, msg, sizeof(msg));
+        TranslateErr((uint16_t)ec, &msg[len], 192 - len);
 
         // beware - the prefix in the message ("MMU2") will get stripped by the logging subsystem
         // and a correct MMU2 component will be assigned accordingly - see appmain.cpp
@@ -620,7 +624,7 @@ void MMU2::ReportError(ErrorCode ec) {
         SERIAL_ECHO_START;
         SERIAL_ECHOLN(msg);
     }
-    
+
     static_assert(mmu2Magic[0] == 'M' 
         && mmu2Magic[1] == 'M' 
         && mmu2Magic[2] == 'U' 

+ 2 - 3
Firmware/mmu2_error_converter.cpp

@@ -92,9 +92,8 @@ void TranslateErr(uint16_t ec, char *dst, size_t dstSize) {
     uint16_t ei = MMUErrorCodeIndex(ec);
     // just to prevent the compiler from stripping the data structures from the final binary for now
     *dst = errorButtons[ei];
-    strncpy_P(dst + 1, errorTitles[ei], dstSize);
-    strncat_P(dst, errorDescs[ei], dstSize);
-    
+    strncpy_P(dst + 1, static_cast<const char * const>(pgm_read_ptr(&errorTitles[ei])), dstSize);
+    strncat_P(dst, static_cast<const char * const>(pgm_read_ptr(&errorDescs[ei])), dstSize);
 }
 
 } // namespace MMU2