Skip to content

[Code scan] HybridDriver mutates caller-provided driver config dictionaries #988

Description

@njzjz

This issue is part of a Codex global repository code scan.

HybridDriver.__init__() deletes the "type" key from each caller-provided config dictionary. This mutates user input and makes the same config object unusable for a later construction.

Affected code:

dpdata/dpdata/driver.py

Lines 137 to 146 in a7a50bf

def __init__(self, drivers: list[dict | Driver]) -> None:
self.drivers = []
for driver in drivers:
if isinstance(driver, Driver):
self.drivers.append(driver)
elif isinstance(driver, dict):
type = driver["type"]
del driver["type"]
self.drivers.append(Driver.get_driver(type)(**driver))
else:

Minimal reproducer:

from dpdata.driver import Driver, HybridDriver

class DummyDriver(Driver):
    def label(self, data):
        return data

Driver.register("scan_dummy")(DummyDriver)

config = [{"type": "scan_dummy"}]
print("before", config)
HybridDriver(config)
print("after", config)
HybridDriver(config)

Current behavior:

before [{'type': 'scan_dummy'}]
after [{}]
KeyError: 'type'

HybridDriver should copy each config dict before popping or deleting keys.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions