@@ -191,7 +191,7 @@ get_printer_attributes5(http_t *http_printer,
191
191
{
192
192
const char * uri ;
193
193
int have_http , uri_status , host_port , i = 0 , total_attrs = 0 , fallback ,
194
- cap = 0 ;
194
+ cap = 0 , uri_alloc = 0 ;
195
195
char scheme [10 ], userpass [1024 ], host_name [1024 ], resource [1024 ];
196
196
ipp_t * request , * response = NULL ;
197
197
ipp_attribute_t * attr ;
@@ -247,7 +247,18 @@ get_printer_attributes5(http_t *http_printer,
247
247
if (resolve_uri_type == CUPS_BACKEND_URI_CONVERTER )
248
248
uri = resolve_uri (raw_uri );
249
249
else
250
+ {
250
251
uri = ippfind_based_uri_converter (raw_uri , resolve_uri_type );
252
+ if (uri != NULL )
253
+ uri_alloc = 1 ;
254
+ }
255
+
256
+ if (uri == NULL )
257
+ {
258
+ log_printf (get_printer_attributes_log ,
259
+ "get-printer-attibutes: Cannot resolve URI: %s\n" , raw_uri );
260
+ return NULL ;
261
+ }
251
262
252
263
/* Extract URI componants needed for the IPP request */
253
264
uri_status = httpSeparateURI (HTTP_URI_CODING_ALL , uri ,
@@ -261,6 +272,7 @@ get_printer_attributes5(http_t *http_printer,
261
272
log_printf (get_printer_attributes_log ,
262
273
"get-printer-attributes: Cannot parse the printer URI: %s\n" ,
263
274
uri );
275
+ if (uri_alloc == 1 ) free (uri );
264
276
return NULL ;
265
277
}
266
278
@@ -273,6 +285,7 @@ get_printer_attributes5(http_t *http_printer,
273
285
log_printf (get_printer_attributes_log ,
274
286
"get-printer-attributes: Cannot connect to printer with URI %s.\n" ,
275
287
uri );
288
+ if (uri_alloc == 1 ) free (uri );
276
289
return NULL ;
277
290
}
278
291
} else
@@ -370,6 +383,7 @@ get_printer_attributes5(http_t *http_printer,
370
383
} else {
371
384
/* Suitable response, we are done */
372
385
if (have_http == 0 ) httpClose (http_printer );
386
+ if (uri_alloc == 1 ) free (uri );
373
387
return response ;
374
388
}
375
389
} else {
@@ -398,6 +412,7 @@ get_printer_attributes5(http_t *http_printer,
398
412
}
399
413
400
414
if (have_http == 0 ) httpClose (http_printer );
415
+ if (uri_alloc == 1 ) free (uri );
401
416
return NULL ;
402
417
}
403
418
@@ -418,21 +433,19 @@ ippfind_based_uri_converter (const char *uri, int is_fax)
418
433
char * ippfind_argv [100 ], /* Arguments for ippfind */
419
434
* ptr_to_port = NULL ,
420
435
* reg_type ,
421
- * resolved_uri , /* Buffer for resolved URI */
436
+ * resolved_uri = NULL , /* Buffer for resolved URI */
422
437
* resource_field = NULL ,
423
438
* service_hostname = NULL ,
424
439
/* URI components... */
425
440
scheme [32 ],
426
441
userpass [256 ],
427
442
hostname [1024 ],
428
443
resource [1024 ],
429
- buffer [ 8192 ] , /* Copy buffer */
444
+ * buffer = NULL , /* Copy buffer */
430
445
* ptr ; /* Pointer into string */ ;
431
446
cups_file_t * fp ; /* Post-processing input file */
432
447
int status ; /* Status of GET request */
433
448
434
- resolved_uri = (char * )malloc (2048 * (sizeof (char )));
435
-
436
449
status = httpSeparateURI (HTTP_URI_CODING_ALL , uri , scheme , sizeof (scheme ),
437
450
userpass , sizeof (userpass ),
438
451
hostname , sizeof (hostname ), & port , resource ,
@@ -445,10 +458,16 @@ ippfind_based_uri_converter (const char *uri, int is_fax)
445
458
446
459
/* URI is not DNS-SD-based, so do not resolve */
447
460
if ((reg_type = strstr (hostname , "._tcp" )) == NULL ) {
448
- free (resolved_uri );
449
461
return strdup (uri );
450
462
}
451
463
464
+ resolved_uri = (char * )malloc (MAX_URI_LEN * (sizeof (char )));
465
+ if (resolved_uri == NULL ) {
466
+ fprintf (stderr , "resolved_uri malloc: Out of memory\n" );
467
+ goto error ;
468
+ }
469
+ memset (resolved_uri , 0 , MAX_URI_LEN );
470
+
452
471
reg_type -- ;
453
472
while (reg_type >= hostname && * reg_type != '.' )
454
473
reg_type -- ;
@@ -523,26 +542,38 @@ ippfind_based_uri_converter (const char *uri, int is_fax)
523
542
524
543
fp = cupsFileStdin ();
525
544
526
- while ((bytes = cupsFileGetLine (fp , buffer , sizeof (buffer ))) > 0 ) {
545
+ buffer = (char * )malloc (MAX_OUTPUT_LEN * sizeof (char ));
546
+ if (buffer == NULL ) {
547
+ fprintf (stderr , "buffer malloc: Out of memory.\n" );
548
+ goto error ;
549
+ }
550
+ memset (buffer , 0 , MAX_OUTPUT_LEN );
551
+
552
+ while ((bytes = cupsFileGetLine (fp , buffer , MAX_OUTPUT_LEN )) > 0 ) {
527
553
/* Mark all the fields of the output of ippfind */
528
554
ptr = buffer ;
555
+
556
+ /* ignore new lines */
557
+ if (bytes < 3 )
558
+ goto read_error ;
559
+
529
560
/* First, build the DNS-SD-service-name-based URI ... */
530
561
while (ptr && !isalnum (* ptr & 255 )) ptr ++ ;
531
562
532
563
service_hostname = ptr ;
533
- ptr = memchr (ptr , '\t' , sizeof ( buffer ) - (ptr - buffer ));
564
+ ptr = memchr (ptr , '\t' , MAX_OUTPUT_LEN - (ptr - buffer ));
534
565
if (!ptr ) goto read_error ;
535
566
* ptr = '\0' ;
536
567
ptr ++ ;
537
568
538
569
resource_field = ptr ;
539
- ptr = memchr (ptr , '\t' , sizeof ( buffer ) - (ptr - buffer ));
570
+ ptr = memchr (ptr , '\t' , MAX_OUTPUT_LEN - (ptr - buffer ));
540
571
if (!ptr ) goto read_error ;
541
572
* ptr = '\0' ;
542
573
ptr ++ ;
543
574
544
575
ptr_to_port = ptr ;
545
- ptr = memchr (ptr , '\t' , sizeof ( buffer ) - (ptr - buffer ));
576
+ ptr = memchr (ptr , '\t' , MAX_OUTPUT_LEN - (ptr - buffer ));
546
577
if (!ptr ) goto read_error ;
547
578
* ptr = '\0' ;
548
579
ptr ++ ;
@@ -566,9 +597,12 @@ ippfind_based_uri_converter (const char *uri, int is_fax)
566
597
output_of_fax_uri = 1 ; /* fax-uri requested from fax-capable device */
567
598
568
599
read_error :
569
- continue ;
600
+ memset ( buffer , 0 , MAX_OUTPUT_LEN ) ;
570
601
}
571
602
603
+ if (buffer != NULL )
604
+ free (buffer );
605
+
572
606
/*
573
607
* Wait for the child processes to exit...
574
608
*/
@@ -615,6 +649,8 @@ ippfind_based_uri_converter (const char *uri, int is_fax)
615
649
*/
616
650
617
651
error :
652
+ if (resolved_uri != NULL )
653
+ free (resolved_uri );
618
654
return (NULL );
619
655
}
620
656
0 commit comments