From d47b431750f545a2066e6d4a07e69b5088a7396f Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Tue, 3 May 2016 14:28:45 +0000 Subject: Fix potential memory leak under X11 when pasted image is not accepted by the receiving app. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11709 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- src/Fl_x.cxx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 92b9be5fc..64980ca11 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -1365,9 +1365,9 @@ fprintf(stderr,"\n");*/ sn_buffer[bytesread] = 0; convert_crlf(sn_buffer, bytesread); } + if (!fl_selection_requestor) return 0; if (Fl::e_clipboard_type == Fl::clipboard_image) { if (bytesread == 0) return 0; - Fl_Image *image = 0; static char tmp_fname[21]; static Fl_Shared_Image *shared = 0; strcpy(tmp_fname, "/tmp/clipboardXXXXXX"); @@ -1383,18 +1383,23 @@ fprintf(stderr,"\n");*/ shared = Fl_Shared_Image::get(tmp_fname); unlink(tmp_fname); if (!shared) return 0; - image = shared->copy(); + uchar *rgb = new uchar[shared->w() * shared->h() * shared->d()]; + memcpy(rgb, shared->data()[0], shared->w() * shared->h() * shared->d()); + Fl_RGB_Image *image = new Fl_RGB_Image(rgb, shared->w(), shared->h(), shared->d()); shared->release(); + image->alloc_array = 1; Fl::e_clipboard_data = (void*)image; } - if (!fl_selection_requestor) return 0; - - if (Fl::e_clipboard_type == Fl::clipboard_plain_text) { + else if (Fl::e_clipboard_type == Fl::clipboard_plain_text) { Fl::e_text = sn_buffer ? (char*)sn_buffer : (char *)""; Fl::e_length = bytesread; } int old_event = Fl::e_number; - fl_selection_requestor->handle(Fl::e_number = FL_PASTE); + int retval = fl_selection_requestor->handle(Fl::e_number = FL_PASTE); + if (!retval && Fl::e_clipboard_type == Fl::clipboard_image) { + delete (Fl_RGB_Image*)Fl::e_clipboard_data; + Fl::e_clipboard_data= NULL; + } Fl::e_number = old_event; // Detect if this paste is due to Xdnd by the property name (I use // XA_SECONDARY for that) and send an XdndFinished message. It is not -- cgit v1.2.3