diff --git a/modules/simpletest/tests/upgrade/drupal-6.duplicate-permission.database.php b/modules/simpletest/tests/upgrade/drupal-6.duplicate-permission.database.php
new file mode 100644
index 0000000..5da5e84
--- /dev/null
+++ b/modules/simpletest/tests/upgrade/drupal-6.duplicate-permission.database.php
@@ -0,0 +1,8 @@
+<?php
+
+// Simulate duplicated permission condition.
+db_update('permission')->fields(array(
+  'perm' => 'access content, access content',
+))
+->condition('pid', 1)
+->execute();
diff --git a/modules/simpletest/tests/upgrade/upgrade.user.test b/modules/simpletest/tests/upgrade/upgrade.user.test
index c33ba11..d33234e 100644
--- a/modules/simpletest/tests/upgrade/upgrade.user.test
+++ b/modules/simpletest/tests/upgrade/upgrade.user.test
@@ -61,3 +61,32 @@ class UserUpgradePathNoPasswordTokenTestCase extends UpgradePathTestCase {
     $this->assertEqual(variable_get('user_mail_register_no_approval_required_body'), '[user:name], [site:name], [site:url], [site:url-brief], [user:mail], [date:medium], [site:login-url], [user:edit-url], [user:one-time-login-url].', 'Existing email templates have been modified (password token not involved).');
   }
 }
+
+/**
+ * Upgrade test for user.module (duplicated permission).
+ */
+class UserUpgradePathDuplicatedPermissionTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'User upgrade path (duplicated permission)',
+      'description'  => 'User upgrade path tests (duplicated permission).',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.bare.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.duplicate-permission.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testUserUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+  }
+}
diff --git a/modules/system/system.install b/modules/system/system.install
index fab4b96..8718d1c 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -1884,7 +1884,7 @@ function system_update_7007() {
   $result = db_query("SELECT rid, perm FROM {permission} ORDER BY rid ASC");
   $query = db_insert('role_permission')->fields(array('rid', 'permission'));
   foreach ($result as $role) {
-    foreach (explode(', ', $role->perm) as $perm) {
+    foreach (array_unique(explode(', ', $role->perm)) as $perm) {
       $query->values(array(
         'rid' => $role->rid,
         'permission' => $perm,
