diff options
| author | Adam Baratz <adambaratz@php.net> | 2016-09-12 17:32:50 -0400 |
|---|---|---|
| committer | Adam Baratz <adambaratz@php.net> | 2016-09-12 17:32:50 -0400 |
| commit | 2302eef5c93b722d5311549dd59d495ff11d3b0d (patch) | |
| tree | bebded4b095891ed2ec08fb267ca75376fbd7645 | |
| parent | 82fa85fd08a83404e36ab90a500b89ba127cb62c (diff) | |
| download | php-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.c | 50 | ||||
| -rw-r--r-- | ext/pdo_dblib/tests/pdo_dblib_quote.phpt | 2 |
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'" |
