@@ -1141,9 +1141,7 @@ EXPORTED int carddav_writecard(struct carddav_db *carddavdb,
1141
1141
else if (!strcasecmp (name , "nickname" )) {
1142
1142
if (buf_len (& nicknames )) buf_putc (& nicknames , ',' );
1143
1143
buf_appendcstr (& nicknames , propval );
1144
- cdata -> nickname = buf_cstring (& nicknames );;
1145
- strarray_appendm (& values , propval );
1146
- propval = NULL ;
1144
+ cdata -> nickname = buf_cstring (& nicknames );
1147
1145
}
1148
1146
else if (!strcasecmp (name , "email" )) {
1149
1147
/* XXX - insert if primary */
@@ -1420,33 +1418,49 @@ EXPORTED int carddav_writecard_x(struct carddav_db *carddavdb,
1420
1418
int ispinned )
1421
1419
{
1422
1420
struct buf nicknames = BUF_INITIALIZER ;
1421
+ strarray_t values = STRARRAY_INITIALIZER ;
1423
1422
strarray_t emails = STRARRAY_INITIALIZER ;
1424
1423
strarray_t member_uids = STRARRAY_INITIALIZER ;
1425
1424
vcardproperty * prop ;
1426
1425
1427
1426
for (prop = vcardcomponent_get_first_property (vcard , VCARD_ANY_PROPERTY );
1428
1427
prop ;
1429
1428
prop = vcardcomponent_get_next_property (vcard , VCARD_ANY_PROPERTY )) {
1430
- const char * propval = vcardproperty_get_value_as_string (prop );
1429
+ /* The libical BUFFER_RING_SIZE used by *_get_value_as_string()
1430
+ * is 2500 entries.
1431
+ * A vCard with more than 2500 properties (E.g. a large group card)
1432
+ * will cause some of our value pointers to be freed out from under us.
1433
+ * So, we use vcardproperty_get_value_as_string_r() here instead
1434
+ * and manage the memory ourselves.
1435
+ */
1436
+ char * propval = vcardproperty_get_value_as_string_r (prop );
1431
1437
const char * userid = "" ;
1432
1438
1439
+ if (!propval ) continue ;
1440
+
1433
1441
switch (vcardproperty_isa (prop )) {
1434
1442
case VCARD_UID_PROPERTY :
1435
1443
cdata -> vcard_uid = propval ;
1444
+ strarray_appendm (& values , propval );
1445
+ propval = NULL ;
1436
1446
break ;
1437
1447
1438
1448
case VCARD_N_PROPERTY :
1439
1449
cdata -> name = propval ;
1450
+ strarray_appendm (& values , propval );
1451
+ propval = NULL ;
1440
1452
break ;
1441
1453
1442
1454
case VCARD_FN_PROPERTY :
1443
1455
cdata -> fullname = propval ;
1456
+ strarray_appendm (& values , propval );
1457
+ propval = NULL ;
1444
1458
break ;
1445
1459
1446
1460
case VCARD_NICKNAME_PROPERTY :
1447
1461
if (buf_len (& nicknames )) buf_putc (& nicknames , ',' );
1448
1462
buf_appendcstr (& nicknames , propval );
1449
- cdata -> nickname = buf_cstring (& nicknames );;
1463
+ cdata -> nickname = buf_cstring (& nicknames );
1450
1464
break ;
1451
1465
1452
1466
case VCARD_EMAIL_PROPERTY : {
@@ -1471,8 +1485,9 @@ EXPORTED int carddav_writecard_x(struct carddav_db *carddavdb,
1471
1485
}
1472
1486
}
1473
1487
}
1474
- strarray_append (& emails , propval );
1488
+ strarray_appendm (& emails , propval );
1475
1489
strarray_append (& emails , ispref ? "1" : "" );
1490
+ propval = NULL ;
1476
1491
break ;
1477
1492
}
1478
1493
@@ -1511,6 +1526,8 @@ EXPORTED int carddav_writecard_x(struct carddav_db *carddavdb,
1511
1526
default :
1512
1527
break ;
1513
1528
}
1529
+
1530
+ free (propval );
1514
1531
}
1515
1532
1516
1533
int r ;
@@ -1529,6 +1546,7 @@ EXPORTED int carddav_writecard_x(struct carddav_db *carddavdb,
1529
1546
if (!r ) r = carddav_write_groups (carddavdb , cdata -> dav .rowid , & member_uids );
1530
1547
1531
1548
buf_free (& nicknames );
1549
+ strarray_fini (& values );
1532
1550
strarray_fini (& emails );
1533
1551
strarray_fini (& member_uids );
1534
1552
0 commit comments