{"record":{"id":"2d15b24878130c03","repo":"google/tsunami-security-scanner","slug":"parse-payload-does-not-have-a-name","errorCode":null,"errorMessage":"Parse payload does not have a name.","messagePattern":"Parse payload does not have a name\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"plugin_server/py/plugin/payload/payload_utility.py","lineNumber":53,"sourceCode":"        - Payload that does not uses callback but has no specified validation\n          type.\n        - Payload that uses validation regex but does not specify the regex to\n          be used.\n  \"\"\"\n  payload_str = Path(_PATH).read_text()\n  yaml_parser = yaml.YAML(typ='safe', pure=True)\n  payload_dict = yaml_parser.load(payload_str)\n  payload_library = json_format.ParseDict(payload_dict, pg.PayloadLibrary())\n  return _validate_payloads([p for p in payload_library.payloads])\n\n\ndef _validate_payloads(\n    payloads: list[pg.PayloadDefinition],\n) -> list[pg.PayloadDefinition]:\n  \"\"\"Validate the pre-loaded payloads.\"\"\"\n  for payload in payloads:\n    if not payload.HasField('name'):\n      raise ValueError('Parse payload does not have a name.')\n    if (\n        payload.interpretation_environment\n        is pg.PayloadGeneratorConfig.InterpretationEnvironment.INTERPRETATION_ENVIRONMENT_UNSPECIFIED\n    ):\n      raise ValueError(\n          'Parse payload does not have an interpretation environment.'\n      )\n    if (\n        payload.execution_environment\n        is pg.PayloadGeneratorConfig.ExecutionEnvironment.EXECUTION_ENVIRONMENT_UNSPECIFIED\n    ):\n      raise ValueError('Parse payload does not have an execution environment.')\n    if (\n        pg.PayloadGeneratorConfig.VulnerabilityType.VULNERABILITY_TYPE_UNSPECIFIED\n        in payload.vulnerability_type\n    ):\n      raise ValueError('Parse payload does not have a vulnerability type.')\n    if not payload.HasField('payload_string'):","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/google/tsunami-security-scanner/blob/363ba87b3543f8ae8e4304d3416818f03da7f262/plugin_server/py/plugin/payload/payload_utility.py#L35-L71","documentation":"payload_utility._validate_payloads runs sanity checks on each pre-loaded PayloadDefinition. Every payload must have its proto 'name' field set; payloads lacking a name raise ValueError so that bad payload definitions fail fast at load time instead of producing unusable entries in the generator.","triggerScenarios":"get_parsed_payload(payloads) is called with a PayloadDefinition message whose name field is unset (proto default), e.g. a hand-written payload entry, a partially filled template, or a proto parsed from a resource missing the name field.","commonSituations":"Authors adding new payloads to the payload text/proto resources forgetting the name line; code constructing PayloadDefinition programmatically without setting name; merge conflicts dropping the name field.","solutions":["Add/restore the name field to the offending PayloadDefinition in the payload resource file","The error does not include the payload, so iterate payloads and log each HasField('name') result to find the bad one","If building payloads in code, set name before calling get_parsed_payload","Validate payload resource files after editing them (load them once in a test)"],"exampleFix":"// before\npayloads = [pg.PayloadDefinition(interpretation_environment=..., execution_environment=...)]\n// after\np = pg.PayloadDefinition(interpretation_environment=..., execution_environment=...)\np.name = 'rce-callback'\npayloads = [p]","handlingStrategy":"validation","validationCode":"def validate_names(payloads):\n    for i, p in enumerate(payloads):\n        if not p.HasField('name'):\n            raise ValueError(f'payload[{i}] is missing a name')\n    return payloads","typeGuard":null,"tryCatchPattern":"try:\n    payloads = payload_utility.get_parsed_payload(raw_payloads)\nexcept ValueError as e:\n    logging.error('Invalid payload definition: %s', e)\n    payloads = []","preventionTips":["Always set the proto name field when authoring PayloadDefinitions","Add a CI test that loads every payload resource through get_parsed_payload","Log payload indices/names when validating batches so bad entries are findable"],"tags":["python","payload","protobuf","schema-validation"],"backgroundTag":"schema-validation-failed","analyzedSha":"363ba87b3543f8ae8e4304d3416818f03da7f262","analyzedAt":"2026-09-13T01:50:53.990Z","contentChangedAt":"2026-09-13T01:50:53.990Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}