@@ -1313,9 +1313,6 @@ static acl_pack_kind add_file(const char *out_file, FILE *of, const char *file,
1313
1313
1314
1314
static acl_pack_kind add_directory (const char * out_file , FILE * of ,
1315
1315
const char * dir_name , ZInfo * z_info ) {
1316
- #ifdef FULL_NAME_LENGTH
1317
- #undef FULL_NAME_LENGTH
1318
- #endif
1319
1316
acl_pkg_pack_info info ;
1320
1317
size_t name_length = strlen (dir_name ) + 1 ;
1321
1318
@@ -1341,24 +1338,31 @@ static acl_pack_kind add_directory(const char *out_file, FILE *of,
1341
1338
1342
1339
// Now walk the directory processing each name.
1343
1340
{
1341
+
1344
1342
#ifdef _WIN32
1345
1343
#define FULL_NAME_LENGTH (2 * MAX_PATH)
1344
+ #else
1345
+ #define FULL_NAME_LENGTH (2 * PATH_MAX)
1346
+ #endif
1347
+
1346
1348
char full_name [FULL_NAME_LENGTH ];
1347
- if (FULL_NAME_LENGTH < name_length ) {
1349
+
1350
+ // Full name must be large enough to store dir_name plus a trailing path
1351
+ // separator
1352
+ if (name_length + 1 > FULL_NAME_LENGTH ) {
1348
1353
fprintf (stderr , "acl_pkg_pack: Failed to write to %s: %s\n" , out_file ,
1349
1354
"Directory name too long" );
1350
1355
return PACK_END ;
1351
1356
}
1357
+ #ifdef _WIN32
1352
1358
HANDLE file_handle ;
1353
1359
WIN32_FIND_DATA file_info ;
1354
1360
1355
1361
// Partially initialize the full path name.
1356
- strncpy (full_name , dir_name , FULL_NAME_LENGTH );
1362
+ strncpy (full_name , dir_name , FULL_NAME_LENGTH - 1 );
1357
1363
strncpy (full_name + name_length - 1 , "\\*.*" ,
1358
- FULL_NAME_LENGTH - name_length + 1 );
1359
- if (full_name [FULL_NAME_LENGTH - 1 ] != '\0' ) {
1360
- full_name [FULL_NAME_LENGTH - 1 ] = '\0' ;
1361
- }
1364
+ FULL_NAME_LENGTH - name_length );
1365
+ full_name [FULL_NAME_LENGTH - 1 ] = '\0' ;
1362
1366
1363
1367
// Walk through all the files in the directory.
1364
1368
file_handle = FindFirstFile (full_name , & file_info );
@@ -1372,10 +1376,9 @@ static acl_pack_kind add_directory(const char *out_file, FILE *of,
1372
1376
1373
1377
// Finish the full file name
1374
1378
strncpy (full_name + name_length , file_info .cFileName ,
1375
- FULL_NAME_LENGTH - name_length );
1376
- if (full_name [FULL_NAME_LENGTH - 1 ] != '\0' ) {
1377
- full_name [FULL_NAME_LENGTH - 1 ] = '\0' ;
1378
- }
1379
+ FULL_NAME_LENGTH - name_length - 1 );
1380
+ full_name [FULL_NAME_LENGTH - 1 ] = '\0' ;
1381
+
1379
1382
if (add_file_or_dir (out_file , of , full_name , z_info ) == PACK_END ) {
1380
1383
FindClose (file_handle );
1381
1384
return PACK_END ;
@@ -1386,14 +1389,6 @@ static acl_pack_kind add_directory(const char *out_file, FILE *of,
1386
1389
// Linux
1387
1390
DIR * dir ;
1388
1391
struct dirent * entry ;
1389
- #define FULL_NAME_LENGTH (2 * PATH_MAX)
1390
- char full_name [FULL_NAME_LENGTH ];
1391
- if (FULL_NAME_LENGTH < name_length ) {
1392
- fprintf (stderr , "acl_pkg_pack: Failed to write to %s: %s\n" , out_file ,
1393
- "Directory name too long" );
1394
- return PACK_END ;
1395
- }
1396
-
1397
1392
// Partially initialize the full path name.
1398
1393
strncpy (full_name , dir_name , FULL_NAME_LENGTH - 1 );
1399
1394
full_name [FULL_NAME_LENGTH - 1 ] = '\0' ;
@@ -1414,10 +1409,9 @@ static acl_pack_kind add_directory(const char *out_file, FILE *of,
1414
1409
// Finish the full file name, truncate name if the file is too long to
1415
1410
// avoid buffer overflow
1416
1411
size_t buffer_space_left = FULL_NAME_LENGTH - name_length ;
1417
- strncpy (full_name + name_length , entry -> d_name , buffer_space_left );
1418
- if (full_name [FULL_NAME_LENGTH - 1 ] != '\0' ) {
1419
- full_name [FULL_NAME_LENGTH - 1 ] = '\0' ;
1420
- }
1412
+ strncpy (full_name + name_length , entry -> d_name , buffer_space_left - 1 );
1413
+ full_name [FULL_NAME_LENGTH - 1 ] = '\0' ;
1414
+
1421
1415
if (add_file_or_dir (out_file , of , full_name , z_info ) == PACK_END ) {
1422
1416
closedir (dir );
1423
1417
return PACK_END ;
@@ -1427,6 +1421,7 @@ static acl_pack_kind add_directory(const char *out_file, FILE *of,
1427
1421
}
1428
1422
closedir (dir );
1429
1423
#endif
1424
+ #undef FULL_NAME_LENGTH
1430
1425
}
1431
1426
return PACK_DIR ;
1432
1427
}
@@ -1561,12 +1556,6 @@ static int read_data(void *data, size_t size, ZInfo *z_info, FILE *in_fd) {
1561
1556
static int acl_pkg_unpack_buffer_or_file (const char * buffer , size_t buffer_size ,
1562
1557
FILE * input , const char * out_dir ,
1563
1558
const char * routine_name ) {
1564
- #ifdef FULL_NAME_LEN
1565
- #undef FULL_NAME_LEN
1566
- #endif
1567
- #ifdef NAME_LEN
1568
- #undef NAME_LEN
1569
- #endif
1570
1559
#ifdef _WIN32
1571
1560
#define FULL_NAME_LEN (3 * MAX_PATH)
1572
1561
#define NAME_LEN (2 * MAX_PATH)
@@ -1641,15 +1630,18 @@ static int acl_pkg_unpack_buffer_or_file(const char *buffer, size_t buffer_size,
1641
1630
return 0 ;
1642
1631
}
1643
1632
1644
- // Generate the full name, truncate or zero pad to avoid buffer overflow
1645
- if (FULL_NAME_LEN < out_dir_length ) {
1633
+ // Generate the full name, truncate or zero pad to avoid buffer overflow.
1634
+ // FULL_NAME_LEN must be large enough to store out_dir and a trailing path
1635
+ // separator and null terminator
1636
+ if (out_dir_length + 2 > FULL_NAME_LEN ) {
1646
1637
fprintf (stderr , "%s: Directory name too long\n" , routine_name );
1638
+ inflateEnd (& z_info .strm );
1639
+ return 0 ;
1647
1640
}
1641
+
1648
1642
strncpy (full_name + out_dir_length + 1 , name ,
1649
- FULL_NAME_LEN - out_dir_length - 1 );
1650
- if (full_name [FULL_NAME_LEN - 1 ] != '\0' ) {
1651
- full_name [FULL_NAME_LEN - 1 ] = '\0' ;
1652
- }
1643
+ FULL_NAME_LEN - out_dir_length - 2 );
1644
+ full_name [FULL_NAME_LEN - 1 ] = '\0' ;
1653
1645
1654
1646
if (info .kind == PACK_DIR ) {
1655
1647
#ifdef _WIN32
@@ -1718,6 +1710,8 @@ static int acl_pkg_unpack_buffer_or_file(const char *buffer, size_t buffer_size,
1718
1710
1719
1711
inflateEnd (& z_info .strm );
1720
1712
return 1 ;
1713
+ #undef FULL_NAME_LEN
1714
+ #undef NAME_LEN
1721
1715
}
1722
1716
1723
1717
int acl_pkg_unpack_buffer (const char * buffer , size_t buffer_size ,
0 commit comments