summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Baratz <adambaratz@php.net>2016-09-12 17:32:50 -0400
committerAdam Baratz <adambaratz@php.net>2016-09-12 17:32:50 -0400
commit2302eef5c93b722d5311549dd59d495ff11d3b0d (patch)
treebebded4b095891ed2ec08fb267ca75376fbd7645
parent82fa85fd08a83404e36ab90a500b89ba127cb62c (diff)
downloadphp-git-2302eef5c93b722d5311549dd59d495ff11d3b0d.tar.gz
Never quote values as raw binary data
This reverts a1a18fca6e2a1690ea113dc2ebe0e7d22fdc71a0 which was intended to fix bug #52885. That commit introduced a BC break which wasn't universally desirable. The issue of quoting binary data (or NVARCHAR strings, or other nonstandard types) will have to be addressed separately.
-rw-r--r--ext/pdo_dblib/dblib_driver.c50
-rw-r--r--ext/pdo_dblib/tests/pdo_dblib_quote.phpt2
2 files changed, 14 insertions, 38 deletions
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c
index 23f59a6d9e..64a3646b32 100644
--- a/ext/pdo_dblib/dblib_driver.c
+++ b/ext/pdo_dblib/dblib_driver.c
@@ -146,55 +146,29 @@ static zend_long dblib_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l
static int dblib_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, size_t unquotedlen, char **quoted, size_t *quotedlen, enum pdo_param_type paramtype)
{
- int useBinaryEncoding = 0;
- const char * hex = "0123456789abcdef";
size_t i;
char * q;
*quotedlen = 0;
- /*
- * Detect quoted length and if we should use binary encoding
- */
+ /* Detect quoted length, adding extra char for doubled single quotes */
for(i=0;i<unquotedlen;i++) {
- if( 32 > unquoted[i] || 127 < unquoted[i] ) {
- useBinaryEncoding = 1;
- break;
- }
if(unquoted[i] == '\'') ++*quotedlen;
++*quotedlen;
}
- if(useBinaryEncoding) {
- /*
- * Binary safe quoting
- * Will implicitly convert for all data types except Text, DateTime & SmallDateTime
- *
- */
- *quotedlen = (unquotedlen * 2) + 2; /* 2 chars per byte +2 for "0x" prefix */
- q = *quoted = emalloc(*quotedlen+1); /* Add byte for terminal null */
-
- *q++ = '0';
- *q++ = 'x';
- for (i=0;i<unquotedlen;i++) {
- *q++ = hex[ (*unquoted>>4)&0xF];
- *q++ = hex[ (*unquoted++)&0xF];
- }
- } else {
- /* Alpha/Numeric Quoting */
- *quotedlen += 2; /* +2 for opening, closing quotes */
- q = *quoted = emalloc(*quotedlen+1); /* Add byte for terminal null */
- *q++ = '\'';
-
- for (i=0;i<unquotedlen;i++) {
- if (unquoted[i] == '\'') {
- *q++ = '\'';
- *q++ = '\'';
- } else {
- *q++ = unquoted[i];
- }
+ *quotedlen += 2; /* +2 for opening, closing quotes */
+ q = *quoted = emalloc(*quotedlen+1); /* Add byte for terminal null */
+ *q++ = '\'';
+
+ for (i=0;i<unquotedlen;i++) {
+ if (unquoted[i] == '\'') {
+ *q++ = '\'';
+ *q++ = '\'';
+ } else {
+ *q++ = unquoted[i];
}
- *q++ = '\'';
}
+ *q++ = '\'';
*q = 0;
diff --git a/ext/pdo_dblib/tests/pdo_dblib_quote.phpt b/ext/pdo_dblib/tests/pdo_dblib_quote.phpt
index 24a36dec0b..543093d6ce 100644
--- a/ext/pdo_dblib/tests/pdo_dblib_quote.phpt
+++ b/ext/pdo_dblib/tests/pdo_dblib_quote.phpt
@@ -14,6 +14,7 @@ var_dump($db->quote(42, PDO::PARAM_INT));
var_dump($db->quote(null, PDO::PARAM_NULL));
var_dump($db->quote('\'', PDO::PARAM_STR));
var_dump($db->quote('foo', PDO::PARAM_STR));
+var_dump($db->quote('über', PDO::PARAM_STR));
?>
--EXPECT--
string(3) "'1'"
@@ -22,3 +23,4 @@ string(4) "'42'"
string(2) "''"
string(4) "''''"
string(5) "'foo'"
+string(7) "'über'"