mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-15 04:10:40 -07:00
fix: enforce renderLimit for empty renderTemplates calls (#894)
renderLimit was only checked inside the per-template loop, so
renderTemplates([], ...) skipped it. Empty {% for %} and {% tablerow %}
bodies call that path once per iteration (tablerow still does emitter
work for <tr>/<td>), bypassing the documented time budget. Check the
limiter at renderTemplates entry before the loop.
Add regression tests for empty for-body and empty tablerow-body.
Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -15,6 +15,7 @@ export class Render {
|
|||||||
if (!emitter) {
|
if (!emitter) {
|
||||||
emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter()
|
emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter()
|
||||||
}
|
}
|
||||||
|
ctx.renderLimit.check(getPerformance().now())
|
||||||
const errors = []
|
const errors = []
|
||||||
for (const tpl of templates) {
|
for (const tpl of templates) {
|
||||||
ctx.renderLimit.check(getPerformance().now())
|
ctx.renderLimit.check(getPerformance().now())
|
||||||
|
|||||||
@@ -48,6 +48,16 @@ describe('DoS related', function () {
|
|||||||
await expect(liquid.parseAndRender('{% render "large" %}')).rejects.toThrow('template render limit exceeded')
|
await expect(liquid.parseAndRender('{% render "large" %}')).rejects.toThrow('template render limit exceeded')
|
||||||
await expect(liquid.parseAndRender('{% render "small" %}')).resolves.toBe('12345')
|
await expect(liquid.parseAndRender('{% render "small" %}')).resolves.toBe('12345')
|
||||||
})
|
})
|
||||||
|
it('should enforce renderLimit when for body has no template nodes', () => {
|
||||||
|
const liquid = new Liquid({ memoryLimit: 1e9, renderLimit: 1 })
|
||||||
|
expect(() => liquid.parseAndRenderSync('{%- for i in (1..5000000) -%}{%- endfor -%}', {}))
|
||||||
|
.toThrow('template render limit exceeded')
|
||||||
|
})
|
||||||
|
it('should enforce renderLimit when tablerow body has no template nodes', () => {
|
||||||
|
const liquid = new Liquid({ memoryLimit: 1e9, renderLimit: 1 })
|
||||||
|
expect(() => liquid.parseAndRenderSync('{%- tablerow i in (1..1000000) cols:1 -%}{%- endtablerow -%}', {}))
|
||||||
|
.toThrow('template render limit exceeded')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
describe('#memoryLimit', () => {
|
describe('#memoryLimit', () => {
|
||||||
it('should throw for too many array creation in filters', async () => {
|
it('should throw for too many array creation in filters', async () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user