Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Infinite Loop can be entered when extended_cache is enabled. #82

Description

@mdmason

Describe the bug
This issue will only occur if lx_nor_flash_extended_cache_entries attribute is none zero. That is the EXTENDED_CACHE is enabled.

The function _lx_nor_flash_driver_read() can enter an infinite loop if the flash_address parameter is between 0 and (LX_NOR_SECTOR_SIZE - 1).

The infinite loop occurs because 'lx_nor_flash_extended_cache_entry_sector_address' is assigned a value of 0 at line 172 of file lx_nor_flash_driver_read.c. Once this value becomes zero line 108 can NEVER become true as the cache_entry_start value will be zero while we search for a flash_address between 0 and (LX_NOR_SECTOR_SIZE - 1) in each of the cache entries.

The only way to exit this function when cache is enabled is via line 126 or 168 so if line 108 can NEVER become true then the while() loop will run forever.

For me this issue occurs when _lx_nor_flash_next_block_to_erase_find() is called. This causes the issue because at line 110 the parameter block_word_ptr is assigned the flash_base_address which is zero. So when it starts to iterate through each of the blocks the first call _lx_nor_flash_driver_read() on line 147 is passed the block_word_ptr value which the first time through is going to be zero, and therefore never returns from _lx_nor_flash_driver_read() function.

The only way to overcome this issue is by NOT using the first block of memory in the NOR flash, so that the flash_base_address starts at LX_NOR_SECTOR_SIZE instead of zero. Or turn of EXTENDED_CACHE and take a hit in speed. Or patch the file _lx_nor_flash_driver_read() so that lx_nor_flash_extended_cache_entry_sector_address can never be assign a value of zero in the _lx_nor_flash_driver_read() function.

To Reproduce
Steps to reproduce the behavior:

  1. Build my project in IAR Workbench.
  2. See error

Expected behavior
A clear and concise description of what you expected to happen.

Impact
Showstopper

Logs and console output
If applicable, add console logs or other types of debug information like Wireshark capture as .zip file.

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workinghardwareNew hardware or architecture support request

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions