Page MenuHomePhabricator

D20780.diff
No OneTemporary

D20780.diff

diff --git a/src/infrastructure/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php b/src/infrastructure/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php
--- a/src/infrastructure/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php
+++ b/src/infrastructure/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php
@@ -10,6 +10,9 @@
private $nextError;
+ const CALLERROR_QUERY = 777777;
+ const CALLERROR_CONNECT = 777778;
+
abstract protected function connect();
abstract protected function rawQuery($raw_query);
abstract protected function rawQueries(array $raw_queries);
diff --git a/src/infrastructure/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php b/src/infrastructure/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php
--- a/src/infrastructure/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php
+++ b/src/infrastructure/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php
@@ -68,19 +68,47 @@
$host = 'p:'.$host;
}
- @$conn->real_connect(
+ $trap = new PhutilErrorTrap();
+
+ $ok = @$conn->real_connect(
$host,
$user,
$pass,
$database,
$port);
+ $call_error = $trap->getErrorsAsString();
+ $trap->destroy();
+
$errno = $conn->connect_errno;
if ($errno) {
$error = $conn->connect_error;
$this->throwConnectionException($errno, $error, $user, $host);
}
+ // See T13403. If the parameters to "real_connect()" are wrong, it may
+ // fail without setting an error code. In this case, raise a generic
+ // exception. (One way to reproduce this is to pass a string to the
+ // "port" parameter.)
+
+ if (!$ok) {
+ if (strlen($call_error)) {
+ $message = pht(
+ 'mysqli->real_connect() failed: %s',
+ $call_error);
+ } else {
+ $message = pht(
+ 'mysqli->real_connect() failed, but did not set an error code '.
+ 'or emit a message.');
+ }
+
+ $this->throwConnectionException(
+ self::CALLERROR_CONNECT,
+ $message,
+ $user,
+ $host);
+ }
+
// See T13238. Attempt to prevent "LOAD DATA LOCAL INFILE", which allows a
// malicious server to ask the client for any file. At time of writing,
// this option MUST be set after "real_connect()" on all PHP versions.
@@ -152,7 +180,7 @@
'Call to "mysqli->query()" failed, but did not set an error '.
'code or emit an error message.');
}
- $this->throwQueryCodeException(777777, $message);
+ $this->throwQueryCodeException(self::CALLERROR_QUERY, $message);
}
}

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 1, 12:31 AM (2 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7228540
Default Alt Text
D20780.diff (2 KB)

Event Timeline