3939#include <eval_context.h>
4040#include <changes_chroot.h> /* RecordPkgOperationInChroot() */
4141#include <simulate_mode.h> /* CHROOT_PKG_OPERATION_* */
42+ #include <csv_writer.h> /* safely write csv entries */
4243
4344#define INVENTORY_LIST_BUFFER_SIZE 100 * 80 /* 100 entries with 80 characters
4445 * per line */
@@ -658,7 +659,8 @@ int UpdatePackagesDB(Rlist *data, const char *pm_name, UpdateType type)
658659 {
659660 CleanDB (db_cached );
660661
661- Buffer * inventory_data = BufferNewWithCapacity (INVENTORY_LIST_BUFFER_SIZE );
662+ Writer * idw = StringWriter ();
663+ CsvWriter * idcw = CsvWriterOpen (idw );
662664
663665 const char * package_data [3 ] = {NULL , NULL , NULL };
664666
@@ -676,9 +678,10 @@ int UpdatePackagesDB(Rlist *data, const char *pm_name, UpdateType type)
676678 package_data [1 ], package_data [2 ],
677679 type );
678680
679- BufferAppendF (inventory_data , "%s,%s,%s\n" ,
680- package_data [0 ], package_data [1 ],
681- package_data [2 ]);
681+ CsvWriterField (idcw , package_data [0 ]);
682+ CsvWriterField (idcw , package_data [1 ]);
683+ CsvWriterField (idcw , package_data [2 ]);
684+ CsvWriterNewRecord (idcw );
682685 }
683686 else
684687 {
@@ -726,8 +729,10 @@ int UpdatePackagesDB(Rlist *data, const char *pm_name, UpdateType type)
726729 WritePackageDataToDB (db_cached , package_data [0 ],
727730 package_data [1 ], package_data [2 ], type );
728731
729- BufferAppendF (inventory_data , "%s,%s,%s\n" , package_data [0 ],
730- package_data [1 ], package_data [2 ]);
732+ CsvWriterField (idcw , package_data [0 ]);
733+ CsvWriterField (idcw , package_data [1 ]);
734+ CsvWriterField (idcw , package_data [2 ]);
735+ CsvWriterNewRecord (idcw );
731736 }
732737 else if (package_data [0 ] || package_data [1 ] || package_data [2 ])
733738 {
@@ -739,7 +744,14 @@ int UpdatePackagesDB(Rlist *data, const char *pm_name, UpdateType type)
739744 }
740745
741746 char * inventory_key = "<inventory>" ;
742- char * inventory_list = BufferClose (inventory_data );
747+ CsvWriterClose (idcw );
748+ char * inventory_list = StringWriterClose (idw );
749+
750+ // Legacy: the lines are expected to be separated by newlines, not CRLF
751+ const size_t buf_size = strlen (inventory_list );
752+ NDEBUG_UNUSED const ssize_t num_repl =
753+ StringReplace (inventory_list , buf_size , "\r\n" , "\n" );
754+ assert (num_repl >= 0 );
743755
744756 /* We can have empty list of installed software or available updates. */
745757 if (inventory_list == NULL )
0 commit comments