<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Multipart Upload on SILO</title><link>https://silo.pgsty.com/tags/multipart-upload/</link><description>Recent content in Multipart Upload on SILO</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 05 Aug 2026 07:48:52 +0800</lastBuildDate><atom:link href="https://silo.pgsty.com/tags/multipart-upload/index.xml" rel="self" type="application/rss+xml"/><item><title>Sorted Is Not Increasing: How One Duplicate Part Number Doubled an Object</title><link>https://silo.pgsty.com/blog/security/duplicate-part-numbers/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://silo.pgsty.com/blog/security/duplicate-part-numbers/</guid><description>&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed on the local &lt;code&gt;pgsty/minio&lt;/code&gt; branch as &lt;code&gt;22c1e41fd&lt;/code&gt;, &lt;strong&gt;unreleased&lt;/strong&gt;
&lt;strong&gt;Classification:&lt;/strong&gt; Data correctness, &lt;strong&gt;not a vulnerability&lt;/strong&gt; — see &lt;a href="https://silo.pgsty.com/blog/security/duplicate-part-numbers/#not-a-cve"&gt;Why this is not a CVE&lt;/a&gt;
&lt;strong&gt;Affected scope:&lt;/strong&gt; All backends, any authenticated S3 client, on its own upload
&lt;strong&gt;Tracking:&lt;/strong&gt; &lt;code&gt;pgsty/minio&lt;/code&gt; issue #49&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One section of this article describes an unfixed process-level panic in a neighbouring code path. Hold publication until that is fixed and released.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="summary"&gt;Conclusions first&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sort.SliceIsSorted&lt;/code&gt; with a &lt;code&gt;&amp;lt;&lt;/code&gt; predicate does not test strict increase. It tests &lt;strong&gt;the absence of an inversion&lt;/strong&gt;. Equal neighbours contain no inversion, so &lt;code&gt;[1,1]&lt;/code&gt; was accepted.&lt;/li&gt;
&lt;li&gt;Upload one 5 MiB part, complete with &lt;code&gt;[1,1]&lt;/code&gt;, and the server returns &lt;strong&gt;HTTP 200 and a 10 MiB object&lt;/strong&gt;. The upload is then consumed: a corrected retry gets &lt;code&gt;NoSuchUpload&lt;/code&gt;. The client cannot recover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inherited from upstream, and old.&lt;/strong&gt; The check has had this shape since 2016-08. Two refactors — 2017 and 2023 — rewrote it faithfully, because each preserved the predicate, and &lt;strong&gt;the predicate was never the problem&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The fix is one loop at the handler layer. The object layer is left undefended &lt;strong&gt;by decision&lt;/strong&gt;, and that IOU is written down here rather than left implicit.&lt;/li&gt;
&lt;li&gt;Three independent reviews found &lt;strong&gt;no defect in the fix&lt;/strong&gt;. What they found was a comment that misstated why a neighbouring guard exists — and, through that comment, an unrelated node-level panic.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-defect"&gt;The verb, not the predicate&lt;/h2&gt;
&lt;p&gt;The code, as inherited:&lt;/p&gt;</description></item></channel></rss>