It’s the crossover event you’ve all been waiting for: Reply All‘s Super Tech Support takes on an annoyingly specific technology problem involving 99% Invisible. Ben loves podcasts, but he has a problem. When he tries to listen to 99% Invisible in particular, his car stereo completely breaks. This week, Alex, PJ, and the team at Reply All try to solve one of its strangest cases — Roman Mars versus a 2016 Mazda sedan.
Reply All is hosted by PJ Vogt and Alex Goldman and is a part of Gimlet Media.
If you’re experiencing the same in-car playback issues with 99% Invisible, you can find the Mazda-friendly version of our feed here!
I can’t play 99PI on my series 4 Apple Watch. Says the format is not supported.
You were on the right track, but you didn’t quite reach the right conclusion.
First off, don’t call this a virus. A virus is malware. This is just a bug.
The bug is that the car’s code is calling “printf(str)” where “str” is untrusted and unsanitized data. It should be calling “printf(“%s”, str)” or even just “puts(str)”. This is a really basic security bug; the code should never have been checked in, let alone shipped.
“%I” is not the problem. “%n” is the problem. “%In” means [paraphrased from https://en.wikipedia.org/wiki/Printf_format_string#Type_field%5D “read the next pointer-sized parameter from the stack and write the number of characters successfully written so far to that address”. Since there is no parameter on the stack, the code reads random stack garbage, tries to write to that address, and crashes. “%s” would also exploit this bug, because that also causes printf to read stack garbage, treat it as a pointer, and dereference it.
“%i” and “%p” don’t crash because those format specifiers don’t dereference pointers. They read stack garbage, but they just print the value of that garbage.
This happened to me as well but not in my car, but with my iphone. I coudn’t play any other podcast because the episode will remain in play.
Since January 2016, I’ve listened to 190 days of podcasts
I must admit, I’m super curious what language that software was written in. The podcast seemed a little vague on the specifics of the language and what exactly was going on? Just something with URL parsing?
I work in technical support and this was easily the most interactive I have ever been with my radio! I listened to (and yelled at) this episode on the way into work, and as soon as I got there my boss and I had a great laugh at the frustrations we felt with the story-driven-but-terrible-for-problem-solving approach and all the things we would have done differently (99% Interior, anyone?!). Then a coworker from the other side of the building happened to walk by, and said he had just listened to the episode as well! He theorizes the code was probably written in Java, since it’s so URL focused that something like a percent symbol would definitely give it a panic attack.
Also, I’m 100% with PJ; I can’t believe you got Samin Nosrat and Sarah Koenig to do those offshoot podcasts!! I did, however, listen to and thoroughly enjoy the full versions. :)
Anyway, this was the most fun I’ve had not being able to directly solve someone’s technical problem. I’m going to be talking about this one for a long time.
I have the same problem with my 2015 Nissan Versa Note. Whenever 99pi came on, the whole audio console would crash and restart – then try to place again, then crash again. Took me awhile to hone in on the ‘%’ being the cause (troubleshooting while driving a car on the highway is difficult.)
I looked around and other models of Nissans have the problem too, mostly 2015-2016s it seems.
My work around is to keep close eye on the playlist so 99pi doesn’t play in the car. is the Mazada safe feed going to be updated going forward?
Yes, the feed is will be updated with new episodes. =)
Same problem in my ’14 Altima. I’m glad to see the feed is updating, I’ll try it in my car again now. I had just given up on 99PI in my car altogether before this episode. This is great news, thanks!
Now, can you figure out why when I listen to podcasts on iTunes on my Mac, sometimes it randomly stops playing an episode and moves on to the next show as if I switched it? It’s killing me not being able to listen to Revolutions or any of several other shows this happens with.
After listening to more than 300 99pi podcasts, THIS was the first one that genuinely annoyed me no end. Checking other special characters, whilst it might have been a fun exercise, won’t necessarily give you the answer.
You need to look at the history of what certain characters were initially used for. Other than its use as a modulo operator, the percent sign is most commonly used to indicate non-executable text within the body of a program. Just look at the URL! It’s spelt in full for that exact reason.
Of course I HAD to try listening in my 2018 Mazda MX-5! It has the most recent info-tainment system, upgraded with Apple CarPlay this year. I started 99% Invisible on my iPhone and got in the car. Normally the system will automatically connect via Bluetooth and play whatever I was listening to before I got in the car. This time I just got a message saying “Unable to connect to Bluetooth audio source.” As soon as I stopped the podcast and switched to music, it connected and worked as usual. Pretty sure it would work fine if I connected to CarPlay with USB, but I’ll try that next time. Thanks for a great Podcast!
Interesting piece, and like many technogeeks I mostly figured it out by the end of the second sentence. Did a great job explaining some of the challenges in modern software.
But where I hoped you would go, but didn’t, is the cybersecurity angle. Problems like the %I issue you identified are frequently harbingers of software bugs that can be exploited by hackers. So instead of locking up the MP3 player in the car, they could reprogram the car or render it unusable, simply by convincing a Mazda owner to play the podcast. It’s a well understood principle in cybersecurity that if you can accidentally cause something to go haywire (as in your example), you can probably make it happen on purpose, and exploit it for nefarious purposes.
If you’re interested in a followup, would be happy to help you.
This has been so frustrating for the last couple of years that I have been listening to podcasts. I have a limited amount of time, so I am picky and having to play 99%I on my phone while it sits in my breast pocket is annoying. Thank you!!!
Omg! The ‘Spin off’ podcast are just sheer brilliance!
I loved them all!
This episode has it all. Hilarity, Roman’s voice, a mystery. Loved it. Thank you.
This episode reminded me of a glitch in the old radio Emergency Broadcast System (EBS) during the cold war. One station in a region was the designated EBS station. They would get an alert and relay it to all the other radio station (and TV stations). Each station had an EBS box that would be trigger by a tone of a certain frequency. And then, seemingly at random, the EBS boxes in the region would all go off with no alert being sent. After the same kind of investigation reported here, they found the issue. Whenever the designated station played Shirley Bassey’s recording of “Goldfinger,” she hit the exact note that triggered the alert signal. So designated stations had to stop playing “Goldfinger.”
I find it ironic that I was just reading the chapter in Ready Player One that was talking about the Adventure game that they spoke of in the podcast. Super entertaining and interesting !
I have to agree with Anjuli. This episode has brought me very close to unsubscribing.
Really? This was maybe a 15 minute episode at best.
Then, we get the whole gamut of fake podcasts.
~55 minutes I can’t get back. even at 2x speed, and doing other things while listening, I get the full time penalty for listening to the whole thing.
I feel your pain too! This was so rambling and drawn out….but I guess it was a good contrast to how compact and well designed the 99PI podcasts are. This was more like a five minute story, these guys like to hear themselves talk way to much.
Out of curiosity, why not start naming the files with “99percent” or” 99pi” or something with out the “%I” in the file name, and only keep one podcast feed? Would that change the way iTunes or other podcast apps deal with them?
For crying out loud! Use an analog cable to plug into the car’s stereo system!!! It’ll sound just fine. You’d avoid this problem altogether!!! It’s cheap and it works!!!
I enjoyed the show. They sounded like they were having a good time. Use an analog cable.
The Podcast Addict app added a work around for this in their most recent update. I don’t have a Mazda, so I can verify success.
I have not had this issue with my 2017 Mazda 3. I guess it must be specific to certain firmware versions.
I have exactly the same problem with my 2017 Nissan Altima…so mysterious and frustrating.
I agree with Roman. This episode was fantastic. I had a feeling that the percent sign was causing the issue. I have a similar issue with my Toyota stereos but they don’t shutdown. Looks like I’ll be listening to Reply All now. Congrats you’ve got a new subscriber!
Loved this episode because I had the exact same problem in my Mazda 3! I never connected it to being a 99pi problem, but I listened to a lot of 99pi so it probably was. Mine actually got so bad that it seemed to corrupt the hardware. After doing the software updates and the issue continuing to get worse, Mazda ended up replacing my entire infotainment system under warranty. I was told that Mazda requested the local dealer send the corrupted unit back to headquarters for testing. Everybody involved seemed confused about how a software issue seemed to cause a hardware problem.
As a software developer, I’m deeply disappointed in the conclusion and was hoping for a deeper explanation than “it’s probably URL encoding” because there’s multiple issues with that explanation:
1. There’s a space between the % and I, so they’re not even related.
2. The I isn’t the only letter that has meaning in URL encoding, so do other characters. In fact only hexadecimal numbers are allowed.
3. Why would the podcast title, which is normal text, even being parsed as an URL for the percent encoding to matter? This is the big confusing aspect, which could’ve easily been answered using the source code and its original author.
I agree with several others that say this episode was annoying. The problem itself was very interesting, but there was way too much fluff to dredge thru. I love 99PI specifically for its lack of fluff.
That was super frustrating, all of those tests and theories to still not figure out the cause of the bug. Sure you know it’s the %I, but you still never determined what that triggers in the code.
If you want to control your audio using voice commands or the head unit, you may not just be able to use an aux in cable. Additionally if you connect using USB, this may create other strangeness with nav system conflicts, auto play of various apps, etc. Modern car audio systems are notoriously finicky about random things. Frankly, I’m a little surprised that the issue of the percent sign (and the space in a file name) wasn’t obvious. As a previous poster mentioned, the percent sign has a long history in programming (as does the number sign, the question mark, and a few others.). Why Ben or the Reply All guys didn’t use an audio editor to change the podcast metadata (not just label but other file attributes) is beyond me. I’m nobody’s tech expert and it occurred to me right away. And yes, the “test” podcasts were vaguely cute on the first short listen, but we got it and didn’t need to hear it again.
You needed better software people on this. Within the first few minutes of the podcast I was thinking that the % and what followed it was probably the problem. I would have looked at the podcast file and edited it to alter the strings including the % and the I. Could have been solved and fully characterized in a few hours.
I have the same problem w/my Nissan. It’s such a problem that I have to wait till I have a backlog of 99% stored up and listen at home – hence my just hearing this podcast! I use the podcast APP on my iPad to listen but I don’t see the other (safe) version. How do I locate it so I can put 99% back into my normal feed?
If anyone uses PocketCasts, the lastest version 7.3 (at least for iOS) has a built-in fix for this.
Per change log:
“Added a workaround for a truly bizarre but affecting some car stereos (coverd on Reply All and 99% invisible. If you’re a 99% Invisible fan you should nowbe able to listen over bluetooth in your car without fearing that it might freak out on you”
Holy shit, this episode was good. I’m still not totally convinced this wasn’t a super-elaborate April Fool’s prank, but I enjoyed it enough that I honestly don’t care.
This happens to me on my 2016 Nissan Frontier too! I thought it was just my car.
Just checking in from the UK to say that this happens on my Nissan Juke, which is why I’m a few weeks behind on 99pi. I’ve even taken my car back to the dealer to demand a new sound system. Didn’t help. Thought it was a fault in my car only.
And here we are in 02/2022 with Mazda radio’s going into endless boot loops due to bad/malformed RDS data! It looks like Mazda just ignored this back in 2019. They swept it under the rug and hoped it would just go away. Ooops!!