Thank you Yavor for this patch. It looks correct to me and should resolve this specific issue. As for the code in the whole Address framework it will need a lot more of cleanup. Just skimming over it I noticed dozens of issues. i am quite surprised that this code does anything useful at all. If this library is in actual use, Riccardo and I should sit down together and try to clean it up. Otherwise it will come back and haunt us :-) Great to see how you all worked together to understand and resolve this specific problem.
Cheers, Fred > Am 20.11.2024 um 02:23 schrieb Yavor Doganov <ya...@gnu.org>: > > Control: reassign -1 libaddressview0 0.4.8-5 > Control: retitle -1 [i386] VCFViewer inspector aborts GWorkspace, making it > unusable > Control: affects -1 gworkspace.app > Control: tags -1 + patch > > Paul Seelig wrote: >> Looks like finally found the root cause for making GWorkspace >> malfunction on i386! > > Indeed! > >> There is a package named 'addresses-goodies-for-gnustep' containing >> "VCFViewer - A GWorkspace inspector for viewing .vcf files". I had this >> package installed and apparently this pulls in libAddressView. In amd64 >> this doesn't provoke GWorkspace any different, but in i386 it obviously >> does. > > This is basically rarely tested code. The upstream build system does > not build anything in the Goodies directory by default and we (we == > Debian GNUstep team) enabled the VCFViewer inspector recently (in > 0.4.8-5, uploaded 27th of September to unstable). Excellent catch, > once again I'd like to express my gratitude for your bug report. > >> Once i deinstalled 'addresses-goodies-for-gnustep' on i386, GWorkspace >> worked fine as expected. > > Armed with this information, I was able to reproduce on my i386 > machine. But I get SIGSEGV and not your uncaught exception(s). The > backtrace is: > > Program received signal SIGSEGV, Segmentation fault. > 0xb727a373 in objc_msg_lookup () from /lib/i386-linux-gnu/libobjc.so.4 > (gdb) bt > #0 0xb727a373 in objc_msg_lookup () at /lib/i386-linux-gnu/libobjc.so.4 > #1 0xafb11ef6 in -[ADPersonView calcSize] > (self=0xafb3f4f2 <-[VCFViewer initWithFrame:inspector:]+738>, > _cmd=0x5f4020) at ADPersonView.m:325 > #2 0x005ec280 in () > > This shows a corrupt stack as in your case, but it's different > (perhaps because this is a a pure bookworm system + > GNUstep/GWworkspace built from tarballs + > src:addresses-for-gnustep/0.4.8-5 with all patches applied built and > installed in the USER domain along with the rest of GNUstep core). > > The code that corrupts the stack and confuses GDB is line 317 in > Framework/AddressView/ADPersonView.m: > > sizeNeeded = [[self superview] frame].size; > > [self superview] returns nil for me (checked at runtime with GDB) > which leads to a garbage value and the subsequent crash. The trouble > is that I don't understand why it happens, and why this occurs on i386 > (and probably other 32-bit arches). Fred is probably the only person > in the world who can explain this... NSView is a fairly complex > class, and its internals have always been mystery to me. > > Please test the attached patch (it solves the problem for me): > > $ apt-get source addresses-for-gnustep && cd addresses-for-gnustep-* > (Make sure it's 0.4.8-5; the trixie/sid version) > $ cp /path/to/1087735.patch debian/patches > $ echo 1087735.patch >> debian/patches/series > # apt-get build-dep addresses-for-gnustep > $ dpkg-buildpackage -us -uc > # dpkg -i ../libaddressview0_0.4.8-5_i386.deb > > Then start GWorkspace to test. > >> Unless i am not utterly mistaken, then the debugging should probably >> rather continue with 'addresses-for-gnustep'. > > That's right, I have reassigned the bug. Many thanks for your > assistance, we are definitely getting closer to nailing this down.
--- addresses-for-gnustep-0.4.8.orig/Frameworks/AddressView/ADPersonView.m +++ addresses-for-gnustep-0.4.8/Frameworks/AddressView/ADPersonView.m @@ -312,7 +312,7 @@ static NSString *__defaultCountryCode = NSSize sizeNeeded; NSSize nvSize, nvMaxSize, nvMinSize; - if(_fillsSuperview) + if(_fillsSuperview && [self superview]) { sizeNeeded = [[self superview] frame].size; if (sizeNeeded.width > 10)