@@ -163,8 +163,12 @@ static void unlink_qrexec_socket(void)
163
163
"%s/qrexec.%s" , socket_dir , remote_domain_name );
164
164
if (v < (int )sizeof ("/qrexec." ) || v >= (int )sizeof (link_to_socket_name ))
165
165
abort ();
166
- unlink (socket_address );
167
- unlink (link_to_socket_name );
166
+ v = unlink (socket_address );
167
+ if (v != 0 && !(v == -1 && errno == ENOENT ))
168
+ err (1 , "unlink(%s)" , socket_address );
169
+ v = unlink (link_to_socket_name );
170
+ if (v != 0 && !(v == -1 && errno == ENOENT ))
171
+ err (1 , "unlink(%s)" , link_to_socket_name );
168
172
}
169
173
170
174
static void handle_vchan_error (const char * op )
@@ -178,12 +182,17 @@ static int create_qrexec_socket(int domid, const char *domname)
178
182
{
179
183
char socket_address [40 ];
180
184
char link_to_socket_name [strlen (domname ) + sizeof (socket_address )];
181
-
182
- snprintf (socket_address , sizeof (socket_address ),
183
- "%s/qrexec.%d" , socket_dir , domid );
184
- snprintf (link_to_socket_name , sizeof link_to_socket_name ,
185
- "%s/qrexec.%s" , socket_dir , domname );
186
- unlink (link_to_socket_name );
185
+ int res ;
186
+
187
+ if ((unsigned )snprintf (socket_address , sizeof (socket_address ),
188
+ "%s/qrexec.%d" , socket_dir , domid ) >= sizeof (socket_address ))
189
+ errx (1 , "socket name too long" );
190
+ if ((unsigned )snprintf (link_to_socket_name , sizeof link_to_socket_name ,
191
+ "%s/qrexec.%s" , socket_dir , domname ) >= sizeof link_to_socket_name )
192
+ errx (1 , "socket link name too long" );
193
+ res = unlink (link_to_socket_name );
194
+ if (res != 0 && !(res == -1 && errno == ENOENT ))
195
+ err (1 , "unlink(%s)" , link_to_socket_name );
187
196
188
197
/* When running as root, make the socket accessible; perms on /var/run/qubes still apply */
189
198
umask (0 );
@@ -330,8 +339,10 @@ static void init(int xid)
330
339
close (0 );
331
340
332
341
if (!opt_direct ) {
333
- snprintf (qrexec_error_log_name , sizeof (qrexec_error_log_name ),
334
- "/var/log/qubes/qrexec.%s.log" , remote_domain_name );
342
+ if ((unsigned )snprintf (qrexec_error_log_name , sizeof (qrexec_error_log_name ),
343
+ "/var/log/qubes/qrexec.%s.log" , remote_domain_name ) >=
344
+ sizeof (qrexec_error_log_name ))
345
+ errx (1 , "remote domain name too long" );
335
346
umask (0007 ); // make the log readable by the "qubes" group
336
347
logfd =
337
348
open (qrexec_error_log_name , O_WRONLY | O_CREAT | O_TRUNC ,
0 commit comments