]> granicus.if.org Git - php/commitdiff
Fixed bug #62889
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Dec 2020 10:20:33 +0000 (11:20 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Dec 2020 10:25:36 +0000 (11:25 +0100)
Our minimum libmysqlclient version requirement is high enough
that we don't need to check for MYSQL_OPT_LOCAL_INFILE support.

However, the mysql_get_option() function seems to only be available
since 5.7 (though it's really hard to find any definitie information
on when MySQL introduced certain functions or changes...) so we
need to store the value of the flag locally to make it available
through getAttribute().

NEWS
ext/pdo_mysql/mysql_driver.c
ext/pdo_mysql/php_pdo_mysql_int.h

diff --git a/NEWS b/NEWS
index f8d543934fb5f4755509cfd4d3ecbe6d510e8eea..ebd59377ddec220d7135fb7984eb3291a104846d 100644 (file)
--- 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)
index 90bc7792d5fed86a8434ac3e4cd0d3c98caafb72..0a0526d95465b1b5a9f28e510a078105fa0eccdb 100644 (file)
@@ -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)) {
index 7ebf875085c4d4942363c4c6c13365e4d6dfe5e0..fe7f149d84f9c702a419073967db688e62b99da9 100644 (file)
@@ -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