2

The below is part of the OpenX server code (Smarty Plugin). When the fopen is called, the file is created successfully. But the fwrite doesn't write any data in the file and returns 0 (not FALSE).

The folder itself has the following permission: drwxrwxrwx nobody nobody

The file is created with the following permissions: -rw-r--r-- nobody nobody

Here's the code.

function smarty_core_write_file($params, &$smarty)
{
    $_dirname = dirname($params['filename']);

    if ($params['create_dirs']) {
        $_params = array('dir' => $_dirname);
        require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
        smarty_core_create_dir_structure($_params, $smarty);
    }

    // write to tmp file, then rename it to avoid file locking race condition
    $_tmp_file = tempnam($_dirname, 'wrt');

    if (!($fd = fopen($_tmp_file, 'wb'))) {
        $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
        if (!($fd = fopen($_tmp_file, 'wb'))) {
            $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
            return false;
        }
    }

    fwrite($fd, $params['contents']);
    fclose($fd);

    if (DIRECTORY_SEPARATOR == '\\' || !rename($_tmp_file, $params['filename'])) {
        // On platforms and filesystems that cannot overwrite with rename() 
        // delete the file before renaming it -- because windows always suffers
        // this, it is short-circuited to avoid the initial rename() attempt
        unlink($params['filename']);
        rename($_tmp_file, $params['filename']);
    }
    chmod($params['filename'], $smarty->_file_perms);

    return true;
}

Below is the code I use to test this function:

$params = array('filename'=>'/usr/apache/www/templates_compiled/%%72^729^729250E1%%main.html.php', 'contents'=>'testString', 'create_dirs'=>TRUE);
smarty_core_write_file($params, NULL);
Eyad Salah
  • 1,084
  • 1
  • 11
  • 22
  • 1) what did you expect? there's no error handling in your code. 2) have you verified that `$params['contents']` is not empty? 3) for debugging, remove those pesky `@`. – Karoly Horvath Apr 21 '14 at 13:44
  • Yes, this is only a function that writes verified text. The $params['content'] has data in it, this is actually a caching plugin code – Eyad Salah Apr 21 '14 at 13:47
  • I checked the fopen result and there is a stream, so it's not failing there. and the $params['contents'] is not empty. I tried removing those @ but it doeesn't change anything. There are no errors – Eyad Salah Apr 21 '14 at 13:50
  • I'm pretty sure that some of these are only *assumptions*. Always verifiy your assumptions. e.g.: what do you mean "has data in it"? `fwrite` expects a string. – Karoly Horvath Apr 21 '14 at 13:50
  • Yes, I'm trying sample data. So it's all controlled. But it's still returning 0 – Eyad Salah Apr 21 '14 at 14:04
  • in that case (well, in any case...) provide the test code. – Karoly Horvath Apr 21 '14 at 14:09
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/51107/discussion-between-computerjy-and-karoly-horvath) – Eyad Salah Apr 21 '14 at 14:22

1 Answers1

2

The problem was that the server was full. So after freeing some space, the code worked fine.

Eyad Salah
  • 1,084
  • 1
  • 11
  • 22