Friday, October 9, 2009

Bugs can be fun, as long as I didn't write them

In order to make optimal use of tonight, I did a portsnap and fed a list of ports to be updated, into my script; then went to work on playing with pthreads. A short while later, when things got to ImageMagick, I got the shock of my week—pkg_delete crashed during a make deinstall!

In looking through the code, I've found the reason why, there's a package name passing through the code as a null by the time it finishes passing through pkg_do in src/usr.sbin/pkg_install/delete/permform.c. From the looks of things, it goes bonkers once Plist is setup via read_plist(). Hmm, well well, the Package (_pack) structure being passed to it has rather interesting contents at the time.

I just don't have much more time to fiddle with this damn thing! I've got to be up for another groaning day of work tomorrow.

OK, found it, there's some funkyness here. When it hands off to add_plist (basically every damn thing in the bloody +CONTENTS), it has NULL'd the dohicky that gets copied in later. read_plist() sucks a file line by line, looks like if the trailing character is a space, read_plist() sets it to the null character (\0).

That creates a bit of a problem, because the +CONTENTS file for ImageMagick has a line '@pkgdep ', which results in pissing off the whole damn thing... lol.

So... how to handle this problemo? I see two things: 0.) pkg_delete should NEVER FUCKING CRASH!!!! No matter what is in a +CONTENTS file, at least, that is my opinion!!! And 1.) if '@pkgdep ' is not valid in a +CONTENTS file, whatever causes ImageMagick/ports to be shoved there needs to be found and fixed. Digging into +CONTENTS file creation is a beast for another hour. Why the pkg_delete program chooses to pass a NULL through I have no bloody idea, maybe shifting through CVS logs might hold the answer to that mystery. The pkg_install suite has some rather ugly and quickly hacked together parts, that really makes me wish they had used shell or (like OpenBSD) imported Perl into the base for the job, rather then doing it in C. Don't get me wrong, I like C, but please don't write functions with over 1,000 Lines Of Code ;). Either way, when it comes to fixing the pkg_install issues... that's something I'm not going to touch unless a developer suggests what they would like to see in a patch, because whomever is maintaining it, should have a better overview of things then I do at the moment; I'm in no shape to do any more thinking tonight. Perhaps I'll just file a bug report on it and see what comes of it.

Right now I just need to get some freaking sleep before work. Ugh, stairs here we come.......

No comments:

Post a Comment