Skip to content

Roundtrip not possible when using identical array twice #800

Description

@NobodysNightmare

tl;dr:

require "yaml"
a = [1,2,3]
YAML.load(YAML.dump({ a: a, b: a }))
# raises 'Psych::Visitors::NoAliasRuby#visit_Psych_Nodes_Alias': Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`. (Psych::AliasesNotEnabled)

Long form

Hey there, today I noticed an error that surprised me quite a lot. Essentially as soon as you include the same array twice in a structure that you dump through Psych, it will not be loadable using a default YAML.load. You'd have to pass specific options to make it loadable.

The problem is that dump will generate YAML in the form:

---
:a: &1
- 1
- 2
- 3
:b: *1

This preserves the array identity for the hashes stored under a and b.

That's surprising to me. I'd have expected that if load disables certain YAML features by default, that dump would also only use those on an opt-in basis. Even worse: I don't see a setting documented that would allow me to disable the alias creation. The two fixes available to me right now:

  • enable alias deserialization (which I believed to be disabled by default for security considerations; though I fail to find a source for that now)
  • duplicate values in my dump input to avoid alias generation

Second solution shown in code:

YAML.load(YAML.dump({ a: a, b: a.dup }))
=> {a: [1, 2, 3], b: [1, 2, 3]}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions