gpa: Add patches to fix card key generation.
[gpg4win.git] / patches / gpa-0.9.4 / 04-utf-clip-crash.patch
1 #! /bin/sh
2 patch -p1 -l -f $* < $0
3 exit $?
4
5
6 From d3f20e7883f2fb9e52e487fd516bdc7b9bc695ed Mon Sep 17 00:00:00 2001
7 From: Werner Koch <wk@gnupg.org>
8 Date: Fri, 16 Aug 2013 15:18:57 +0200
9 Subject: [PATCH] w32: Fix crash due to bad conversions of utf-8 in the
10  clipboard.
11
12 * src/gpgmetools.c (dos_to_unix): Remove.  Remove all calls.
13 (dump_data_to_clipboard): Return an error code instead of calling
14 exit.
15 * src/gpaexportclipop.c
16 (gpa_export_clipboard_operation_complete_export): Print success
17 message only on success.
18 --
19
20 The removal of dos_to_unix is possible due to the patch
21 https://bugzilla.gnome.org/show_bug.cgi?id=649390 which will go into
22 the next Gtk+ 2.24 version.dos_to_unix was anyway not correct because
23 it scanned for an embedded nul but it is not guaranteed that it is
24 always called with one.
25
26 The other patch which will be helpful is:
27 https://bugzilla.gnome.org/show_bug.cgi?id=696232
28 (g_utf8_to_utf16() is not guaranteed to succeed. Check the error and
29  return if it failed.)
30
31 Gpg4win uses both patches.
32
33 GnuPG-bug-id: 1525
34 ---
35  src/clipboard.c       |   12 ------------
36  src/gpaexportclipop.c |    8 ++++----
37  src/gpgmetools.c      |   43 +++++++------------------------------------
38  src/gpgmetools.h      |    5 -----
39  4 files changed, 11 insertions(+), 57 deletions(-)
40
41 diff --git a/src/clipboard.c b/src/clipboard.c
42 index 682bd34..01b6058 100644
43 --- a/src/clipboard.c
44 +++ b/src/clipboard.c
45 @@ -283,10 +283,6 @@ file_created_cb (GpaFileOperation *op, gpa_file_item_t item, gpointer data)
46                         NULL, &len, NULL);
47        if (str)
48          {
49 -#ifdef G_OS_WIN32
50 -          dos_to_unix (str, &item->direct_out_len);
51 -#endif
52 -
53            gtk_text_buffer_set_text (clipboard->text_buffer, str, len);
54            g_free (str);
55            return;
56 @@ -296,10 +292,6 @@ file_created_cb (GpaFileOperation *op, gpa_file_item_t item, gpointer data)
57        /* Enough warnings: Try to show even with invalid encoding.  */
58      }
59
60 -#ifdef G_OS_WIN32
61 -  dos_to_unix (item->direct_out, &item->direct_out_len);
62 -#endif
63 -
64    gtk_text_buffer_set_text (clipboard->text_buffer,
65                             item->direct_out, item->direct_out_len);
66  }
67 @@ -481,10 +473,6 @@ file_open (GtkAction *action, gpointer param)
68        return;
69      }
70
71 -#ifdef G_OS_WIN32
72 -  dos_to_unix (contents, &length);
73 -#endif
74 -
75    gtk_text_buffer_set_text (clipboard->text_buffer, contents, length);
76    g_free (contents);
77  }
78 diff --git a/src/gpaexportclipop.c b/src/gpaexportclipop.c
79 index 0ce88af..62edb12 100644
80 --- a/src/gpaexportclipop.c
81 +++ b/src/gpaexportclipop.c
82 @@ -134,10 +134,10 @@ static void
83  gpa_export_clipboard_operation_complete_export (GpaExportOperation *operation)
84  {
85    GpaExportClipboardOperation *op = GPA_EXPORT_CLIPBOARD_OPERATION (operation);
86 -  dump_data_to_clipboard (operation->dest, gtk_clipboard_get
87 -                         (GDK_SELECTION_CLIPBOARD));
88 -  gpa_window_message (_("The keys have been copied to the clipboard."),
89 -                     GPA_OPERATION (op)->window);
90 +  if (!dump_data_to_clipboard (operation->dest, gtk_clipboard_get
91 +                               (GDK_SELECTION_CLIPBOARD)))
92 +    gpa_window_message (_("The keys have been copied to the clipboard."),
93 +                        GPA_OPERATION (op)->window);
94  }
95
96  /* API */
97 diff --git a/src/gpgmetools.c b/src/gpgmetools.c
98 index 2b4be56..63f6b8d 100644
99 --- a/src/gpgmetools.c
100 +++ b/src/gpgmetools.c
101 @@ -294,37 +294,12 @@ gpa_gpgme_data_new_from_file (gpgme_data_t *data,
102  }
103
104
105 -#ifdef G_OS_WIN32
106 -/* Convert newlines.  */
107 -void
108 -dos_to_unix (gchar *str, gsize *len)
109 -{
110 -  /* On Windows 2000, we need to convert \r\n to \n in the output for
111 -     cut & paste to work properly (otherwise, extra newlines will be
112 -     inserted).  */
113 -  gchar *src;
114 -  gchar *dst;
115 -
116 -  src = str;
117 -  dst = str;
118 -  while (*src)
119 -    {
120 -      if (src[0] == '\r' && src[1] == '\n')
121 -       src++;
122 -      *(dst++) = *(src++);
123 -    }
124 -  *dst = '\0';
125 -  *len = dst - str;
126 -}
127 -#endif
128 -
129 -
130  /* Write the contents of the gpgme_data_t into the clipboard.  Assumes
131 -   that the data is ASCII.  */
132 -void
133 +   that the data is ASCII.  Return 0 on success.  */
134 +int
135  dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard)
136  {
137 -  char buffer[128];
138 +  char buffer[512];
139    int nread;
140    gchar *text = NULL;
141    size_t len = 0;
142 @@ -333,27 +308,23 @@ dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard)
143    if (nread == -1)
144      {
145        gpa_window_error (strerror (errno), NULL);
146 -      exit (EXIT_FAILURE);
147 +      return -1;
148      }
149    while ((nread = gpgme_data_read (data, buffer, sizeof (buffer))) > 0)
150      {
151 -      text = g_realloc (text, len + nread);
152 +      text = g_realloc (text, len + nread + 1);
153        strncpy (text + len, buffer, nread);
154        len += nread;
155      }
156    if (nread == -1)
157      {
158        gpa_window_error (strerror (errno), NULL);
159 -      exit (EXIT_FAILURE);
160 +      return -1;
161      }
162
163 -#ifdef G_OS_WIN32
164 -  dos_to_unix (text, &len);
165 -#endif
166 -
167    gtk_clipboard_set_text (clipboard, text, (int)len);
168    g_free (text);
169 -  return;
170 +  return 0;
171  }
172
173
174 --- a/src/gpgmetools.h 2013-08-16 16:12:46.648003898 +0200
175 +++ b/src/gpgmetools.h 2013-08-16 16:13:14.836003193 +0200
176 @@ -112,13 +112,8 @@
177  int gpa_open_input (const char *filename, gpgme_data_t *data,
178                     GtkWidget *parent);
179
180 -#ifdef G_OS_WIN32
181 -/* Convert newlines.  */
182 -void dos_to_unix (gchar *str, gsize *len);
183 -#endif
184 -
185  /* Write the contents of the gpgme_data_t into the clipboard.  */
186 -void dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard);
187 +int dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard);
188
189  /* Begin generation of a key with the given parameters.  It prepares
190     the parameters required by Gpgme and returns whatever