#328110: remove recoverable fatal error.

From: Damien Tournoud <damien@tournoud.net>


---

 includes/menu.inc        |    6 ++++--
 modules/menu/menu.module |    8 +++++---
 modules/menu/menu.test   |    2 +-
 3 files changed, 10 insertions(+), 6 deletions(-)


diff --git includes/menu.inc includes/menu.inc
index 551a981..a042a4d 100644
--- includes/menu.inc
+++ includes/menu.inc
@@ -1912,6 +1912,9 @@ function menu_link_save(&$item) {
   $existing_item = FALSE;
   if (isset($item['mlid'])) {
     $existing_item = db_fetch_array(db_query("SELECT * FROM {menu_links} WHERE mlid = %d", $item['mlid']));
+    if (!empty($existing_item)) {
+      $existing_item['options'] = unserialize($existing_item['options']);
+    }
   }
 
   if (isset($item['plid'])) {
@@ -2016,7 +2019,6 @@ function menu_link_save(&$item) {
       $item['router_path'] = _menu_find_router_path($menu, $item['link_path']);
     }
   }
-  $item['options'] = serialize($item['options']);
   // If every value in $existing_item is the same in the $item, there is no
   // reason to run the update queries or clear the caches. We use
   // array_diff_assoc() with the $existing_item as the first parameter
@@ -2032,7 +2034,7 @@ function menu_link_save(&$item) {
       $item['router_path'], $item['hidden'], $item['external'], $item['has_children'],
       $item['expanded'], $item['weight'],  $item['depth'],
       $item['p1'], $item['p2'], $item['p3'], $item['p4'], $item['p5'], $item['p6'], $item['p7'], $item['p8'], $item['p9'],
-      $item['module'],  $item['link_title'], $item['options'], $item['customized'], $item['mlid']);
+      $item['module'],  $item['link_title'], serialize($item['options']), $item['customized'], $item['mlid']);
     // Check the has_children status of the parent.
     _menu_update_parental_status($item);
     menu_cache_clear($menu_name);
diff --git modules/menu/menu.module modules/menu/menu.module
index b3566c2..77801d2 100644
--- modules/menu/menu.module
+++ modules/menu/menu.module
@@ -154,11 +154,13 @@ function menu_theme() {
  */
 function menu_enable() {
   menu_rebuild();
-  $link = db_fetch_array(db_query("SELECT mlid AS plid, menu_name from {menu_links} WHERE link_path = 'admin/build/menu' AND module = 'system'"));
-  $link['router_path'] = 'admin/build/menu-customize/%';
-  $link['module'] = 'menu';
+  $base_link = db_fetch_array(db_query("SELECT mlid AS plid, menu_name from {menu_links} WHERE link_path = 'admin/build/menu' AND module = 'system'"));
+  $base_link['router_path'] = 'admin/build/menu-customize/%';
+  $base_link['module'] = 'menu';
   $result = db_query("SELECT * FROM {menu_custom}");
   while ($menu = db_fetch_array($result)) {
+    // $link is passed by reference to menu_link_save(), so we make a copy of $base_link.
+    $link = $base_link;
     $link['mlid'] = 0;
     $link['link_title'] = $menu['title'];
     $link['link_path'] = 'admin/build/menu-customize/' . $menu['menu_name'];
diff --git modules/menu/menu.test modules/menu/menu.test
index a37403f..76849b8 100644
--- modules/menu/menu.test
+++ modules/menu/menu.test
@@ -24,7 +24,7 @@ class MenuTestCase extends DrupalWebTestCase {
   function setUp() {
     parent::setUp('menu');
     // Create users.
-    $this->big_user = $this->drupalCreateUser(array('administer blocks', 'administer menu', 'create article content'));
+    $this->big_user = $this->drupalCreateUser(array('access administration pages', 'administer blocks', 'administer menu', 'create article content'));
     $this->std_user = $this->drupalCreateUser(array());
   }
 
