]> source.dussan.org Git - tigervnc.git/commitdiff
Protect key variables from setjmp()
authorPierre Ossman <ossman@cendio.se>
Wed, 4 Jan 2023 15:29:38 +0000 (16:29 +0100)
committerPierre Ossman <ossman@cendio.se>
Thu, 5 Jan 2023 15:43:34 +0000 (16:43 +0100)
If we don't mark these as volatile then they might get reset on
longjmp() and the code will misbehave.

common/rfb/JpegCompressor.cxx
common/rfb/JpegDecompressor.cxx

index 24a62a865d42d3cf7b3c8409157a316c0df06475..efb26a775fd05e9d71d42ba4837bb28293bed6a4 100644 (file)
@@ -155,15 +155,16 @@ JpegCompressor::~JpegCompressor(void)
   delete cinfo;
 }
 
-void JpegCompressor::compress(const rdr::U8 *buf, int stride, const Rect& r,
-  const PixelFormat& pf, int quality, int subsamp)
+void JpegCompressor::compress(const rdr::U8 *buf, volatile int stride,
+                              const Rect& r, const PixelFormat& pf,
+                              int quality, int subsamp)
 {
   int w = r.width();
   int h = r.height();
   int pixelsize;
-  rdr::U8 *srcBuf = NULL;
-  bool srcBufIsTemp = false;
-  JSAMPROW *rowPointer = NULL;
+  rdr::U8 * volatile srcBuf = NULL;
+  volatile bool srcBufIsTemp = false;
+  JSAMPROW * volatile rowPointer = NULL;
 
   if(setjmp(err->jmpBuffer)) {
     // this will execute if libjpeg has an error
index b879ae327dca568c86fa0c6d821c4ccf83806749..ea148b94af0d8dc074ed036a5411fb788312e2e2 100644 (file)
@@ -150,16 +150,18 @@ JpegDecompressor::~JpegDecompressor(void)
   delete dinfo;
 }
 
-void JpegDecompressor::decompress(const rdr::U8 *jpegBuf, int jpegBufLen,
-  rdr::U8 *buf, int stride, const Rect& r, const PixelFormat& pf)
+void JpegDecompressor::decompress(const rdr::U8 *jpegBuf,
+                                  int jpegBufLen, rdr::U8 *buf,
+                                  volatile int stride,
+                                  const Rect& r, const PixelFormat& pf)
 {
   int w = r.width();
   int h = r.height();
   int pixelsize;
   int dstBufStride;
-  rdr::U8 *dstBuf = NULL;
-  bool dstBufIsTemp = false;
-  JSAMPROW *rowPointer = NULL;
+  rdr::U8 * volatile dstBuf = NULL;
+  volatile bool dstBufIsTemp = false;
+  JSAMPROW * volatile rowPointer = NULL;
 
   if(setjmp(err->jmpBuffer)) {
     // this will execute if libjpeg has an error