[Pkg-sugar-devel] Bug#892016: scratch: segfault in lookupMethodInClass upon trying to load an image from the webcam

Tobias Pape tobias at netshed.de
Sat Sep 22 12:02:23 BST 2018


Hi All

On Sat, 22 Sep 2018 09:40:35 +0300 Adrian Bunk <bunk at debian.org> wrote:
> Control: clone -1 -2
> Control: reassign -1 squeak-vm
> Control: reassign -2 squeak-plugins-scratch
> 
> On Sun, Aug 05, 2018 at 07:33:58PM +0200, Bernhard √úbelacker wrote:
> > Hello Wouter,
> > thanks for this additional information.
> > 
> > I could reproduce the issue with a usb webcam inside a buster amd64 VM.
> > Unfortunately this camera button was with the german translation not
> > visible with the small resolution of that VM.
> > 
> > It took a little time to get into the smalltalk side of things.
> > But I think I have found a problem - on the c side of the plugins.
> > 
> > 
> > 
> > (gdb) bt
> > #0  0x00007fffafa33c82 in convertImageRGB24toARGB32 (cam=0x7fffafa37180 <camInfo>) at ./unix/plugins/CameraPlugin/sqCamera-linux.c:333
> > #1  0x00007fffafa33f2a in convertImage (cam=0x7fffafa37180 <camInfo>) at ./unix/plugins/CameraPlugin/sqCamera-linux.c:412
> > #2  0x00007fffafa34d10 in CameraGetFrame (camNum=1, buf=0x7fffb2b9fcb4 "", pixelCount=76800) at ./unix/plugins/CameraPlugin/sqCamera-linux.c:836
> > #3  0x00007fffafa3352c in primGetFrame () at ./unix/src/plugins/CameraPlugin/CameraPlugin.c:160
> > #4  0x0000555555578ca4 in dispatchFunctionPointer (aFunctionPointer=0x7fffafa33461 <primGetFrame>) at ./build-tree/gnu-interp.c:3809
> > #5  0x00005555555769f8 in callExternalPrimitive (functionID=0x7fffafa33461 <primGetFrame>) at ./build-tree/gnu-interp.c:2512
> > #6  0x000055555558fc92 in primitiveExternalCall () at ./build-tree/gnu-interp.c:17732
> > #7  0x0000555555578ca4 in dispatchFunctionPointer (aFunctionPointer=0x55555558faf0 <primitiveExternalCall>) at ./build-tree/gnu-interp.c:3809
> > #8  0x000055555558227a in interpret () at ./build-tree/gnu-interp.c:9339
> > #9  0x00005555555a7cef in main (argc=8, argv=0x7fffffffe2a8, envp=0x7fffffffe2f0) at ./unix/vm/sqUnixMain.c:1458
> > 
> > (gdb) list convertImageRGB24toARGB32
> > 319     static void
> > 320     convertImageRGB24toARGB32 (camPtr cam)
> > 321     {
> > 322             unsigned char     *src = cam->inBuffer;
> > 323             unsigned long int *dst = cam->sqBuffer;           <-- sizeof(*dst) == 8, should be 4 ?
> > 324             unsigned long int pixelCount = cam->sqPixels;
> > 325             unsigned long int pixel;
> > 326             int i;
> > 327
> > 328             if (0 == dst) return;
> > 329
> > 330             for ( i = 0; i < pixelCount; i++) {
> > 331                     pixel = 0xFF000000 | (*src++ << 16);
> > 332                     pixel = pixel | (*src++ << 8);
> > 333                     *dst++  = pixel | *src++;
> > 334             }
> > 335     }
> > 
> > 
> > 
> > Here the buffer allocated in the squeak-vm is given to primGetFrame
> > and gets finally the image written to in convertImageRGB24toARGB32.
> > Unfortunately these conversion functions use "unsigned long int *dst",
> > with a long int having a size of 8 bytes at amd64, while we got
> > just 4 bytes per pixel reserved from squeak-vm, therefore
> > overrunning our reserved buffer.
> > 
> > 
> > When just installing the packages the plugin so.CameraPlugin gets
> > used from the package squeak-plugins-scratch.

I fixed that in the Camera Plugin last year and it is used in the current, OpenSmalltalk-VM/Cog-based Squeak as such:

https://github.com/OpenSmalltalk/opensmalltalk-vm/commit/203de239312943d2d8be86ecec306a6f9971f49e

I think this diff is independent of OpenSmalltalk VM and should work with the interpreter-based sources of Squeak VM 4.10 as used with this package and Scratch. 

Hope this helps.

Best regards
	-Tobias



More information about the pkg-sugar-devel mailing list