Commit 19b98164 authored by Nikita Podguzov's avatar Nikita Podguzov Committed by Commit Bot

Policy: Disallow policy_templates objects to have duplicate keys

Bug: 1108908
Change-Id: Iff1c506befb6e7703f8858246cdade1493b87f66
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2409915
Commit-Queue: Nikita Podguzov <nikitapodguzov@chromium.org>
Reviewed-by: default avatarMaksim Ivanov <emaxx@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807662}
parent 37b4c90b
...@@ -7,6 +7,7 @@ Checks a policy_templates.json file for conformity to its syntax specification. ...@@ -7,6 +7,7 @@ Checks a policy_templates.json file for conformity to its syntax specification.
''' '''
import argparse import argparse
import ast
import json import json
import os import os
import re import re
...@@ -201,6 +202,20 @@ def MergeDict(*dicts): ...@@ -201,6 +202,20 @@ def MergeDict(*dicts):
return result return result
class DuplicateKeyVisitor(ast.NodeVisitor):
def visit_Dict(self, node):
seen_keys = set()
for i, node_key in enumerate(node.keys):
key = ast.literal_eval(node_key)
if key in seen_keys:
raise ValueError("Duplicate key '%s' in line %d found." %
(key, node.values[i].lineno))
seen_keys.add(key)
# Recursively check for all nested objects.
self.generic_visit(node)
class PolicyTemplateChecker(object): class PolicyTemplateChecker(object):
def __init__(self): def __init__(self):
...@@ -1516,7 +1531,12 @@ class PolicyTemplateChecker(object): ...@@ -1516,7 +1531,12 @@ class PolicyTemplateChecker(object):
def Main(self, filename, options, original_file_contents, current_version): def Main(self, filename, options, original_file_contents, current_version):
try: try:
with open(filename, "rb") as f: with open(filename, "rb") as f:
data = eval(f.read().decode("UTF-8")) raw_data = f.read().decode("UTF-8")
data = eval(raw_data)
DuplicateKeyVisitor().visit(ast.parse(raw_data))
except ValueError as e:
self._Error(str(e))
return 1
except: except:
import traceback import traceback
traceback.print_exc(file=sys.stdout) traceback.print_exc(file=sys.stdout)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment