<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Tue, 29 Sep 2026 07:34:51 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-90096 — fuse: invalidate the correct range after O_APPEND direct write</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-90096</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;fuse: invalidate the correct range after O_APPEND direct write&lt;/p&gt;
&lt;p&gt;fuse_direct_write_iter() captures pos before generic_write_checks(),
which moves ki_pos to EOF for O_APPEND writes:&lt;/p&gt;
&lt;p&gt;fuse_direct_write_iter()
  {
      pos = iocb-&amp;gt;ki_pos;           /* 0 (user-supplied)       */
      generic_write_checks();       /* ki_pos -&amp;gt; EOF           */
      fuse_direct_io();             /* writes at EOF, correct  */
      invalidate(pos, pos + res);   /* [0, res) -- wrong       */
  }&lt;/p&gt;
&lt;p&gt;The post-write invalidation targets a stale range instead of the
actual written range at EOF.&lt;/p&gt;
&lt;p&gt;This can cause data inconsistency when the file size is not
page-aligned.  The tail page straddling EOF has a valid portion
before EOF that concurrent readers can fault back in during the
DIO write window:&lt;/p&gt;
&lt;p&gt;Tail page (file size X not page-aligned):&lt;/p&gt;
&lt;p&gt;page_start         X (EOF)   page_end
    |--- valid data ----|-- stale --|&lt;/p&gt;
&lt;p&gt;CPU0 (O_APPEND DIO writer)    CPU1 (buffered reader)
  --------------------------    ----------------------
  invalidate [X, X+len)
    tail page evicted
  FUSE_WRITE in flight ...
                                read [page_start, X)
                                  tail page re-faulted
                                  [X, page_end) = stale
  FUSE_WRITE completes
  i_size = X + len
  invalidate [0, len)  &amp;lt;- WRONG
    tail page still cached
                                read [X, X+len)…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;fuse: invalidate the correct range after O_APPEND direct write&lt;/p&gt;
&lt;p&gt;fuse_direct_write_iter() captures pos before generic_write_checks(),
which moves ki_pos to EOF for O_APPEND writes:&lt;/p&gt;
&lt;p&gt;fuse_direct_write_iter()
  {
      pos = iocb-&amp;gt;ki_pos;           /* 0 (user-supplied)       */
      generic_write_checks();       /* ki_pos -&amp;gt; EOF           */
      fuse_direct_io();             /* writes at EOF, correct  */
      invalidate(pos, pos + res);   /* [0, res) -- wrong       */
  }&lt;/p&gt;
&lt;p&gt;The post-write invalidation targets a stale range instead of the
actual written range at EOF.&lt;/p&gt;
&lt;p&gt;This can cause data inconsistency when the file size is not
page-aligned.  The tail page straddling EOF has a valid portion
before EOF that concurrent readers can fault back in during the
DIO write window:&lt;/p&gt;
&lt;p&gt;Tail page (file size X not page-aligned):&lt;/p&gt;
&lt;p&gt;page_start         X (EOF)   page_end
    |--- valid data ----|-- stale --|&lt;/p&gt;
&lt;p&gt;CPU0 (O_APPEND DIO writer)    CPU1 (buffered reader)
  --------------------------    ----------------------
  invalidate [X, X+len)
    tail page evicted
  FUSE_WRITE in flight ...
                                read [page_start, X)
                                  tail page re-faulted
                                  [X, page_end) = stale
  FUSE_WRITE completes
  i_size = X + len
  invalidate [0, len)  &amp;lt;- WRONG
    tail page still cached
                                read [X, X+len)…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-90096</guid>
    </item>
  </channel>
</rss>
