diff --git a/phpseclib/Net/SFTP.php b/phpseclib/Net/SFTP.php index 86e8f3d8c..a118d45e3 100644 --- a/phpseclib/Net/SFTP.php +++ b/phpseclib/Net/SFTP.php @@ -1831,9 +1831,6 @@ function mkdir($dir, $mode = -1, $recursive = false) } $dir = $this->_realpath($dir); - // by not providing any permissions, hopefully the server will use the logged in users umask - their - // default permissions. - $attr = $mode == -1 ? "\0\0\0\0" : pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); if ($recursive) { $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir)); @@ -1844,12 +1841,12 @@ function mkdir($dir, $mode = -1, $recursive = false) for ($i = 0; $i < count($dirs); $i++) { $temp = array_slice($dirs, 0, $i + 1); $temp = implode('/', $temp); - $result = $this->_mkdir_helper($temp, $attr); + $result = $this->_mkdir_helper($temp, $mode); } return $result; } - return $this->_mkdir_helper($dir, $attr); + return $this->_mkdir_helper($dir, $mode); } /** @@ -1859,9 +1856,10 @@ function mkdir($dir, $mode = -1, $recursive = false) * @return bool * @access private */ - function _mkdir_helper($dir, $attr) + function _mkdir_helper($dir, $mode) { - if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, $attr))) { + // send SSH_FXP_MKDIR without any attributes (that's what the \0\0\0\0 is doing) + if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, "\0\0\0\0"))) { return false; } @@ -1880,6 +1878,10 @@ function _mkdir_helper($dir, $attr) return false; } + if ($mode !== -1) { + $this->chmod($mode, $dir); + } + return true; }