public inbox for cygwin-apps-cvs@sourceware.org
help / color / mirror / Atom feed
From: Mark Geisert <mgeisert@sourceware.org>
To: cygwin-apps-cvs@sourceware.org
Subject: [cygutils - Chuck Wilson's collection of Cygwin utilities] branch master, updated. v1_4_16-8-g936dce4
Date: Sat, 25 Sep 2021 05:51:12 +0000 (GMT)	[thread overview]
Message-ID: <20210925055112.B5C6F3858403@sourceware.org> (raw)




https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/cygutils.git;h=936dce44b5799e3fd6926b9faacd9046cf5f2aaa

commit 936dce44b5799e3fd6926b9faacd9046cf5f2aaa
Author: Mark Geisert <mark@maxrnd.com>
Date:   Fri Sep 24 22:50:44 2021 -0700

    Update to released 1.4.16-7 content

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/cygutils.git;h=de65716432a2d8f29834149191b0ed276b5cf6fc

commit de65716432a2d8f29834149191b0ed276b5cf6fc
Author: Mark Geisert <mark@maxrnd.com>
Date:   Fri Sep 24 22:47:04 2021 -0700

    Update to released 1.4.16-6 content

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/cygutils.git;h=a852972c1db68d41019acd1c2db35c165c63c78f

commit a852972c1db68d41019acd1c2db35c165c63c78f
Author: Mark Geisert <mark@maxrnd.com>
Date:   Fri Sep 24 22:42:24 2021 -0700

    Update to released 1.4.16-5 content

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/cygutils.git;h=f7c4555aa83a128efee00202765c59344b565184

commit f7c4555aa83a128efee00202765c59344b565184
Author: Mark Geisert <mark@maxrnd.com>
Date:   Fri Sep 24 22:37:55 2021 -0700

    Update to released 1.4.16-4 content

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/cygutils.git;h=49b00c580c21ebdd75f2c112a797755d74400f6d

commit 49b00c580c21ebdd75f2c112a797755d74400f6d
Author: Mark Geisert <mark@maxrnd.com>
Date:   Fri Sep 24 22:31:49 2021 -0700

    Update to released 1.4.16-3 content


Diff:
---
 ChangeLog                       |  34 +++++++++++
 NEWS                            |   3 +
 cygutils.cygport                |   2 +-
 src/clip/getclip.c              |  63 ++++++++++++++++----
 src/clip/putclip.c              | 125 ++++++++++++++++++++++++++++++++++++++--
 src/cygdrop/cygdrop.cc          |   6 +-
 src/readshortcut/readshortcut.c |   2 +-
 7 files changed, 216 insertions(+), 19 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c67ee00..921b9d0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,37 @@
+2021-09-23  Mark Geisert  <mark@maxrnd.com>  (1.4.16-7)
+
+	* src/readshortcut/readshortcut.c: Fix mbstowcs usage so no chance
+	of buffer overflow to be caught at runtime by ssp.  Thanks to Keith
+	Christian for the report.
+
+2021-08-28  Mark Geisert  <mark@maxrnd.com>  (1.4.16-6)
+
+	* src/clip/putclip.c: Supply terminator for Unicode input lacking it.
+	Add diagnostic for OpenClipboard() failure that results in "Couldn't
+	write CF_TEXT format to the clipboard" error message.  Thanks to
+	Takashi Yano for the reports.
+	* Makefile.am: src_clip_getclip_LDADD no longer needs -lkernel32.
+
+2021-08-24  Mark Geisert  <mark@maxrnd.com>  (1.4.16-5)
+
+	* src/clip/putclip.c: Fix broken Unicode support. Don't GlobalFree a
+	handle that's been transferred to the system by SetClipboardData().
+	Thanks to Christian Franke for that last bit.
+
+2021-08-15  Mark Geisert  <mark@maxrnd.com>  (1.4.16-4)
+
+	* Makefile.am: Add -lkernel32 to src_clip_getclip_LDADD.  This somehow
+	didn't make it into the released -3 package.  Thank you Takashi Yano.
+	* Fix maintainer build environment issues that caused cygstart crash
+	on non-AVX user systems: Thank you Takashi Yano, Brian Inglis, Achim
+	Gratz and user Jay Abel for reporting the issue.
+	* src/cygdrop/cygdrop.cc: Fix crash with recent gcc and fix printf
+	format strings. Thank you Christian Franke.
+
+2021-07-05  Mark Geisert  <mark@maxrnd.com>  (1.4.16-3)
+
+	* src/clip/getclip.c: Add Unicode support.
+
 2017-07-03  Mark Geisert  <mark@maxrnd.com>
 
 	Release 1.4.16
diff --git a/NEWS b/NEWS
index dbc9879..fcfab44 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@
   * Minor formatting fixes to quash compiler warnings.
   * Execute bits removed from files not needing them.
   * Temporarily rename /usr/lib/libpopt.la while building package.
+  * Unicode support added to getclip and putclip.
+  * Fix mbstowcs bug in readshortcut causing "buffer overflow detected" from
+    -fstack-protect at runtime.
 
 1.4.15
   New maintainer Mark Geisert <mark@maxrnd.com>.
diff --git a/cygutils.cygport b/cygutils.cygport
index cdbae68..d2ca1f5 100644
--- a/cygutils.cygport
+++ b/cygutils.cygport
@@ -1,6 +1,6 @@
 NAME=cygutils
 VERSION=1.4.16
-RELEASE=2
+RELEASE=7
 
 SUMM="A collection of simple utilities"
 DESC="A collection of simple (single source file) utilities, including"
diff --git a/src/clip/getclip.c b/src/clip/getclip.c
index 4ddbce3..82e7070 100644
--- a/src/clip/getclip.c
+++ b/src/clip/getclip.c
@@ -29,7 +29,11 @@
 #include "common.h"
 
 #include <io.h>
+#include <wchar.h>
 #include <sys/cygwin.h>
+#include <w32api/stringapiset.h>
+
+#define DEBUGGING 0 // Set 1 to display debug output on stderr
 
 typedef struct
 {
@@ -356,16 +360,31 @@ getclip (FILE * out, flags_struct flags, FILE * f, char *name)
     {
       const char *CYGWIN_NATIVE = "CYGWIN_NATIVE_CLIPBOARD";
       UINT cygnativeformat;
-      UINT formatlist[2];
+      UINT formatlist[3];
       UINT format;
 
       OpenClipboard (NULL);
+#if DEBUGGING
+      {
+        fprintf (stderr, "ThreadLocale: %u\nClipboardFormats:",
+                 GetThreadLocale ());
+        format = 0;
+        do {
+          format = EnumClipboardFormats (format);
+          fprintf (stderr, " %u", format);
+          if (format == CF_LOCALE)
+            fprintf (stderr, "(%u)", *(LCID *) GetClipboardData (CF_LOCALE));
+        } while (format != 0);
+        fprintf (stderr, "\n");
+      }
+#endif
       cygnativeformat = RegisterClipboardFormat (CYGWIN_NATIVE);
 
       formatlist[0] = cygnativeformat;
-      formatlist[1] = CF_TEXT;
+      formatlist[1] = CF_UNICODETEXT;
+      formatlist[2] = CF_TEXT;
 
-      if ((format = GetPriorityClipboardFormat (formatlist, 2)) <= 0)
+      if ((format = GetPriorityClipboardFormat (formatlist, 3)) <= 0)
         {
           CloseClipboard ();
           return (0);
@@ -380,25 +399,49 @@ getclip (FILE * out, flags_struct flags, FILE * f, char *name)
               cygcb_t *clipbuf = (cygcb_t *) GlobalLock (hglb);
               if (clipbuf)
                 {
-                  fwrite (clipbuf->data, sizeof (unsigned char), clipbuf->len, out);
+                  fwrite (clipbuf->data, sizeof (char), clipbuf->len, out);
                   GlobalUnlock (hglb);
                 }
 	    }
 	  else
 	    {
-              unsigned char *nativebuf = (unsigned char *) GlobalLock (hglb);
+              char *nativebuf = (char *) GlobalLock (hglb);
               if (nativebuf)
                 {
                   size_t buflen = (*(size_t *) nativebuf);
                   buf = nativebuf + sizeof (size_t);
                   len = buflen;
 
-                  fwrite (buf, sizeof (unsigned char), len, out);
+                  fwrite (buf, sizeof (char), len, out);
                   GlobalUnlock (hglb);
                 }
 	    }
         }
-      else
+      else if (format == CF_UNICODETEXT)
+        {
+          LPWSTR lpwstr = (LPWSTR) GlobalLock (hglb);
+          if (lpwstr)
+            {
+              int srclen = wcslen (lpwstr); // wide-char count
+              int dstlen = srclen << 2; // byte count
+              LPSTR dst = (LPSTR) malloc (dstlen);
+              int res = WideCharToMultiByte (CP_UTF8, 0, lpwstr, srclen,
+                                             dst, dstlen, NULL, NULL);
+              if (res > 0)
+                fwrite (dst, sizeof (char), res, out);
+              else if (res == 0)
+                {
+#if DEBUGGING
+                  DWORD err = GetLastError ();
+                  /* look up error code displayed here in w32api/winerror.h */
+                  fprintf (stderr, "WideCharToMultiByte returns %ld\n", err);
+#endif
+                }
+              free (dst);
+              GlobalUnlock (hglb);
+            }
+        }
+      else /* format == CF_TEXT */
         {
           LPSTR lpstr = (LPSTR) GlobalLock (hglb);
           if (lpstr)
@@ -407,7 +450,7 @@ getclip (FILE * out, flags_struct flags, FILE * f, char *name)
               buf = lpstr;
               len = lplen;
 
-              fwrite (buf, sizeof (unsigned char), len, out);
+              fwrite (buf, sizeof (char), len, out);
               GlobalUnlock (hglb);
             }
         }
@@ -425,7 +468,7 @@ getclip (FILE * out, flags_struct flags, FILE * f, char *name)
       char *pos;
 
       OpenClipboard (0);
-      hglb = GetClipboardData (CF_TEXT);
+      hglb = GetClipboardData (CF_TEXT); //TODO support CF_UNICODETEXT too?
       lpstr = GlobalLock (hglb);
       lplen = strlen (lpstr);
 
@@ -481,7 +524,7 @@ getclip (FILE * out, flags_struct flags, FILE * f, char *name)
       char *pos;
 
       OpenClipboard (0);
-      hglb = GetClipboardData (CF_TEXT);
+      hglb = GetClipboardData (CF_TEXT); //TODO support CF_UNICODETEXT too?
       lpstr = GlobalLock (hglb);
       lplen = strlen (lpstr);
 
diff --git a/src/clip/putclip.c b/src/clip/putclip.c
index 24aefdf..76bddeb 100644
--- a/src/clip/putclip.c
+++ b/src/clip/putclip.c
@@ -25,10 +25,15 @@
 #if HAVE_CONFIG_H
 # include "config.h"
 #endif
-#include <io.h>
 
 #include "common.h"
+
+#include <io.h>
+#include <wchar.h>
 #include <sys/cygwin.h>
+#include <w32api/stringapiset.h>
+
+#define DEBUGGING 0 // Set 1 to display debug output on stderr
 
 typedef struct
 {
@@ -396,7 +401,16 @@ putclip (FILE * in, flags_struct flags, FILE * f, char *name)
       const char *CYGWIN_NATIVE = "CYGWIN_NATIVE_CLIPBOARD";
       UINT cygnativeformat;
 
-      OpenClipboard (0);
+      if (!OpenClipboard (0))
+        {
+          fprintf (stderr, "Unable to open the clipboard\n");
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "OpenClipboard returns %ld\n", err);
+#endif
+          return (PUTCLIP_ERR);
+        }
       cygnativeformat = RegisterClipboardFormat (CYGWIN_NATIVE);
       CloseClipboard ();
 
@@ -515,7 +529,18 @@ putclip (FILE * in, flags_struct flags, FILE * f, char *name)
 
       /* Allocate memory and copy the string to it */
       /* cygwin native format */
-      OpenClipboard (0);
+      if (!OpenClipboard (0))
+        {
+          fprintf (stderr, "Unable to open the clipboard\n");
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "OpenClipboard returns %ld\n", err);
+#endif
+          if (convbuf)
+            free (convbuf);
+          return (PUTCLIP_ERR);
+        }
       if (cygNewFormat)
 	hData = GlobalAlloc (GMEM_MOVEABLE, convlen + sizeof (cygcb_t));
       else
@@ -554,10 +579,84 @@ putclip (FILE * in, flags_struct flags, FILE * f, char *name)
           fprintf (f,
                    "Couldn't write native format to the clipboard %04x %x\n",
                    cygnativeformat, hData);
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "SetClipboardData returns %ld\n", err);
+#endif
+          free (convbuf);
+          return (PUTCLIP_ERR);
+        }
+      CloseClipboard ();
+#if 0 // Per MSDN, don't GlobalFree a handle successfully transferred to system
+      if (GlobalFree (hData))
+        {
+          fprintf (f,
+                   "Couldn't free global buffer after write to clipboard.\n");
+          free (convbuf);
+          return (PUTCLIP_ERR);
+        }
+#endif
+      hData = NULL;
+      clipbuf = NULL;
+
+      /* CF_UNICODETEXT format */
+      if (!OpenClipboard (0))
+        {
+          fprintf (f, "Unable to open the clipboard\n");
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "OpenClipboard returns %ld\n", err);
+#endif
+          free (convbuf);
+          return (PUTCLIP_ERR);
+        }
+      if (!(hData = GlobalAlloc (GMEM_MOVEABLE, sizeof (WCHAR) * convlen + 2)))
+        {
+          fprintf (f, "Couldn't allocate global buffer for write.\n");
+          free (convbuf);
+          return (PUTCLIP_ERR);
+        }
+      if (!(clipbuf = (void *) GlobalLock (hData)))
+        {
+          fprintf (f, "Couldn't lock global buffer.\n");
+          free (convbuf);
+          return (PUTCLIP_ERR);
+        }
+
+      int res = MultiByteToWideChar (CP_UTF8, 0, convbuf, convlen,
+                                     (LPWSTR) clipbuf, convlen + 1);
+      if (res == 0)
+        {
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "MultiByteToWideChar returns %ld\n", err);
+#endif
+        }
+      else /* res != 0 */
+        {
+          *((WCHAR *) clipbuf + res) = 0; /* NULL-terminate just in case */
+#if DEBUGGING
+          fprintf (stderr, "len %d, convlen %d, res %d\n", len, convlen, res);
+#endif
+        }
+
+      GlobalUnlock (hData);
+      if (!SetClipboardData (CF_UNICODETEXT, hData))
+        {
+          fprintf (f, "Couldn't write CF_UNICODETEXT format to the clipboard.\n");
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "SetClipboardData returns %ld\n", err);
+#endif
           free (convbuf);
           return (PUTCLIP_ERR);
         }
       CloseClipboard ();
+#if 0 // Per MSDN, don't GlobalFree a handle successfully transferred to system
       if (GlobalFree (hData))
         {
           fprintf (f,
@@ -565,11 +664,22 @@ putclip (FILE * in, flags_struct flags, FILE * f, char *name)
           free (convbuf);
           return (PUTCLIP_ERR);
         }
+#endif
       hData = NULL;
       clipbuf = NULL;
 
       /* CF_TEXT format */
-      OpenClipboard (0);
+      if (!OpenClipboard (0))
+        {
+          fprintf (f, "Unable to open the clipboard\n");
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "OpenClipboard returns %ld\n", err);
+#endif
+          free (convbuf);
+          return (PUTCLIP_ERR);
+        }
       if (!(hData = GlobalAlloc (GMEM_MOVEABLE, convlen + 2)))
         {
           fprintf (f, "Couldn't allocate global buffer for write.\n");
@@ -591,10 +701,16 @@ putclip (FILE * in, flags_struct flags, FILE * f, char *name)
       if (!SetClipboardData (CF_TEXT, hData))
         {
           fprintf (f, "Couldn't write CF_TEXT format to the clipboard.\n");
+#if DEBUGGING
+          DWORD err = GetLastError ();
+          /* look up error code displayed here in w32api/winerror.h */
+          fprintf (stderr, "SetClipboardData returns %ld\n", err);
+#endif
           free (convbuf);
           return (PUTCLIP_ERR);
         }
       CloseClipboard ();
+#if 0 // Per MSDN, don't GlobalFree a handle successfully transferred to system
       if (GlobalFree (hData))
         {
           fprintf (f,
@@ -602,6 +718,7 @@ putclip (FILE * in, flags_struct flags, FILE * f, char *name)
           free (convbuf);
           return (PUTCLIP_ERR);
         }
+#endif
       hData = NULL;
       clipbuf = NULL;
 
diff --git a/src/cygdrop/cygdrop.cc b/src/cygdrop/cygdrop.cc
index 35bcc19..0c036bb 100644
--- a/src/cygdrop/cygdrop.cc
+++ b/src/cygdrop/cygdrop.cc
@@ -39,7 +39,7 @@ static void help (FILE * f, const char *name);
 static void version (FILE * f, const char *name);
 static void license (FILE * f, const char *name);
 
-static int
+static void
 usageCore (FILE * f, const char * name)
 {
   fprintf (f,
@@ -378,7 +378,7 @@ main (int argc, char **argv)
 	     ? " [logon_id]"  : ""));
 	  const struct group * g = strsid_to_group (strsid);
 	  if (g)
-	    printf (" gid=%lu(%s)", g->gr_gid, g->gr_name);
+	    printf (" gid=%u(%s)", (unsigned) g->gr_gid, g->gr_name);
 	  printf ("\n");
 	}
 
@@ -415,7 +415,7 @@ main (int argc, char **argv)
 	printf ("r   %s", strsid);
 	const struct group * g = strsid_to_group (strsid);
 	if (g)
-	  printf (" gid=%lu(%s)", g->gr_gid, g->gr_name);
+	  printf (" gid=%u(%s)", (unsigned) g->gr_gid, g->gr_name);
 	printf ("\n");
       }
 
diff --git a/src/readshortcut/readshortcut.c b/src/readshortcut/readshortcut.c
index 9912985..d19bef0 100644
--- a/src/readshortcut/readshortcut.c
+++ b/src/readshortcut/readshortcut.c
@@ -373,7 +373,7 @@ readshortcut (optvals * opts)
       WCHAR ws[BUFF_SIZE];
 
       /* Ensure that the string is Unicode. */
-      mbstowcs (wsz, opts->target_fname, sizeof wsz);
+      mbstowcs (wsz, opts->target_fname, MAX_PATH);
 
       /* Load the shortcut.  */
       hres = persist_file->lpVtbl->Load (persist_file, wsz, STGM_READ);



                 reply	other threads:[~2021-09-25  5:51 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210925055112.B5C6F3858403@sourceware.org \
    --to=mgeisert@sourceware.org \
    --cc=cygwin-apps-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).