<span class="Apple-style-span" style="font-family: Times; font-size: 16px; "><pre>Thank you for the clarification</pre><pre>------</pre><pre>adc spake unto us the following wisdom:
><i> Hi, could someone help me understand CVE-2009-1376?
</i>><i> """
</i>><i> The previous fix to CVE-2008-2927 <<a href="http://pidgin.im/news/security/?id=25">http://pidgin.im/news/security/?id=25</a>> was
</i>><i> deemed incomplete. The size check improperly casted an uint64 to size_t
</i>><i> which can cause an integer overflow, rendering the check useless.
</i>><i> """
</i>><i> original patch:
</i>><i> 
</i>><i> -               if ((offset + len) > slpmsg->size)
</i>><i> +               if (G_MAXSIZE - len < offset || (offset + len) > slpmsg->size)
</i>><i> 
</i>><i> 
</i>><i> additional patch:
</i>><i> 
</i>><i> +-      gsize offset;
</i>><i> ++      guint64 offset;
</i>><i> 
</i>><i> +       gsize len;
</i>><i> 
</i>><i> Where is the problem exactly? I'm assuming that on a 32-bit machine
</i>><i> G_MAXSIZE should be
</i>><i> max unsigned int (2^32-1) and gsize is an unsigned integer.
</i>
On the line:

        offset = msg->msnslp_header.offset;

(struct MsnSlpHeader *)->offset is declared as 64-bit.  Assigning it
to a 32-bit offset field led to truncation.  These checks themselves
weren't the problem.

Ethan

-- 
The laws that forbid the carrying of arms are laws [that have no remedy
for evils].  They disarm only those who are neither inclined nor
determined to commit crimes.
                -- Cesare Beccaria, "On Crimes and Punishments", 1764</pre></span>