Skip to content

Commit f3485ba

Browse files
Merge pull request #5475 from cfengine/CFE-4341/3.21
CFE-4341: Adjusted package module inventory to include quotes around fields when needed (3.21)
2 parents 22e5ee2 + 755ffc8 commit f3485ba

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

cf-agent/package_module.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
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

Comments
 (0)