22 ms·
Invented by OpenBSD
- liveoneggs 12y agoexcept the 0 behavior has been restored
- TodPunk 12y agoToday. Timestamped almost right with this article. I'm sure it is correlated and not causal, but I'm also pretty sure the root cause for both is the same.
- clort 12y agoI'm not sure what your supposition about the root cause might mean. NetBSD very recently imported these functions (reallocarray and strtonum) to libc after much objection (over several years actually) to their poor APIs, yet finding that they crop up time and again in code used in base (and then multiple copies exist, in out of the way places). So, as a pragmatic solution they are now available from libc if _OPENBSD_SOURCE is defined. Cleaner API functions were proposed, with wrappers which would provide equivalent functionality for the OpenBSD functions. Some difference was noted, and recently fixed in these wrappers. The root cause for the NetBSD changes then, seems to be that these functions keep cropping up, and the job of libc is to provide commonly used functions. I believe the intention is, that the cleaner API is proposed to replace the original OpenBSD ones, which are not properly portable (strtonum for instance, returns hard coded english error strings in ASCII) The root cause for the blog entry by Ted Unangst is probably that he is an OpenBSD developer and was involved in creating these functions, which are now being criticised. These root causes don't seem the same to me.
- darklajid 12y agoYou seem to have a much better understanding of the situation than I do. The remark about the hard coded error strings was interesting though, so I looked at the implementation [1]. I .. am not sure why that would be considered not portable? Admitted, I'm neither into C nor do I have experience in the field, but .. that seems to be easy to read, contains clear/concise error messages _on top_ of clear error codes. 1) Any consumer can ignore the string and map the error code to a message in Klingon or whatever else, no? 2) The function name is in ASCII/English. So are the parameter names. Most of your C code is probably reading ~somewhat~ like english, and usually is restricted to ASCII? Is it really a problem that this method returns both a well-defined number and a simple string in case of an error? Back to the first line: I .. am certainly clueless here and just watching from the sidelines. But I'm kinda serious about the questions and genuinely curious why you object to that part of the implementation? 1: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/strtonum.c?rev=1.7&content-type=text/x-cvsweb-markup http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib...
- clort 12y agofor 1, the consumer is properly the user not the programmer.. and the user cannot ignore the error string in favour of the number if the programmer provided only that. Since the documentation specifies the error strings, for 2, the function can be called (as can any C function) from a source character set other than ASCII, as the compiler should handle that. The name is technically english its true and programmer needs to know some english, perhaps.. but the user does not need to know that if the error code is used, then the error string is superfluous, and C library functions are not in the habit of providing superfluous information. C is pretty low level after all. Here is more reading about the objections the NetBSD folk had with strtonum(3) http://mailing.netbsd.tech.userlevel.narkive.com/mZ37nlai/strtonum-3-from-openbsd
- darklajid 12y agoStill confused. What is a user in your reply? I mean, an end user / my mom isn't going to call strtonum? Some developer does. And said developer can absolutely ignore the string's content? Test for success: errno is 0, errstrp is NULL Handle error: Use errno or errstrp - the latter gives you a bit more information (reports a different error for invalid ranges, too small vs. too large). But if you don't care, errno is fine, no? And we're still talking about the programmer here, as far as I'm concerned. Ted has a description of his intentions here [1]. I guess I'm confused why there's a fuzz about it, because technically this method should be good enough? I do have to shake my head at the "Even if intmax_t probably would have been a better choice, I think we’re sticking with long long just because it frustrates people unwilling to admit it doesn’t make a difference." remark, but .. other than that? Does it .. matter? 1: http://www.tedunangst.com/flak/post/the-design-of-strtonum http://www.tedunangst.com/flak/post/the-design-of-strtonum
- clort 12y agoYes, the user is the person who runs the program that they didn't write. They don't know that they called strtonum() testing for errno == 0 is not actually useful, since errno is not set except on error (that is by design of errno, it is always an indication of what the last error was, not that there was an error) and errstrp doesn't give the Klingon user you mentioned any information at all, since they can't read English. fafner said it better than I in https://news.ycombinator.com/item?id=9184734 https://news.ycombinator.com/item?id=9184734 and yes it does matter, for a standard libc function, because if you don't take care about setting standards, then your standards will be a mess.
- TodPunk 12y agoEh, I'm no conspiracy theorist nor am I supposing foul play or pithiness or anything. I'm merely noting they're likely influenced by background conversation nobody's really paying attention to but the related folks. Tech is always a small crowd of people doing things in specific areas, and I'm not dumb enough to think they don't talk or read each other's stuff or whatnot. Probably read something on a mailing list or in IRC or something, similar sparks happened, they led down the chain, then we end up here, that sort of thing. It's not bad, just human behavior in small groups. The politics behind it aren't interesting to me, I'm just noting that it's not likely as completely quarantined from each other as they might complain, even if they don't realize such. That's totally cool with me, even if my supposition (again, unfounded even if it is how such things often occur) is completely incorrect in this particular instance. =c)
- TodPunk 12y agoI've never understood why anyone wouldn't just use OpenBSD if you're going to use a BSD. I'm sure there are reasons, there must be, but OpenBSD has a long history of having really great source code that's useful just about everywhere (hint: you're using OpenSSH almost assuredly on every linux box ever, and it's fantastic). To me, as a developer I get the whole NIH thing. I really do. I just don't get why you'd choose "here" to be somewhere that doesn't include all the amenities in the first place.
- adekok 12y agoOpenBSD focuses on security. NetBSD focuses on engineering and architecture. Having used both, I'd say the security focus of OpenBSD means it's often lacking consistency and "polish". NetBSD's focus on engineering means it's consistent, clean, etc. What other operating system has a build.sh? https://www.netbsd.org/docs/guide/en/chap-build.html https://www.netbsd.org/docs/guide/en/chap-build.html You can build identical binaries for NetBSD on any *NIX host OS. That's impressive.
- adamrt 12y agoWould you mind giving a few examples where OpenBSD is lacking consistency or polish? I was a huge NetBSD fan for many years, but I moved to OpenBSD about 6-7 years ago because I felt it actually had more consistency and polish. It's been so long now though that I don't remember specifics.
- justin66 12y ago> Having used both, I'd say the security focus of OpenBSD means it's often lacking consistency and "polish". I wonder why you think so. I've only ever used OpenBSD and NetBSD on PCs and Unix workstations. I have never, ever, in any domain found NetBSD to have more "polish" than OpenBSD. From the initial installation where OpenBSD helps you with everything and NetBSD, well, doesn't, to reading and using documentation (OpenBSD's man pages are the best around, with the possible oddball exception of some old Open Group pages which include code examples), OpenBSD seems to be miles ahead. So I just wonder what you're talking about specifically.
- elchief 12y agoWhy do people use NetBSD over OpenBSD? Serious question.
- jaak 12y agoNetBSD supports many more platforms and architectures than OpenBSD (I ran NetBSD on MIPS and 68k years ago).
- vezzy-fnord 12y agoBesides portability, NetBSD does have a lot of attractive technical features, including a cross-platform source-based packaging system, the rump kernel concept where drivers can be run in both monolithic and microkernel-esque fashions, an extensive kernel-level authorization system through kauth(9), a very intelligently designed driver framework with lots of low-level components abstracted into machine-independent interfaces (which OpenBSD and FreeBSD later integrated themselves), and so on. NetBSD has also been the first to introduce new features like reforming the rc boot scripts into the more modern rc.d system. Lots of people (esp. Linux users) have this impression that all Unix-likes besides Linux are hulking dinosaurs stuck in the old ages, but this couldn't be further from the truth.
- ausjke 12y agoNetBSD is normally the first choice for embedded products in the BSD family, I'm aware of some large companies used NetBSD in their routers and printers.
- Sanddancer 12y agoPerformance for one. OpenBSD's awesome security features do come at a cost regarding speed. Feature sets is another; NetBSD has some features, like Rump Kernels [1], which OpenBSD doesn't have, and has shown some hostility to in the past. Like any architecture decision, it comes down to researching who has the best solution set for your problem and working from there. [1] http://rumpkernel.org/ http://rumpkernel.org/
- cootysratsemen 12y agoAlso worth noting that NetBSD can run Xen dom0.
- brynet 12y ago"[NetBSD's] reallocarray was [just] fixed to behave like OpenBSD. Now it’s a 13 line replacement for a 10 line function. But at least it doesn’t have any code written by an OpenBSD developer."
- aortega 12y agoThe article missed: 1) W^X protections 2) ASLR 3) Stack canaries 4) strlcpy 5) OpenSSH! 6) Heap guard pages 7) Software NX 8) Etc. Maybe project PAX invented some of those, but massive deployment was in OpenBSD first. Well if you can call them massive..
- foodstances 12y agoI think you missed the point of the article.
- aortega 12y agoProbably. Edit: Yes, I missed it.
- _wmd 12y agoOpenSSH is a fork of the original SSHv1 written by a Finnish guy.
- bsder 12y agoBecause the license changed and said guy started expecting to be able to extort money out of people. While the OpenBSD guys can be obnoxious twats at times, they were definitely in the right when they forked the OpenSSH code.
- gonzo 12y agoActually someone else forked the code, and openbsd forked that because they wanted to rush out a release. http://www.openssh.com/history.html http://www.openssh.com/history.html
- whytry 12y agoI don't understand why the author feels they have any say in NetBSD's decisions if he isn't willing to engage the community directly about it. Perhaps I missed some of the technical minutiae, but it just seems the author is being a bully and not really offering anything of substance other than expressing displeasure with the way NetBSD does things. The author seems to think he has some kind of solid foundation for his opinion, something fuzzy about contaminated functions and bad NetBSD culture... If these same functions keep getting reimplemented, then perhaps there is a reason beyond what he is seeing other than lazy developers or whatever he is implying.
- xnull6guest 12y agoThe changes introduced are potentially extremely damaging. Take for example: https://github.com/libressl-portable/openbsd/search?utf8=%E2%9C%93&q=reallocarray https://github.com/libressl-portable/openbsd/search?utf8=%E2...
- talideon 12y agoWhat's damaging about reallocarray?
- xnull6guest 12y agoDid you read the article? NetBSD's implementation, specifically with regard to how it handles deallocation, diverges from OpenBSDs - though its documentation is wrong. LibreSSL (for example) will compile just fine on NetBSD, but as the logic of the two implementations differ so too will correct memory management in LibreSSL. This is just one example of how a port of secure code can be made insecure. So it doesn't have to do with reallocarray specifically. It has to do with drawing out the security implications of the article under discussion.
- kryptiskt 12y agoThe post on executable memory is a hundred times more interesting than this: http://www.tedunangst.com/flak/post/now-or-never-exec http://www.tedunangst.com/flak/post/now-or-never-exec
- alexlarsson 12y agoI don't understand how one can claim to "invent" reallocarray. Glib has had g_realloc_n() since 2010, but its not something being touted as a huge invention. Its a tiny helper. Very useful, but quite obvious.
- dijit 12y agoI think the Author is saying that people often use BSD code or ideas and reimplement them to be fundamentally incompatible yet using the same name. this means that, as a developer, when calling these functions you can't be sure of if you're calling it in a safe way.. openBSD makes code deliberately designed to be portable, and other BSD's make it non-portable by altering it in odd ways, yielding dangerous consequences by reusing the namespace.
- fafner 12y agoNetBSD's strtoi and strtoimax seem like the better alternative to strtonum. 1. It is defined for intmax_t instead of long long. 2. It supports various bases. (At least I regularly need hex or base36) 3. It can deal with trailing characters. 4. There are matching strtou and strtoumax operations It's of course bad if NetBSD introduces an strtonum, which behaves differently from the OpenBSD one. But maybe the OpenBSD folks should look into strtoi and strtoimax instead of blindly following their "invented here" principle...
- darklajid 12y agoThat's basically all mentioned in his post about the design [1] from 2011 and he seems to dismiss all these cases. Is that reasonable? No clue, I don't write/know/do C.. 1: http://www.tedunangst.com/flak/post/the-design-of-strtonum http://www.tedunangst.com/flak/post/the-design-of-strtonum
- fafner 12y agoI don't think it's reasonable. The way they implemented strtonum might match their particular use case in OpenSSH/LibreSSL. But if they want to make it a libc function and popularise it then they should concern themselves with other use cases and opinions, especially when they pick a bold name as strtonum. It's not a surprising outcome that others are reluctant to follow them and they have clashes in behaviour or naming.