handle invalid handles in Share->get

This commit is contained in:
Robin Appelman 2016-01-19 18:28:42 +01:00
commit 1fb6581c8d
4 changed files with 45 additions and 1 deletions

View file

@ -0,0 +1,11 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Licensed under the MIT license:
* http://opensource.org/licenses/MIT
*/
namespace Icewind\SMB\Exception;
class InvalidResourceException extends Exception {
}

View file

@ -7,6 +7,8 @@
namespace Icewind\SMB;
use Icewind\SMB\Exception\InvalidResourceException;
class NativeShare extends AbstractShare {
/**
* @var Server $server
@ -193,11 +195,20 @@ class NativeShare extends AbstractShare {
*
* @throws \Icewind\SMB\Exception\NotFoundException
* @throws \Icewind\SMB\Exception\InvalidTypeException
* @throws \Icewind\SMB\Exception\InvalidResourceException
*/
public function get($source, $target) {
$targetHandle = fopen($target, 'wb');
if (!$targetHandle) {
throw new InvalidResourceException('Failed opening local file "' . $target . '" for writing');
}
$this->connect();
$sourceHandle = $this->state->open($this->buildUrl($source), 'r');
$targetHandle = fopen($target, 'wb');
if (!$sourceHandle) {
fclose($targetHandle);
throw new InvalidResourceException('Failed opening remote file "' . $source . '" for reading');
}
while ($data = $this->state->read($sourceHandle, 4096)) {
fwrite($targetHandle, $data);

View file

@ -11,6 +11,7 @@ use Icewind\SMB\Exception\AccessDeniedException;
use Icewind\SMB\Exception\AlreadyExistsException;
use Icewind\SMB\Exception\Exception;
use Icewind\SMB\Exception\FileInUseException;
use Icewind\SMB\Exception\InvalidResourceException;
use Icewind\SMB\Exception\InvalidTypeException;
use Icewind\SMB\Exception\NotEmptyException;
use Icewind\SMB\Exception\NotFoundException;
@ -42,6 +43,13 @@ class Parser {
$error = $part;
}
}
$notFoundMsg = 'Error opening local file ';
if (substr($output[0], 0, strlen($notFoundMsg)) === $notFoundMsg) {
$localPath = substr($output[0], strlen($notFoundMsg));
throw new InvalidResourceException('Failed opening local file "' . $localPath . '" for writing');
}
switch ($error) {
case ErrorCodes::PathNotFound:
case ErrorCodes::ObjectNotFound: