delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2012/06/29/05:48:04

X-Recipient: archive-cygwin AT delorie DOT com
X-SWARE-Spam-Status: No, hits=-3.4 required=5.0 tests=BAYES_00,KHOP_THREADED
X-Spam-Check-By: sourceware.org
Message-ID: <4FED79A6.6050401@towo.net>
Date: Fri, 29 Jun 2012 11:47:18 +0200
From: Thomas Wolff <towo AT towo DOT net>
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20120428 Thunderbird/12.0.1
MIME-Version: 1.0
To: cygwin AT cygwin DOT com
Subject: Re: /dev/clipboard corrupted
References: <1286377403 DOT 634959 DOT 1340961856516 DOT JavaMail DOT open-xchange AT email DOT 1und1 DOT de>
In-Reply-To: <1286377403.634959.1340961856516.JavaMail.open-xchange@email.1und1.de>
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

--------------070005060406010206040403
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

On 29.06.2012 11:24, Corinna Vinschen wrote:
> On Jun 28 20:33, Thomas Wolff wrote:
>> Am 28.06.2012 10:20, schrieb Corinna Vinschen:
>>> On Jun 28 00:16, Thomas Wolff wrote:
>>>> If the clipboard contains large data, the contents retrieved from
>>>> /dev/clipboard gets corrupted.
>>>> I compared the following in a few cases:
>>>> * cat /dev/clipboard or cp /dev/clipboard (which are equal)
>>>> * mouse-paste into mintty, read with cat
>>>> * read /dev/clipboard within application
>>>>
>>>> and I found all three results to be different, the correct one
>>>> sometimes being cat /dev/clipboard but not always.
>>>> In today's case, the differences occured at byte 10240 and 65536
>>>> respectively, thus 10K-1 bytes or 64K-1 bytes being equal.
>>> I can't reprocude this.  There's also nothing in the /dev/clipboard
>>> code which would rely on a 10K buffer or so.  64K, yes.  But still,
>>> I tried with wordpad, vi, mintty, cat, and cp with a text file of
>>> about 90K.  No problems.  Do you have any reproducible testcase?
>> Not really reproducible (maybe later) but some more observations.
>> I made a small test program to read /dev/clipboard directly with
>> different buffer sizes.
> You know, we just love STCs.  Send you small test program here, plus a
> short instruction how you created the clipboard content and how to call
> the testcase to see the problem.
Sure, so here it is. Open clipboard.txt with notepad, ^A^C to copy all, 
then run the program to see bytes skipped.
Actually it seems to skip as many bytes per read() as there were 
additional UTF-8 bytes (more bytes than characters) in the preceding 
read block.
Checking the code again, variable pos seems to be used both as an index 
into the clipboard (WCHAR) and an offset to the resulting string length 
(char) which would explain the effect (not having checked all the 
details though as I'm not familiar with the used APIs).
------
Thomas

--------------070005060406010206040403
Content-Type: text/plain; charset=UTF-8;
 name="clipboard.txt"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
 filename="clipboard.txt"

Scoloplos ist euryök. Er ist in der gesamten borealen Region in fast 
allen marinen Sedimenten zu finden, die einen sandigen Anteil aufweisen.
Man findet ihn von Grönland bis zum Mittelmeer, in der Nordsee, an der 
kanadischen Küste und im Weißen Meer (Markelova 1981).
Er besiedelt sowohl das «Eulitoral» als auch das „Bathyal“.

--------------070005060406010206040403
Content-Type: text/plain; charset=windows-1252;
 name="rcb.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="rcb.c"

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int
main (int argc, char * * argv)
{
	char * fn = "/dev/clipboard";
	int fd = open (fn, O_RDONLY | O_BINARY, 0);
	if (fd < 0) {
		exit (fd);
	}

	int out_tty = isatty (1);

	int filebuflen = 100;
	argc --;
	if (argc > 0) {
		int ret = sscanf (argv [1], "%d", & filebuflen);
	}
	fprintf (stderr, "filebuflen %d\n", filebuflen);
	char * filebuf = malloc (filebuflen + 1);

	int n;
	do {
		n = read (fd, filebuf, filebuflen);
		if (out_tty) {
			filebuf [n] = 0;
			printf ("read %d bytes: <%s>\n", n, filebuf);
		} else {
			fprintf (stderr, "read %d bytes\n", n);
			write (1, filebuf, n);
		}
	} while (n > 0);

	close (fd);
}


--------------070005060406010206040403
Content-Type: text/plain; charset=us-ascii

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
--------------070005060406010206040403--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019