<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: jcalvinowens</title><link>https://news.ycombinator.com/user?id=jcalvinowens</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 24 May 2026 22:22:12 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jcalvinowens" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jcalvinowens in "Waymo expands pause to four cities as robotaxis keep driving into floods"]]></title><description><![CDATA[
<p>The waymos are so consistently badly overpriced I've stopped even bothering to look. Nobody I know rides them! But they have riders more than half the time I walk by them, so clearly they're making money off <i>somebody</i>...</p>
]]></description><pubDate>Sat, 23 May 2026 15:50:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=48248680</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48248680</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48248680</guid></item><item><title><![CDATA[New comment by jcalvinowens in "AI is just unauthorised plagiarism at a bigger scale"]]></title><description><![CDATA[
<p>Yeah. It's becoming unbelievable how different the prevailing opinions on this site are from those of real people I know and work with. That's always been true to some extent... but good lord, it's like reading the news in a parallel universe right now.</p>
]]></description><pubDate>Thu, 21 May 2026 14:55:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=48223799</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48223799</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48223799</guid></item><item><title><![CDATA[New comment by jcalvinowens in "The occasional ECONNRESET"]]></title><description><![CDATA[
<p>As others have noted, this usually happens because both sides wrote data and one side didn't read it before calling close().<p>Here's a little reproducer: <a href="https://gist.github.com/jcalvinowens/da57edda9a01ca9f4c4088a2b629877e" rel="nofollow">https://gist.github.com/jcalvinowens/da57edda9a01ca9f4c4088a...</a><p><pre><code>    $ gcc -O2 test.c -o test
    
    $ strace -e socket,connect,write,accept,read,close ./test --rx        
    <...>                                                                           
    socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3                                                                           
    accept(3, NULL, NULL)                   = 4                                                                            
    close(3)                                = 0                                                                            
    read(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
    <...>
    read(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
    read(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 3035
    read(4, "", 4096)                       = 0
    close(4)                                = 0
    +++ exited with 0 +++

    $ strace -e socket,connect,write,accept,read,close ./test --tx
    <...>
    socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
    connect(3, {sa_family=AF_INET, sin_port=htons(31337), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
    write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 600000) = 600000
    close(3)                                = 0
    +++ exited with 0 +++
</code></pre>
...versus:<p><pre><code>    $ gcc -O2 -DWRITE_TO_SOCKET_BEFORE_READ test.c -o test
    
    $ strace -e socket,connect,write,accept,read,close ./test --rx
    <...>
    socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
    accept(3, NULL, NULL)                   = 4
    close(3)                                = 0
    write(4, "\250\3\0\0\0\0\0\0\250\3\0\0\0\0\0\0$\0\0\0\0\0\0\0$\0\0\0\0\0\0\0"..., 4096) = 4096
    read(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
    <...>
    read(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 997
    read(4, 0x7ffd45c2d3c0, 4096)           = -1 ECONNRESET (Connection reset by peer)
    <...>
    +++ exited with 1 +++
    
    $ strace -e socket,connect,write,accept,read,close ./test --tx
    <...>
    socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
    connect(3, {sa_family=AF_INET, sin_port=htons(31337), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
    write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 600000) = 600000
    close(3) 
    +++ exited with 0 +++</code></pre></p>
]]></description><pubDate>Sun, 17 May 2026 21:19:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=48173292</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48173292</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48173292</guid></item><item><title><![CDATA[New comment by jcalvinowens in "New Nginx Exploit"]]></title><description><![CDATA[
<p>If the workers weren't forked, the entire process would die to the SIGSEGV, and when it restarted the heap would be at a new address because of ASLR. This exploit couldn't work against a threaded daemon for that reason (only one guess).<p>In a world where they <i>are</i> forked, having a randomized heap base in each worker would also defeat the brute force approach. Instead of just fork(), it could execve() itself with some arguments that tell it to be a worker and where to find its brain, that effectively do an ASLR for each worker.</p>
]]></description><pubDate>Fri, 15 May 2026 17:00:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=48151012</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48151012</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48151012</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Bare-metal STM32: vector table, linker script, and startup code from scratch"]]></title><description><![CDATA[
<p>Does anybody else remember the Excel spreadsheet with a bunch of drop down menus that fed 1kloc of embedded visual basic to generate a C function to program the STM32 clock registers based on your selections? Top ten silliest things I've seen in my career for sure...<p>Related, I have a little end-to-end example of a piece of hardware with an STM32 running bare metal firmware like this: <a href="https://github.com/jcalvinowens/ledboard" rel="nofollow">https://github.com/jcalvinowens/ledboard</a></p>
]]></description><pubDate>Fri, 15 May 2026 07:05:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=48145436</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48145436</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48145436</guid></item><item><title><![CDATA[New comment by jcalvinowens in "New Nginx Exploit"]]></title><description><![CDATA[
<p>I mean... you're missing the forest for the trees, but yes I meant "address space" generally not "stack" specifically. The nginx threads are forked, it would not be that terribly complex to set up a heap with a new random address base in each worker (the only real complexity is dealing with heap allocations which happened before fork()). But the stack matters too, generally moreso.</p>
]]></description><pubDate>Fri, 15 May 2026 06:19:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=48145165</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48145165</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48145165</guid></item><item><title><![CDATA[New comment by jcalvinowens in "New Nginx Exploit"]]></title><description><![CDATA[
<p>> Apache used forked processes; I don't think that's unique or a particular issue.<p>Of course it is... in a typical threaded daemon, the threads have randomized stack addresses. Exactly as you observed, you get unlimited tries because nginx dutifully restarts the worker process with the same literal stack address every time it segfaults. I'm willing to bet the ASLR break they claim to have relies on that, but I'd be happy to be proven wrong if they publish it :)</p>
]]></description><pubDate>Fri, 15 May 2026 02:36:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=48143884</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48143884</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48143884</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Int a = 5; a = a++ + ++a; a =? (2011)"]]></title><description><![CDATA[
<p>Both major compilers yell at you for this nowadays... it's pretty unforgivable IMHO for somebody to be asking it as an exam or interview question if the right answer isn't "undefined":<p><pre><code>    <source>:5:10: warning: multiple unsequenced modifications to 'a' [-Wunsequenced]
        5 |     a = a++ + ++a;
          |         


    <source>:5:7: warning: operation on 'a' may be undefined [-Wsequence-point]
        5 |     a = a++ + ++a;
          |     ~~^~~~~~~~~~~</code></pre></p>
]]></description><pubDate>Thu, 14 May 2026 22:12:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=48141955</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48141955</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48141955</guid></item><item><title><![CDATA[New comment by jcalvinowens in "New Nginx Exploit"]]></title><description><![CDATA[
<p>I doubt it: aslr is not as easy to break on modern Linux as everyone in this thread wants to pretend it is. And anybody who actually cares so much about security that a compromised web frontend is the end of the world should be doing other things which would additionally mitigate this...<p>I know they claimed they can bypass it: if that's true, they should publish it. The forking nature of nginx <i>is</i> uniquely bizarre and vulnerable, and I strongly suspect that's the only way they're pulling it off. I feel like <i>that's</i> the interesting thing here, not the buffer overrun.</p>
]]></description><pubDate>Thu, 14 May 2026 21:52:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=48141763</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48141763</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48141763</guid></item><item><title><![CDATA[New comment by jcalvinowens in "New Nginx Exploit"]]></title><description><![CDATA[
<p>Sure, but I think the github README ought to make it more clear the POC as-is doesn't work against nginx on any current Linux distro.</p>
]]></description><pubDate>Thu, 14 May 2026 18:05:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=48138963</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48138963</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48138963</guid></item><item><title><![CDATA[New comment by jcalvinowens in "New Nginx Exploit"]]></title><description><![CDATA[
<p>The POC disables aslr: <a href="https://github.com/DepthFirstDisclosures/Nginx-Rift/blob/main/env/entrypoint.sh#L4" rel="nofollow">https://github.com/DepthFirstDisclosures/Nginx-Rift/blob/mai...</a></p>
]]></description><pubDate>Thu, 14 May 2026 17:41:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48138620</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48138620</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48138620</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Open Source Resistance: keep OSS alive on company time"]]></title><description><![CDATA[
<p>My employers have generally been fine giving me blanket permission to contribute to specific open source projects.<p>The framing matters: don't say "can I please do some charity work because it makes me feel good".<p>Say, "can I have your permission to get free rigorous review from experts in my field, and zero out all future maintenance costs for your company by contributing my fixes to the upstream open source project?"<p>Because that's really how it is. No employer of mine has ever said no to that. It is <i>entirely in their interest</i> for you to do this, you just have to help them see it.</p>
]]></description><pubDate>Wed, 13 May 2026 16:26:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=48124068</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48124068</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48124068</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Preserving Fisher-Price Pixter"]]></title><description><![CDATA[
<p>Yet again my plans for a productive morning have been derailed by an excellent new write up from Dmitry :)<p>That hand rolled DAC for the touchscreen with the eight gpio lines is hilarious.</p>
]]></description><pubDate>Wed, 13 May 2026 15:37:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48123341</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48123341</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48123341</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Show HN: Building a web server in assembly to give my life (a lack of) meaning"]]></title><description><![CDATA[
<p>How fun! I'm glad it was interesting, please feel free to link to it :)</p>
]]></description><pubDate>Mon, 11 May 2026 14:49:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=48095744</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48095744</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48095744</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Show HN: Building a web server in assembly to give my life (a lack of) meaning"]]></title><description><![CDATA[
<p>This is fun, thanks for sharing. I have a much more minimalist one for x86 Linux if you want to see what that looks like: <a href="https://github.com/jcalvinowens/asmhttpd" rel="nofollow">https://github.com/jcalvinowens/asmhttpd</a></p>
]]></description><pubDate>Sun, 10 May 2026 17:26:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48085902</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48085902</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48085902</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Serving a website on a Raspberry Pi Zero running in RAM"]]></title><description><![CDATA[
<p>I have a self hosting Pi Zero W running Gentoo. It started as a joke, but I kept it because it's actually occasionally useful for testing new kernel releases.<p>I found a fun bug with it a couple years ago: <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=89a906dfa8c3b21b3e5360f73c49234ac1eb885b" rel="nofollow">https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/lin...</a><p>It is still able to build software faster than it is released. It takes roughly a month to recompile the entire system :D</p>
]]></description><pubDate>Fri, 08 May 2026 16:16:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48065183</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48065183</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48065183</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Zuckerberg 'Personally Authorized and Encouraged' Meta's Copyright Infringement"]]></title><description><![CDATA[
<p>Arms races suck. I've managed to find a few L7 tricks to catch the residential proxies and serve them an empty 200, but there are obvious trivial workarounds on the other end and if I start talking about them in public they won't last long... I wish I could share :/</p>
]]></description><pubDate>Wed, 06 May 2026 19:22:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48040477</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48040477</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48040477</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Zuckerberg 'Personally Authorized and Encouraged' Meta's Copyright Infringement"]]></title><description><![CDATA[
<p>Every few weeks I run my nginx access logs through a script that uses the same textual ASN database to tally them up and spit out a summary report. There are many different sources for periodic textual ASN databases you can parse with UNIXy tools.</p>
]]></description><pubDate>Wed, 06 May 2026 14:58:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=48037037</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48037037</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48037037</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Zuckerberg 'Personally Authorized and Encouraged' Meta's Copyright Infringement"]]></title><description><![CDATA[
<p>Yeah, I dont know how anybody stays sane without it. I have a list of over a thousand ASNs I blackhole at this point...<p>Mine is a daily bash cronjob that fetches a text-based database and uses grep to build an nftables-apply script with all the IPs for the blocked ASNs. I keep meaning to share it, but it's embarrassingly messy I haven't had time to clean it up...</p>
]]></description><pubDate>Tue, 05 May 2026 22:53:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48029847</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48029847</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48029847</guid></item><item><title><![CDATA[New comment by jcalvinowens in "Zuckerberg 'Personally Authorized and Encouraged' Meta's Copyright Infringement"]]></title><description><![CDATA[
<p>I had to block meta's ASN on my personal cgit server a few weeks ago because they were ignoring robots.txt and torching it. Like hundreds of megabytes of access logs just from them, spread around different network blocks to clearly try and defeat IP based limiting. I couldn't believe it.</p>
]]></description><pubDate>Tue, 05 May 2026 21:24:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=48028809</link><dc:creator>jcalvinowens</dc:creator><comments>https://news.ycombinator.com/item?id=48028809</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48028809</guid></item></channel></rss>