@@ -875,7 +875,7 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
875
875
if (deref )
876
876
name ++ ;
877
877
if (!strcmp (name , "objecttype" ))
878
- v -> s = type_name (oi -> type );
878
+ v -> s = xstrdup ( type_name (oi -> type ) );
879
879
else if (!strcmp (name , "objectsize" )) {
880
880
v -> value = oi -> size ;
881
881
v -> s = xstrfmt ("%lu" , oi -> size );
@@ -899,9 +899,9 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob
899
899
if (deref )
900
900
name ++ ;
901
901
if (!strcmp (name , "tag" ))
902
- v -> s = tag -> tag ;
902
+ v -> s = xstrdup ( tag -> tag ) ;
903
903
else if (!strcmp (name , "type" ) && tag -> tagged )
904
- v -> s = type_name (tag -> tagged -> type );
904
+ v -> s = xstrdup ( type_name (tag -> tagged -> type ) );
905
905
else if (!strcmp (name , "object" ) && tag -> tagged )
906
906
v -> s = xstrdup (oid_to_hex (& tag -> tagged -> oid ));
907
907
}
@@ -1032,7 +1032,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam
1032
1032
v -> value = timestamp ;
1033
1033
return ;
1034
1034
bad :
1035
- v -> s = "" ;
1035
+ v -> s = xstrdup ( "" ) ;
1036
1036
v -> value = 0 ;
1037
1037
}
1038
1038
@@ -1227,7 +1227,7 @@ static void fill_missing_values(struct atom_value *val)
1227
1227
for (i = 0 ; i < used_atom_cnt ; i ++ ) {
1228
1228
struct atom_value * v = & val [i ];
1229
1229
if (v -> s == NULL )
1230
- v -> s = "" ;
1230
+ v -> s = xstrdup ( "" ) ;
1231
1231
}
1232
1232
}
1233
1233
@@ -1273,7 +1273,8 @@ static inline char *copy_advance(char *dst, const char *src)
1273
1273
static const char * lstrip_ref_components (const char * refname , int len )
1274
1274
{
1275
1275
long remaining = len ;
1276
- const char * start = refname ;
1276
+ const char * start = xstrdup (refname );
1277
+ const char * to_free = start ;
1277
1278
1278
1279
if (len < 0 ) {
1279
1280
int i ;
@@ -1294,20 +1295,24 @@ static const char *lstrip_ref_components(const char *refname, int len)
1294
1295
while (remaining > 0 ) {
1295
1296
switch (* start ++ ) {
1296
1297
case '\0' :
1297
- return "" ;
1298
+ free ((char * )to_free );
1299
+ return xstrdup ("" );
1298
1300
case '/' :
1299
1301
remaining -- ;
1300
1302
break ;
1301
1303
}
1302
1304
}
1303
1305
1306
+ start = xstrdup (start );
1307
+ free ((char * )to_free );
1304
1308
return start ;
1305
1309
}
1306
1310
1307
1311
static const char * rstrip_ref_components (const char * refname , int len )
1308
1312
{
1309
1313
long remaining = len ;
1310
- char * start = xstrdup (refname );
1314
+ const char * start = xstrdup (refname );
1315
+ const char * to_free = start ;
1311
1316
1312
1317
if (len < 0 ) {
1313
1318
int i ;
@@ -1327,9 +1332,10 @@ static const char *rstrip_ref_components(const char *refname, int len)
1327
1332
1328
1333
while (remaining -- > 0 ) {
1329
1334
char * p = strrchr (start , '/' );
1330
- if (p == NULL )
1331
- return "" ;
1332
- else
1335
+ if (p == NULL ) {
1336
+ free ((char * )to_free );
1337
+ return xstrdup ("" );
1338
+ } else
1333
1339
p [0 ] = '\0' ;
1334
1340
}
1335
1341
return start ;
@@ -1344,7 +1350,7 @@ static const char *show_ref(struct refname_atom *atom, const char *refname)
1344
1350
else if (atom -> option == R_RSTRIP )
1345
1351
return rstrip_ref_components (refname , atom -> rstrip );
1346
1352
else
1347
- return refname ;
1353
+ return xstrdup ( refname ) ;
1348
1354
}
1349
1355
1350
1356
static void fill_remote_ref_details (struct used_atom * atom , const char * refname ,
@@ -1358,7 +1364,7 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
1358
1364
NULL , AHEAD_BEHIND_FULL ) < 0 ) {
1359
1365
* s = xstrdup (msgs .gone );
1360
1366
} else if (!num_ours && !num_theirs )
1361
- * s = "" ;
1367
+ * s = xstrdup ( "" ) ;
1362
1368
else if (!num_ours )
1363
1369
* s = xstrfmt (msgs .behind , num_theirs );
1364
1370
else if (!num_theirs )
@@ -1373,36 +1379,31 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
1373
1379
}
1374
1380
} else if (atom -> u .remote_ref .option == RR_TRACKSHORT ) {
1375
1381
if (stat_tracking_info (branch , & num_ours , & num_theirs ,
1376
- NULL , AHEAD_BEHIND_FULL ) < 0 )
1382
+ NULL , AHEAD_BEHIND_FULL ) < 0 ) {
1383
+ * s = xstrdup ("" );
1377
1384
return ;
1378
-
1385
+ }
1379
1386
if (!num_ours && !num_theirs )
1380
- * s = "=" ;
1387
+ * s = xstrdup ( "=" ) ;
1381
1388
else if (!num_ours )
1382
- * s = "<" ;
1389
+ * s = xstrdup ( "<" ) ;
1383
1390
else if (!num_theirs )
1384
- * s = ">" ;
1391
+ * s = xstrdup ( ">" ) ;
1385
1392
else
1386
- * s = "<>" ;
1393
+ * s = xstrdup ( "<>" ) ;
1387
1394
} else if (atom -> u .remote_ref .option == RR_REMOTE_NAME ) {
1388
1395
int explicit ;
1389
1396
const char * remote = atom -> u .remote_ref .push ?
1390
1397
pushremote_for_branch (branch , & explicit ) :
1391
1398
remote_for_branch (branch , & explicit );
1392
- if (explicit )
1393
- * s = xstrdup (remote );
1394
- else
1395
- * s = "" ;
1399
+ * s = xstrdup (explicit ? remote : "" );
1396
1400
} else if (atom -> u .remote_ref .option == RR_REMOTE_REF ) {
1397
1401
int explicit ;
1398
1402
const char * merge ;
1399
1403
1400
1404
merge = remote_ref_for_branch (branch , atom -> u .remote_ref .push ,
1401
1405
& explicit );
1402
- if (explicit )
1403
- * s = xstrdup (merge );
1404
- else
1405
- * s = "" ;
1406
+ * s = xstrdup (explicit ? merge : "" );
1406
1407
} else
1407
1408
BUG ("unhandled RR_* enum" );
1408
1409
}
@@ -1451,7 +1452,7 @@ char *get_head_description(void)
1451
1452
static const char * get_symref (struct used_atom * atom , struct ref_array_item * ref )
1452
1453
{
1453
1454
if (!ref -> symref )
1454
- return "" ;
1455
+ return xstrdup ( "" ) ;
1455
1456
else
1456
1457
return show_ref (& atom -> u .refname , ref -> symref );
1457
1458
}
@@ -1510,7 +1511,7 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
1510
1511
ref -> symref = resolve_refdup (ref -> refname , RESOLVE_REF_READING ,
1511
1512
NULL , NULL );
1512
1513
if (!ref -> symref )
1513
- ref -> symref = "" ;
1514
+ ref -> symref = xstrdup ( "" ) ;
1514
1515
}
1515
1516
1516
1517
/* Fill in specials first */
@@ -1536,20 +1537,23 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
1536
1537
refname = get_symref (atom , ref );
1537
1538
else if (starts_with (name , "upstream" )) {
1538
1539
const char * branch_name ;
1539
- v -> s = "" ;
1540
1540
/* only local branches may have an upstream */
1541
1541
if (!skip_prefix (ref -> refname , "refs/heads/" ,
1542
- & branch_name ))
1542
+ & branch_name )) {
1543
+ v -> s = xstrdup ("" );
1543
1544
continue ;
1545
+ }
1544
1546
branch = branch_get (branch_name );
1545
1547
1546
1548
refname = branch_get_upstream (branch , NULL );
1547
1549
if (refname )
1548
1550
fill_remote_ref_details (atom , refname , branch , & v -> s );
1551
+ else
1552
+ v -> s = xstrdup ("" );
1549
1553
continue ;
1550
1554
} else if (atom -> u .remote_ref .push ) {
1551
1555
const char * branch_name ;
1552
- v -> s = "" ;
1556
+ v -> s = xstrdup ( "" ) ;
1553
1557
if (!skip_prefix (ref -> refname , "refs/heads/" ,
1554
1558
& branch_name ))
1555
1559
continue ;
@@ -1562,10 +1566,12 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
1562
1566
if (!refname )
1563
1567
continue ;
1564
1568
}
1569
+ /* We will definitely re-init v->s on the next line. */
1570
+ free ((char * )v -> s );
1565
1571
fill_remote_ref_details (atom , refname , branch , & v -> s );
1566
1572
continue ;
1567
1573
} else if (starts_with (name , "color:" )) {
1568
- v -> s = atom -> u .color ;
1574
+ v -> s = xstrdup ( atom -> u .color ) ;
1569
1575
continue ;
1570
1576
} else if (!strcmp (name , "flag" )) {
1571
1577
char buf [256 ], * cp = buf ;
@@ -1574,7 +1580,7 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
1574
1580
if (ref -> flag & REF_ISPACKED )
1575
1581
cp = copy_advance (cp , ",packed" );
1576
1582
if (cp == buf )
1577
- v -> s = "" ;
1583
+ v -> s = xstrdup ( "" ) ;
1578
1584
else {
1579
1585
* cp = '\0' ;
1580
1586
v -> s = xstrdup (buf + 1 );
@@ -1584,40 +1590,42 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
1584
1590
continue ;
1585
1591
} else if (!strcmp (name , "HEAD" )) {
1586
1592
if (atom -> u .head && !strcmp (ref -> refname , atom -> u .head ))
1587
- v -> s = "*" ;
1593
+ v -> s = xstrdup ( "*" ) ;
1588
1594
else
1589
- v -> s = " " ;
1595
+ v -> s = xstrdup ( " " ) ;
1590
1596
continue ;
1591
1597
} else if (starts_with (name , "align" )) {
1592
1598
v -> handler = align_atom_handler ;
1593
- v -> s = "" ;
1599
+ v -> s = xstrdup ( "" ) ;
1594
1600
continue ;
1595
1601
} else if (!strcmp (name , "end" )) {
1596
1602
v -> handler = end_atom_handler ;
1597
- v -> s = "" ;
1603
+ v -> s = xstrdup ( "" ) ;
1598
1604
continue ;
1599
1605
} else if (starts_with (name , "if" )) {
1600
1606
const char * s ;
1601
- v -> s = "" ;
1602
1607
if (skip_prefix (name , "if:" , & s ))
1603
1608
v -> s = xstrdup (s );
1609
+ else
1610
+ v -> s = xstrdup ("" );
1604
1611
v -> handler = if_atom_handler ;
1605
1612
continue ;
1606
1613
} else if (!strcmp (name , "then" )) {
1607
1614
v -> handler = then_atom_handler ;
1608
- v -> s = "" ;
1615
+ v -> s = xstrdup ( "" ) ;
1609
1616
continue ;
1610
1617
} else if (!strcmp (name , "else" )) {
1611
1618
v -> handler = else_atom_handler ;
1612
- v -> s = "" ;
1619
+ v -> s = xstrdup ( "" ) ;
1613
1620
continue ;
1614
1621
} else
1615
1622
continue ;
1616
1623
1617
1624
if (!deref )
1618
- v -> s = refname ;
1625
+ v -> s = xstrdup ( refname ) ;
1619
1626
else
1620
1627
v -> s = xstrfmt ("%s^{}" , refname );
1628
+ free ((char * )refname );
1621
1629
}
1622
1630
1623
1631
for (i = 0 ; i < used_atom_cnt ; i ++ ) {
@@ -1988,6 +1996,10 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
1988
1996
static void free_array_item (struct ref_array_item * item )
1989
1997
{
1990
1998
free ((char * )item -> symref );
1999
+ if (item -> value ) {
2000
+ free ((char * )item -> value -> s );
2001
+ free (item -> value );
2002
+ }
1991
2003
free (item );
1992
2004
}
1993
2005
@@ -1996,6 +2008,10 @@ void ref_array_clear(struct ref_array *array)
1996
2008
{
1997
2009
int i ;
1998
2010
2011
+ for (i = 0 ; i < used_atom_cnt ; i ++ )
2012
+ free ((char * )used_atom [i ].name );
2013
+ FREE_AND_NULL (used_atom );
2014
+ used_atom_cnt = 0 ;
1999
2015
for (i = 0 ; i < array -> nr ; i ++ )
2000
2016
free_array_item (array -> items [i ]);
2001
2017
FREE_AND_NULL (array -> items );
0 commit comments