summaryrefslogtreecommitdiffstats
path: root/source/a/cups/cups.fix_broken_locking.diff
blob: 44f97533f517b8c979a3c26f2b3359962f3d447d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
Submitted By: DJ Lucas <robert AT linuxfromscratch DOT org>
Date: 2010-09-13
Initial Package Version: 1.4.4
Upstream Status: Unknown
Origin: https://bugzilla.redhat.com/show_bug.cgi?id=553834
Description: Bug fix for invalid locking with GCrypt.

diff -Naurp cups-1.4.4-orig/cups/http.c cups-1.4.4/cups/http.c
--- cups-1.4.4-orig/cups/http.c	2010-06-16 00:27:41.000000000 -0500
+++ cups-1.4.4/cups/http.c	2010-09-13 01:27:03.000000000 -0500
@@ -83,12 +83,10 @@
  *   http_debug_hex()     - Do a hex dump of a buffer.
  *   http_field()         - Return the field index for a field name.
  *   http_read_ssl()      - Read from a SSL/TLS connection.
- *   http_locking_cb()    - Lock/unlock a thread's mutex.
  *   http_send()          - Send a request with all fields and the trailing
  *                          blank line.
  *   http_setup_ssl()     - Set up SSL/TLS support on a connection.
  *   http_shutdown_ssl()  - Shut down SSL/TLS on a connection.
- *   http_threadid_cb()   - Return the current thread ID.
  *   http_upgrade()       - Force upgrade to TLS encryption.
  *   http_write()         - Write a buffer to a HTTP connection.
  *   http_write_chunk()   - Write a chunked buffer.
@@ -146,19 +144,6 @@ static int		http_setup_ssl(http_t *http)
 static void		http_shutdown_ssl(http_t *http);
 static int		http_upgrade(http_t *http);
 static int		http_write_ssl(http_t *http, const char *buf, int len);
-
-#  ifdef HAVE_GNUTLS
-#    ifdef HAVE_PTHREAD_H
-GCRY_THREAD_OPTION_PTHREAD_IMPL;
-#    endif /* HAVE_PTHREAD_H */
-
-#  elif defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H)
-static pthread_mutex_t	*http_locks;	/* OpenSSL lock mutexes */
-
-static void		http_locking_cb(int mode, int type, const char *file,
-					int line);
-static unsigned long	http_threadid_cb(void);
-#  endif /* HAVE_GNUTLS */
 #endif /* HAVE_SSL */
 
 
@@ -1188,22 +1173,21 @@ httpHead(http_t     *http,		/* I - Conne
 void
 httpInitialize(void)
 {
-  static int	initialized = 0;	/* Have we been called before? */
-#ifdef WIN32
-  WSADATA	winsockdata;		/* WinSock data */
-#endif /* WIN32 */
 #ifdef HAVE_LIBSSL
-  int		i;			/* Looping var */
-  unsigned char	data[1024];		/* Seed data */
+#  ifndef WIN32
+  struct timeval        curtime;        /* Current time in microseconds */
+#  endif /* !WIN32 */
+  int                   i;              /* Looping var */
+  unsigned char         data[1024];     /* Seed data */
 #endif /* HAVE_LIBSSL */
 
-
-  if (initialized)
-    return;
-
 #ifdef WIN32
-  WSAStartup(MAKEWORD(2,2), &winsockdata);
+  WSADATA       winsockdata;            /* WinSock data */
+
 
+  static int    initialized = 0;        /* Has WinSock been initialized? */
+  if (!initialized)
+    WSAStartup(MAKEWORD(1,1), &winsockdata);
 #elif !defined(SO_NOSIGPIPE)
  /*
   * Ignore SIGPIPE signals...
@@ -1226,21 +1210,15 @@ httpInitialize(void)
 #endif /* WIN32 */
 
 #ifdef HAVE_GNUTLS
- /*
-  * Make sure we handle threading properly...
-  */
-
-#  ifdef HAVE_PTHREAD_H
-  gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
-#  endif /* HAVE_PTHREAD_H */
 
  /*
   * Initialize GNU TLS...
   */
 
   gnutls_global_init();
+#endif /* HAVE_GNUTLS */
 
-#elif defined(HAVE_LIBSSL)
+#ifdef HAVE_LIBSSL
  /*
   * Initialize OpenSSL...
   */
@@ -1249,33 +1227,21 @@ httpInitialize(void)
   SSL_library_init();
 
  /*
-  * Set the threading callbacks...
-  */
-
-#  ifdef HAVE_PTHREAD_H
-  http_locks = calloc(CRYPTO_num_locks(), sizeof(pthread_mutex_t));
-
-  for (i = 0; i < CRYPTO_num_locks(); i ++)
-    pthread_mutex_init(http_locks + i, NULL);
-
-  CRYPTO_set_id_callback(http_threadid_cb);
-  CRYPTO_set_locking_callback(http_locking_cb);
-#  endif /* HAVE_PTHREAD_H */
-
- /*
   * Using the current time is a dubious random seed, but on some systems
   * it is the best we can do (on others, this seed isn't even used...)
   */
 
-  CUPS_SRAND(time(NULL));
+#  ifdef WIN32
+#  else
+  gettimeofday(&curtime, NULL);
+  srand(curtime.tv_sec + curtime.tv_usec);
+#  endif /* WIN32 */
 
   for (i = 0; i < sizeof(data); i ++)
-    data[i] = CUPS_RAND();
+    data[i] = rand();
 
   RAND_seed(data, sizeof(data));
-#endif /* HAVE_GNUTLS */
-
-  initialized = 1;
+#endif /* HAVE_LIBSSL */
 }
 
 
@@ -2834,25 +2800,6 @@ http_read_ssl(http_t *http,		/* I - Conn
 #endif /* HAVE_SSL */
 
 
-#if defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H)
-/*
- * 'http_locking_cb()' - Lock/unlock a thread's mutex.
- */
-
-static void
-http_locking_cb(int        mode,	/* I - Lock mode */
-		int        type,	/* I - Lock type */
-		const char *file,	/* I - Source file */
-		int        line)	/* I - Line number */
-{
-  if (mode & CRYPTO_LOCK)
-    pthread_mutex_lock(http_locks + type);
-  else
-    pthread_mutex_unlock(http_locks + type);
-}
-#endif /* HAVE_LIBSSL && HAVE_PTHREAD_H */
-
-
 /*
  * 'http_send()' - Send a request with all fields and the trailing blank line.
  */
@@ -3224,19 +3171,6 @@ http_shutdown_ssl(http_t *http)		/* I - 
 #endif /* HAVE_SSL */
 
 
-#if defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H)
-/*
- * 'http_threadid_cb()' - Return the current thread ID.
- */
-
-static unsigned long			/* O - Thread ID */
-http_threadid_cb(void)
-{
-  return ((unsigned long)pthread_self());
-}
-#endif /* HAVE_LIBSSL && HAVE_PTHREAD_H */
-
-
 #ifdef HAVE_SSL
 /*
  * 'http_upgrade()' - Force upgrade to TLS encryption.
diff -Naurp cups-1.4.4-orig/cups/http-private.h cups-1.4.4/cups/http-private.h
--- cups-1.4.4-orig/cups/http-private.h	2010-04-11 23:03:53.000000000 -0500
+++ cups-1.4.4/cups/http-private.h	2010-09-13 01:27:24.000000000 -0500
@@ -98,7 +98,6 @@ extern BIO_METHOD *_httpBIOMethods(void)
  * The GNU TLS library is more of a "bare metal" SSL/TLS library...
  */
 #    include <gnutls/gnutls.h>
-#    include <gcrypt.h>
 
 typedef struct
 {
diff -Naurp cups-1.4.4-orig/scheduler/main.c cups-1.4.4/scheduler/main.c
--- cups-1.4.4-orig/scheduler/main.c	2010-04-23 13:56:34.000000000 -0500
+++ cups-1.4.4/scheduler/main.c	2010-09-13 01:27:36.000000000 -0500
@@ -549,8 +549,6 @@ main(int  argc,				/* I - Number of comm
   * Startup the server...
   */
 
-  httpInitialize();
-
   cupsdStartServer();
 
  /*
diff -Naurp cups-1.4.4-orig/scheduler/server.c cups-1.4.4/scheduler/server.c
--- cups-1.4.4-orig/scheduler/server.c	2010-04-11 23:03:53.000000000 -0500
+++ cups-1.4.4/scheduler/server.c	2010-09-13 01:27:49.000000000 -0500
@@ -44,6 +44,42 @@ static int	started = 0;
 void
 cupsdStartServer(void)
 {
+#ifdef HAVE_LIBSSL
+  int                   i;              /* Looping var */
+  struct timeval        curtime;        /* Current time in microseconds */
+  unsigned char         data[1024];     /* Seed data */
+#endif /* HAVE_LIBSSL */
+
+
+#ifdef HAVE_LIBSSL
+ /*
+  * Initialize the encryption libraries...
+  */
+
+  SSL_library_init();
+  SSL_load_error_strings();
+
+ /*
+  * Using the current time is a dubious random seed, but on some systems
+  * it is the best we can do (on others, this seed isn't even used...)
+  */
+
+  gettimeofday(&curtime, NULL);
+  srand(curtime.tv_sec + curtime.tv_usec);
+
+  for (i = 0; i < sizeof(data); i ++)
+    data[i] = rand(); /* Yes, this is a poor source of random data... */
+
+  RAND_seed(&data, sizeof(data));
+#elif defined(HAVE_GNUTLS)
+ /*
+  * Initialize the encryption libraries...
+  */
+
+  gnutls_global_init();
+#endif /* HAVE_LIBSSL */
+
+
  /*
   * Create the default security profile...
   */