From 9c74272c9b8ec573bad16312688697e2329d547d Mon Sep 17 00:00:00 2001
From: Ales Nosek <ales.nosek@gmail.com>
Date: Wed, 2 Dec 2015 20:31:27 -0800
Subject: [PATCH] Fix #2475 ini_file module: bracklets in key break idempotence

Escape the regex special characters in the option name.
---
 files/ini_file.py | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/files/ini_file.py b/files/ini_file.py
index 82d4621dfbb..2dd021ad27c 100644
--- a/files/ini_file.py
+++ b/files/ini_file.py
@@ -99,6 +99,22 @@ import ConfigParser
 import sys
 import os
 
+# ==============================================================
+# match_opt
+
+def match_opt(option, line):
+  option = re.escape(option)
+  return re.match('%s *=' % option, line) \
+    or re.match('# *%s *=' % option, line) \
+    or re.match('; *%s *=' % option, line)
+
+# ==============================================================
+# match_active_opt
+
+def match_active_opt(option, line):
+  option = re.escape(option)
+  return re.match('%s *=' % option, line)
+
 # ==============================================================
 # do_ini
 
@@ -141,9 +157,7 @@ def do_ini(module, filename, section=None, option=None, value=None, state='prese
             if within_section and option:
                 if state == 'present':
                     # change the existing option line
-                    if re.match('%s *=' % option, line) \
-                            or re.match('# *%s *=' % option, line) \
-                            or re.match('; *%s *=' % option, line):
+                    if match_opt(option, line):
                         newline = '%s = %s\n' % (option, value)
                         changed = ini_lines[index] != newline
                         ini_lines[index] = newline
@@ -154,14 +168,14 @@ def do_ini(module, filename, section=None, option=None, value=None, state='prese
                                 line = ini_lines[index]
                                 if line.startswith('['):
                                     break
-                                if re.match('%s *=' % option, line):
+                                if match_active_opt(option, line):
                                     del ini_lines[index]
                                 else:
                                     index = index + 1
                         break
                 else:
                     # comment out the existing option line
-                    if re.match('%s *=' % option, line):
+                    if match_active_opt(option, line):
                         ini_lines[index] = '#%s' % ini_lines[index]
                         changed = True
                         break