summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--ext/pdo_mysql/mysql_driver.c43
-rw-r--r--ext/pdo_mysql/php_pdo_mysql_int.h1
3 files changed, 20 insertions, 25 deletions
diff --git a/NEWS b/NEWS
index f8d543934f..ebd59377dd 100644
--- a/NEWS
+++ b/NEWS
@@ -56,6 +56,7 @@ PHP NEWS
missing). (Nikita)
. Fixed bug #72368 (PdoStatement->execute() fails but does not throw an
exception). (Nikita)
+ . Fixed bug #62889 (LOAD DATA INFILE broken). (Nikita)
- Phar:
. Fixed bug #73809 (Phar Zip parse crash - mmap fail). (cmb)
diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c
index 90bc7792d5..0a0526d954 100644
--- a/ext/pdo_mysql/mysql_driver.c
+++ b/ext/pdo_mysql/mysql_driver.c
@@ -508,13 +508,11 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_
case PDO_MYSQL_ATTR_MAX_BUFFER_SIZE:
ZVAL_LONG(return_value, H->max_buffer_size);
break;
-#else
+#endif
+
case PDO_MYSQL_ATTR_LOCAL_INFILE:
- ZVAL_BOOL(
- return_value,
- (H->server->data->options->flags & CLIENT_LOCAL_FILES) == CLIENT_LOCAL_FILES);
+ ZVAL_BOOL(return_value, H->local_infile);
break;
-#endif
default:
PDO_DBG_RETURN(0);
@@ -709,18 +707,15 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
goto cleanup;
}
-#if defined(MYSQL_OPT_LOCAL_INFILE) || defined(PDO_USE_MYSQLND)
- unsigned int local_infile = (unsigned int) pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE, 0);
-# ifndef PDO_USE_MYSQLND
- if (PG(open_basedir) && PG(open_basedir)[0] != '\0') {
- local_infile = 0;
- }
-# endif
- if (mysql_options(H->server, MYSQL_OPT_LOCAL_INFILE, (const char *)&local_infile)) {
- pdo_mysql_error(dbh);
- goto cleanup;
- }
+ if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE, 0)) {
+ H->local_infile = 1;
+#ifndef PDO_USE_MYSQLND
+ if (PG(open_basedir) && PG(open_basedir)[0] != '\0') {
+ H->local_infile = 0;
+ }
#endif
+ }
+
#ifdef MYSQL_OPT_RECONNECT
/* since 5.0.3, the default for this option is 0 if not specified.
* we want the old behaviour
@@ -824,15 +819,13 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
}
}
#endif
- } else {
-#if defined(MYSQL_OPT_LOCAL_INFILE) || defined(PDO_USE_MYSQLND)
- // in case there are no driver options disable 'local infile' explicitly
- unsigned int local_infile = 0;
- if (mysql_options(H->server, MYSQL_OPT_LOCAL_INFILE, (const char *)&local_infile)) {
- pdo_mysql_error(dbh);
- goto cleanup;
- }
-#endif
+ }
+
+ /* Always explicitly set the LOCAL_INFILE option. */
+ unsigned int local_infile = H->local_infile;
+ if (mysql_options(H->server, MYSQL_OPT_LOCAL_INFILE, (const char *)&local_infile)) {
+ pdo_mysql_error(dbh);
+ goto cleanup;
}
if (vars[0].optval && mysql_options(H->server, MYSQL_SET_CHARSET_NAME, vars[0].optval)) {
diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h
index 7ebf875085..fe7f149d84 100644
--- a/ext/pdo_mysql/php_pdo_mysql_int.h
+++ b/ext/pdo_mysql/php_pdo_mysql_int.h
@@ -104,6 +104,7 @@ typedef struct {
unsigned buffered:1;
unsigned emulate_prepare:1;
unsigned fetch_table_names:1;
+ unsigned local_infile:1;
#ifndef PDO_USE_MYSQLND
zend_ulong max_buffer_size;
#endif