Mostly we will catch socket errors when processing incoming data, but
sometimes we'll time it so that a write will be the initial offender. Make
sure these cases are also properly caught and dealt with.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4583 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
index 267c6f6..865143a 100644
--- a/vncviewer/Viewport.cxx
+++ b/vncviewer/Viewport.cxx
@@ -327,7 +327,13 @@
assert(ret < (Fl::event_length() + 1));
vlog.debug("Sending clipboard data: '%s'", buffer);
- cc->writer()->clientCutText(buffer, ret);
+
+ try {
+ cc->writer()->clientCutText(buffer, ret);
+ } catch (rdr::Exception& e) {
+ vlog.error(e.str());
+ exit_vncviewer(e.str());
+ }
delete [] buffer;
@@ -455,7 +461,12 @@
{
if (!viewOnly) {
if (pointerEventInterval == 0 || buttonMask != lastButtonMask) {
- cc->writer()->pointerEvent(pos, buttonMask);
+ try {
+ cc->writer()->pointerEvent(pos, buttonMask);
+ } catch (rdr::Exception& e) {
+ vlog.error(e.str());
+ exit_vncviewer(e.str());
+ }
} else {
if (!Fl::has_timeout(handlePointerTimeout, this))
Fl::add_timeout((double)pointerEventInterval/1000.0,
@@ -473,7 +484,12 @@
assert(self);
- self->cc->writer()->pointerEvent(self->lastPointerPos, self->lastButtonMask);
+ try {
+ self->cc->writer()->pointerEvent(self->lastPointerPos, self->lastButtonMask);
+ } catch (rdr::Exception& e) {
+ vlog.error(e.str());
+ exit_vncviewer(e.str());
+ }
}
@@ -683,7 +699,12 @@
vlog.debug("Key released: 0x%04x => 0x%04x", origKeyCode, iter->second);
- cc->writer()->keyEvent(iter->second, false);
+ try {
+ cc->writer()->keyEvent(iter->second, false);
+ } catch (rdr::Exception& e) {
+ vlog.error(e.str());
+ exit_vncviewer(e.str());
+ }
downKeySym.erase(iter);
@@ -698,7 +719,13 @@
origKeyCode, keyCode, keyText, keySym);
downKeySym[origKeyCode] = keySym;
- cc->writer()->keyEvent(keySym, down);
+
+ try {
+ cc->writer()->keyEvent(keySym, down);
+ } catch (rdr::Exception& e) {
+ vlog.error(e.str());
+ exit_vncviewer(e.str());
+ }
}