<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Журнал системного программиста &#187; vsftpd</title>
	<atom:link href="http://sadko.xskernel.org/archives/tag/vsftpd/feed" rel="self" type="application/rss+xml" />
	<link>http://sadko.xskernel.org</link>
	<description>блог обо всём и ни о чём</description>
	<lastBuildDate>Wed, 14 Dec 2011 20:21:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>VSFTPD &#8212; такой ли секьюрный?</title>
		<link>http://sadko.xskernel.org/archives/1704</link>
		<comments>http://sadko.xskernel.org/archives/1704#comments</comments>
		<pubDate>Tue, 26 Jan 2010 12:35:40 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[proftpd]]></category>
		<category><![CDATA[suse]]></category>
		<category><![CDATA[vsftpd]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1704</guid>
		<description><![CDATA[Tweet Сегодня разочаровался в моём любимом Very Secure FTP Daemon. Произошло это, когда мне нужно было реализовать что-то вроде RandomAccessFile, работающего по FTP. И когда я дошёл до seek-операций, обнаружил, что vsftpd некорректно отрабатывает пару команд REST + STOR. А именно, открывает файл всегда в режиме O_APPEND, о чём с горестью сообщает manpage: O_APPEND The [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1704',
  title: 'VSFTPD - такой ли секьюрный?',
  description: 'Сегодня разочаровался в моём любимом Very Secure FTP Daemon.\nПроизошло это, когда мне нужно было реализовать что-то вроде RandomAccessFile, работающего по FTP. И когда я дошёл до seek-операций, обнаружил, что vsftpd не...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1704"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="VSFTPD &amp;#8212; &Ntilde;&ETH;&deg;&ETH;&ordm;&ETH;&frac34;&ETH;&sup1; &ETH;&raquo;&ETH;&cedil; &Ntilde;&ETH;&micro;&ETH;&ordm;&Ntilde;&Ntilde;&Ntilde;&ETH;&frac12;&Ntilde;&ETH;&sup1;?" data-url="http://sadko.xskernel.org/archives/1704">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Сегодня разочаровался в моём любимом <a href="http://vsftpd.beasts.org/"><b>Very Secure FTP Daemon</b></a>.<br />
Произошло это, когда мне нужно было реализовать что-то вроде RandomAccessFile, работающего по FTP. И когда я дошёл до seek-операций, обнаружил, что <b>vsftpd</b> некорректно отрабатывает пару команд REST + STOR. А именно, открывает файл всегда в режиме <b>O_APPEND</b>, о чём с горестью сообщает manpage:<br />
<span id="more-1704"></span></p>
<blockquote><p>
       O_APPEND<br />
              The  file is opened in append mode. Before each write(), the file offset is positioned at the end of the file, as if with<br />
              lseek().  O_APPEND may lead to corrupted files on NFS file systems if more than one process appends data  to  a  file  at<br />
              once.   This is because NFS does not support appending to a file, so the client kernel has to simulate it, which can&#8217;t be<br />
              done without a race condition.
</p></blockquote>
<p>Таким образом, получаем следующую ситуацию:</p>
<ul>
<li>Я создаю на удалённом сервере некий файл при помощи STOR.</li>
<li>Записываю в файл строку &#171;01234567890123456789&#8243;.</li>
<li>Закрываю файл (прекращаю передачу данных).</li>
<li>Делаю REST 3.</li>
<li>Снова открываю файл через STOR.</li>
<li>Записываю в файл строку &#171;xxx&#187;.</li>
<li>Закрываю файл.</li>
</ul>
<p>В результате таких нехитрых манипуляций, по идее, я должен получить файл с содержимым &#171;012xxx67890123456789&#8243;, вместо чего получаю файл с содержимым &#171;01234567890123456789xxx&#187;, то есть, &#171;xxx&#187; ушли в конец.<br />
При этом, <a href="http://proftpd.org/"><b>ProFTPD</b></a> замечательно разруливает эту ситуацию так, как надо.<br />
Что ж, думаю, может в новой версии <b>VSFTPD</b> это пофиксено. Качаю исходники, собираю, ставлю, но ситуация повторяется. Пришлось поковыряться в коде и выяснить, что там действительно делается <b>O_APPEND</b>, что вызвало массу негодования с моей стороны и было допилено.<br />
За сим выкладываю патч для <b>VSFTPD</b> и пропатченный архив для версии 2.2.2:</p>
<ul>
<li><a href="ftp://xskernel.org/pub/patches/vsftpd/vsftpd-2.2.2.patch.bz2">патч для версии 2.2.2</a>;</li>
<li><a href="ftp://xskernel.org/pub/patches/vsftpd/vsftpd-2.2.2-patched.tar.gz">пропатченная версия 2.2.2</a>.</li>
</ul>
<p><b>UPD:</b> Забыл добавить, что внёс ещё одну фичу: файл не будет транкейтиться, если предварительно сделать <b>REST 0</b>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1704/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

