From fa18b0a83b7575a27847d35ea9dfcf5df3a378b8 Mon Sep 17 00:00:00 2001 From: dporfiryev Date: Mon, 14 Jul 2025 15:02:52 +0300 Subject: [PATCH] Fix: prevent cyclic XSD imports by tracking loaded files --- __tests__/XMLSchemata.js | 15 +++++++++++++++ lib/XMLSchemata.js | 6 ++++++ 2 files changed, 21 insertions(+) create mode 100644 __tests__/XMLSchemata.js diff --git a/__tests__/XMLSchemata.js b/__tests__/XMLSchemata.js new file mode 100644 index 0000000..87d4ebe --- /dev/null +++ b/__tests__/XMLSchemata.js @@ -0,0 +1,15 @@ +const path = require('path') +const { XMLSchemata } = require('../') + +test('cyclic import', async () => { + const xsdPath = path.join(__dirname, '..', '__data__', '30213','RequestEGRN_v026.xsd') + + const schemata = await new Promise((resolve, reject) => { + XMLSchemata.fromFile(xsdPath) + .then(s => resolve(s)) + .catch(e => reject(e)) + }) + + expect(schemata).toBeDefined() + expect(schemata.size).toBeGreaterThan(0) +}) \ No newline at end of file diff --git a/lib/XMLSchemata.js b/lib/XMLSchemata.js index c268326..3b6f9d5 100644 --- a/lib/XMLSchemata.js +++ b/lib/XMLSchemata.js @@ -27,6 +27,8 @@ const XMLSchemata = class extends Map { new XMLSchemaXml (this) new XMLSchemaBuiltIn (this) + this.loadedFiles = new Set() + this.addFile (fn) } @@ -159,6 +161,10 @@ const XMLSchemata = class extends Map { addFile (fn, options = {}) { + if (this.loadedFiles.has (fn)) return + + this.loadedFiles.add (fn) + options.dirname = path.dirname (fn) const document = this.parser.process (fs.readFileSync (fn, 'utf-8'))