1--TEST-- 2Persistent connections and mysql.max_persistent 3--SKIPIF-- 4<?php 5 require_once('skipif.inc'); 6 require_once('skipifconnectfailure.inc'); 7 require_once('table.inc'); 8 9 if ($socket) 10 $host = sprintf("%s:%s", $host, $socket); 11 else if ($port) 12 $host = sprintf("%s:%s", $host, $port); 13 14 // we need a second DB user to test for a possible flaw in the ext/mysql[i] code 15 if (!$link = mysql_connect($host, $user, $passwd, true)) 16 die(sprintf("skip Cannot connect [%d] %s", mysql_errno(), mysql_error())); 17 18 if (!mysql_select_db($db, $link)) 19 die(sprintf("skip [%d] %s", mysql_errno($link), mysql_error($link))); 20 21 if (!$res = mysql_query('SHOW VARIABLES LIKE "old_passwords"', $link)) { 22 die(sprintf("skip [%d] %s", mysql_errno($link), mysql_error($link))); 23 } 24 25 if (mysql_num_rows($res) != 1) { 26 die(sprintf("skip Can't check if old_passwords = ON")); 27 } 28 29 $row = mysql_fetch_assoc($res); 30 mysql_free_result($res); 31 if ($row['Value'] == "ON") 32 die(sprintf("skip Test will fail because old_passwords = ON. Hint: old passwords are insecure!")); 33 34 if (!$res = mysql_query("SELECT CURRENT_USER() AS _user", $link)) 35 die(sprintf("skip [%d] %s", mysql_errno($link), mysql_error($link))); 36 37 $row = mysql_fetch_assoc($res); 38 mysql_free_result($res); 39 $host = substr($row['_user'], strrpos($row['_user'], "@") + 1, strlen($row['_user'])); 40 41 mysql_query('DROP USER pcontest', $link); 42 mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); 43 if (!mysql_query(sprintf('CREATE USER pcontest@"%s" IDENTIFIED BY "pcontest"', mysql_real_escape_string($host, $link)), $link)) { 44 printf("skip Cannot create second DB user [%d] %s", mysql_errno($link), mysql_error($link)); 45 mysql_close($link); 46 die(); 47 } 48 49 // we might be able to specify the host using CURRENT_USER(), but... 50 if (!mysql_query(sprintf('GRANT SELECT ON TABLE %s.test TO pcontest@"%s"', $db, mysql_real_escape_string($host, $link)), $link)) { 51 printf("skip Cannot GRANT SELECT to second DB user [%d] %s", mysql_errno($link), mysql_error($link)); 52 mysql_query(sprintf('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); 53 mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); 54 mysql_close($link); 55 die(); 56 } 57 58 mysql_close($link); 59?> 60--INI-- 61mysql.max_links=3 62mysql.max_persistent=2 63mysql.allow_persistent=1 64--FILE-- 65<?php 66 require_once("connect.inc"); 67 require_once('table.inc'); 68 69 if ($socket) 70 $host = sprintf("%s:%s", $host, $socket); 71 else if ($port) 72 $host = sprintf("%s:%s", $host, $port); 73 74 if (!$plink = mysql_pconnect($host, $user, $passwd)) 75 printf("[001] Cannot connect using the second DB user created during SKIPIF, [%d] %s\n", 76 mysql_errno(), mysql_error()); 77 78 if (!mysql_select_db($db, $plink)) 79 printf("[002] [%d] %s\n", mysql_errno($plink), mysql_error($plink)); 80 81 ob_start(); 82 phpinfo(); 83 $phpinfo = strip_tags(ob_get_contents()); 84 ob_end_clean(); 85 $phpinfo = substr($phpinfo, strpos($phpinfo, 'MySQL Support => enabled'), 500); 86 if (!preg_match('@Active Persistent Links\s+=>\s+(\d+)@ismU', $phpinfo, $matches)) 87 printf("[003] Cannot get # active persistent links from phpinfo()"); 88 $num_plinks = $matches[1]; 89 90 if (!$res = mysql_query('SELECT id, label FROM test WHERE id = 1', $plink)) 91 printf("[004] Cannot run query on persistent connection of second DB user, [%d] %s\n", 92 mysql_errno($plink), mysql_error($plink)); 93 94 if (!$row = mysql_fetch_assoc($res)) 95 printf("[005] Cannot run fetch result, [%d] %s\n", 96 mysql_errno($plink), mysql_error($plink)); 97 mysql_free_result($res); 98 var_dump($row); 99 100 // change the password for the second DB user and kill the persistent connection 101 if (!$res = mysql_query("SELECT CURRENT_USER() AS _user", $link)) 102 printf("[006] [%d] %s", mysql_errno($link), mysql_error($link)); 103 104 $row = mysql_fetch_assoc($res); 105 mysql_free_result($res); 106 $host = substr($row['_user'], strrpos($row['_user'], "@") + 1, strlen($row['_user'])); 107 108 $sql = sprintf('SET PASSWORD FOR pcontest@"%s" = PASSWORD("newpass")', mysql_real_escape_string($host, $link)); 109 if (!mysql_query($sql, $link)) 110 printf("[007] Cannot change PW of second DB user, [%d] %s\n", mysql_errno($link), mysql_error($link)); 111 112 // persistent connections cannot be closed but only be killed 113 $pthread_id = mysql_thread_id($plink); 114 if (!mysql_query(sprintf('KILL %d', $pthread_id), $link)) 115 printf("[008] Cannot KILL persistent connection of second DB user, [%d] %s\n", mysql_errno($link), mysql_error($link)); 116 // give the server a second to really kill the thread 117 sleep(1); 118 119 if (!$res = mysql_query("SHOW FULL PROCESSLIST", $link)) 120 printf("[009] [%d] %s\n", mysql_errno($link), mysql_error($link)); 121 122 $running_threads = array(); 123 while ($row = mysql_fetch_assoc($res)) 124 $running_threads[$row['Id']] = $row; 125 mysql_free_result($res); 126 127 if (isset($running_threads[$pthread_id])) 128 printf("[010] Persistent connection has not been killed\n"); 129 130 // we might get the old handle 131 if ($plink = @mysql_pconnect($host, 'pcontest', 'pcontest')) 132 printf("[011] Can connect using the old password, [%d] %s\n", 133 mysql_errno(), mysql_error()); 134 135 ob_start(); 136 phpinfo(); 137 $phpinfo = strip_tags(ob_get_contents()); 138 ob_end_clean(); 139 $phpinfo = substr($phpinfo, strpos($phpinfo, 'MySQL Support => enabled'), 500); 140 if (!preg_match('@Active Persistent Links\s+=>\s+(\d+)@ismU', $phpinfo, $matches)) 141 printf("[012] Cannot get # active persistent links from phpinfo()\n"); 142 143 $num_plinks_kill = $matches[1]; 144 if ($num_plinks_kill > $num_plinks) 145 printf("[013] Statistics seems to be wrong, got %d active persistent links, expecting < %d links\n", 146 $num_plinks_kill, $num_plinks); 147 148 // The first connection has been closed, the last pconnect() was unable to connect -> no connection open 149 // We must be able to connect because max_persistent limit has not been reached 150 if (!$plink = mysql_pconnect($host, 'pcontest', 'newpass')) 151 die(sprintf("[014] Cannot connect using the second DB, [%d] %s\n", 152 mysql_errno(), mysql_error())); 153 154 if (!mysql_select_db($db, $plink)) 155 printf("[015] [%d] %s\n", mysql_errno($plink), mysql_error($plink)); 156 157 if (!$res = mysql_query('SELECT id, label FROM test WHERE id = 1', $plink)) 158 printf("[016] Cannot run query on persistent connection of second DB user, [%d] %s\n", 159 mysql_errno($plink), mysql_error($plink)); 160 161 if (!$row = mysql_fetch_assoc($res)) 162 printf("[017] Cannot run fetch result, [%d] %s\n", 163 mysql_errno($plink), mysql_error($plink)); 164 mysql_free_result($res); 165 var_dump($row); 166 167 mysql_query(sprintf('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); 168 mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); 169 mysql_close($link); 170 print "done!"; 171?> 172--CLEAN-- 173<?php 174// connect + select_db 175require_once("connect.inc"); 176if (!$link = my_mysql_connect($host, $user, $passwd, $db, $port, $socket)) { 177 printf("[c001] Cannot connect to the server using host=%s/%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n", 178 $host, $myhost, $user, $db, $port, $socket); 179} 180 181if (!$res = mysql_query("SELECT CURRENT_USER() AS _user", $link)) 182 printf("[c002] [%d] %s", mysql_errno($link), mysql_error($link)); 183 184$row = mysql_fetch_assoc($res); 185mysql_free_result($res); 186$host = substr($row['_user'], strrpos($row['_user'], "@") + 1, strlen($row['_user'])); 187 188@mysql_query(sprintf('REVOKE ALL PRIVILEGES, GRANT OPTION FROM pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); 189@mysql_query(sprintf('DROP USER pcontest@"%s"', mysql_real_escape_string($host, $link)), $link); 190 191mysql_close($link); 192?> 193--EXPECTF-- 194array(2) { 195 [%u|b%"id"]=> 196 %unicode|string%(1) "1" 197 [%u|b%"label"]=> 198 %unicode|string%(1) "a" 199} 200array(2) { 201 [%u|b%"id"]=> 202 %unicode|string%(1) "1" 203 [%u|b%"label"]=> 204 %unicode|string%(1) "a" 205} 206done! 207