From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: =?UTF-8?Q?=C3=93scar?= Fuentes Newsgroups: gmane.emacs.bugs Subject: bug#10733: 24.0.93; w32 file truncation Date: Tue, 07 Feb 2012 00:27:07 +0100 Message-ID: <87fwen4k6s.fsf@wanadoo.es> References: <20120205.143400.416428493.Takaaki.Ota@am.sony.com> <20120205.161623.484163522.Takaaki.Ota@am.sony.com> <83zkcwbo7t.fsf@gnu.org> <874nv45y9f.fsf@wanadoo.es> <87zkcw3pjf.fsf@wanadoo.es> <83vcnjc1yj.fsf@gnu.org> <87r4y74zew.fsf@wanadoo.es> <83sjinbyez.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1328570958 18041 80.91.229.3 (6 Feb 2012 23:29:18 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 6 Feb 2012 23:29:18 +0000 (UTC) Cc: lekktu@gmail.com, Takaaki.Ota@am.sony.com, 10733@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Feb 07 00:29:17 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RuXzo-0007lX-83 for geb-bug-gnu-emacs@m.gmane.org; Tue, 07 Feb 2012 00:29:16 +0100 Original-Received: from localhost ([::1]:34156 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RuXzn-0004Be-D4 for geb-bug-gnu-emacs@m.gmane.org; Mon, 06 Feb 2012 18:29:15 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:34349) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RuXzl-0004BW-0e for bug-gnu-emacs@gnu.org; Mon, 06 Feb 2012 18:29:13 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RuXzh-00031I-U5 for bug-gnu-emacs@gnu.org; Mon, 06 Feb 2012 18:29:12 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:54145) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RuXzh-00031A-RC for bug-gnu-emacs@gnu.org; Mon, 06 Feb 2012 18:29:09 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1RuY0Y-0004wN-1U for bug-gnu-emacs@gnu.org; Mon, 06 Feb 2012 18:30:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: =?UTF-8?Q?=C3=93scar?= Fuentes Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 06 Feb 2012 23:30:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 10733 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 10733-submit@debbugs.gnu.org id=B10733.132857094618906 (code B ref 10733); Mon, 06 Feb 2012 23:30:01 +0000 Original-Received: (at 10733) by debbugs.gnu.org; 6 Feb 2012 23:29:06 +0000 Original-Received: from localhost ([127.0.0.1]:57768 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1RuXze-0004ut-1S for submit@debbugs.gnu.org; Mon, 06 Feb 2012 18:29:06 -0500 Original-Received: from impaqm4.telefonica.net ([213.4.138.20]:4335 helo=telefonica.net) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1RuXza-0004uQ-3a for 10733@debbugs.gnu.org; Mon, 06 Feb 2012 18:29:05 -0500 Original-Received: from IMPmailhost4.adm.correo ([10.20.102.125]) by IMPaqm4.telefonica.net with bizsmtp id WnDK1i00o2iL0W23QnT9ZS; Tue, 07 Feb 2012 00:27:09 +0100 Original-Received: from qcore ([88.11.106.32]) by IMPmailhost4.adm.correo with BIZ IMP id WnT71i00K0hxhHC1knT8LJ; Tue, 07 Feb 2012 00:27:09 +0100 X-Brightmail-Tracker: AAAAAA== X-original-sender: 981711563@telefonica.net In-Reply-To: <83sjinbyez.fsf@gnu.org> (Eli Zaretskii's message of "Mon, 06 Feb 2012 20:37:56 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:56605 Archived-At: Eli Zaretskii writes: [snip] > No. The `stat' Emacs uses is in w32.c. What you see on > lib-src/ntlib.c is just a minimal subset of what we have in w32.c. That's important. Thanks. >> Symlinks are detected and handled specially on MSVCRT's stat. In >> aessence, for symlinks it uses fstat. > > But fstat probably calls GetFileInformationByHandle under the hood, > and we already call that function in w32.c:stat. So maybe the fix is > not as ugly and inelegant as you thought. Yup. This patch fixes the problem: diff --git a/src/w32.c b/src/w32.c index f610a36..035e1f2 100644 --- a/src/w32.c +++ b/src/w32.c @@ -3444,6 +3444,29 @@ stat (const char * path, struct stat * buf) } } + buf->st_size = 0; + + if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) && + (wfd.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) + { + HANDLE fh; + BY_HANDLE_FILE_INFORMATION info; + + if ((fh = CreateFile (name, 0, 0, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL)) + && GetFileInformationByHandle (fh, &info)) + { + buf->st_size = info.nFileSizeHigh; + buf->st_size <<= 32; + buf->st_size += info.nFileSizeLow; + } + else + { + errno = ENOENT; + return -1; + } + } + if (!(NILP (Vw32_get_true_file_attributes) || (EQ (Vw32_get_true_file_attributes, Qlocal) && is_slow_fs (name))) /* No access rights required to get info. */ @@ -3532,9 +3555,12 @@ stat (const char * path, struct stat * buf) buf->st_dev = volume_info.serialnum; buf->st_rdev = volume_info.serialnum; - buf->st_size = wfd.nFileSizeHigh; - buf->st_size <<= 32; - buf->st_size += wfd.nFileSizeLow; + if (! buf->st_size) + { + buf->st_size = wfd.nFileSizeHigh; + buf->st_size <<= 32; + buf->st_size += wfd.nFileSizeLow; + } /* Convert timestamps to Unix format. */ buf->st_mtime = convert_time (wfd.ftLastWriteTime); Maybe it can be integrated in the if (!(NILP(Vw32_get_true_file_attributes) ... hence reusing the calls to CreateFile and GetFileInformationByHandle and shortening the patch, but as I don't know what Vw32_get_true_file_attributes does, preferread to follow the safe way. However, we still have another implementation on ntlib.c. And the fix is just for the size. Don't know if there are other attributes suffer from the same problem. Possibly the right thing is to do what MSVCRT does: if is-symlink? use fstat fi