summaryrefslogtreecommitdiffstats
path: root/src/plist.c
AgeCommit message (Collapse)AuthorFilesLines
7 daysRevert "Change API around #PLIST_DATA to use uint8_t instead of char arrays"Gravatar Nikias Bassen1-5/+5
This reverts commit a91f5740d100414a76959714b819422ee5b2d8a8.
2024-04-18Add PLIST_DICT convenience functions for different queries/operationsGravatar Nikias Bassen1-0/+245
2024-04-14Change API around #PLIST_DATA to use uint8_t instead of char arraysGravatar Nikias Bassen1-5/+6
This makes it more obvious that it is arbitrary data and not necessarily a string value.
2024-02-05Add a libplist_version() function to the interfaceGravatar Nikias Bassen1-0/+8
2023-12-12Prevent OOB access in plist_from_memoryGravatar Nikias Bassen1-2/+14
Credit to OSS-Fuzz
2023-08-30Prevent adding NULL items to array/dictionary nodesGravatar Nikias Bassen1-0/+12
Thanks to @tihmstar for pointing this out!
2023-06-15Plug memory leak in plist_write_to_stream()Gravatar Nikias Bassen1-0/+1
Thanks @beyonik for pointing this out!
2023-05-21Add explicit casts and fix return type mismatchesGravatar Nikias Bassen1-43/+47
2023-05-20Add an explicit PLIST_FORMAT_NONE valueGravatar Nikias Bassen1-2/+2
2023-05-13Move PLIST_API to the headersGravatar Nikias Bassen1-83/+83
2023-05-05Silence compiler warning on 32bit systemsGravatar Nikias Bassen1-1/+1
2023-04-19Remove deprecated plist_dict_insert_item()Gravatar Nikias Bassen1-5/+0
2023-04-19Add plist_read_from_file() to interface, update plist_from_memory()Gravatar Nikias Bassen1-1/+51
plist_read_from_file() is a convenience function that will open a given file, checks its size, allocates a buffer large enough to hold the full contents, and reads from file to fill the buffer. Then, it calls plist_from_memory() to convert the data to plist format. A (breaking) change had to be made so that plist_from_memory() will also return the parsed format in its 4th argument (if non-NULL).
2023-04-16Add new output-only formats and Define constants for the different plist formatsGravatar Nikias Bassen1-0/+92
This commit introduces constants for the different plist formats, and adds 3 new human-readable output-only formats: - PLIST_FORMAT_PRINT: the default human-readable format - PLIST_FORMAT_LIMD: "libimobiledevice" format (used in ideviceinfo) - PLIST_FORMAT_PLUTIL: plutil-style format Also, a new set of write functions has been added: - plist_write_to_string - plist_write_to_stream - plist_write_to_file Plus a simple "dump" function: - plist_print See documentation for details.
2023-02-07Add function to interface to allow enabling/disabling error/debug output for ↵Gravatar Nikias Bassen1-0/+13
the format parses This makes the `-d` option work in plistutil that wasn't doing anything
2023-02-06libcnary: Updated typedefs of node_t and node_list_t to contain pointerGravatar Nikias Bassen1-41/+41
This makes the code more readable. Obviously all the code that uses it is also updated.
2023-02-05Fix plist_sort() by swapping the nodes in the tree instead of their dataGravatar Nikias Bassen1-29/+33
The problem was that we swapped potential child node data between nodes, but their parents would not be updated that way, leading to double frees or segmentation faults when freeing a plist. This commit instead fixes this by swapping the actual nodes in the tree.
2023-02-03Add new plist_sort() functionGravatar Nikias Bassen1-0/+61
2023-01-31bplist: Fix handling of PLIST_NULL node typeGravatar Nikias Bassen1-0/+1
2023-01-16Rename PLIST_UINT to PLIST_INT and add plist_new_int() and plist_get_int_val()Gravatar Nikias Bassen1-8/+60
This properly supports getting and setting signed or unsigned integer values. Also, a new helper function plist_int_val_is_negative() was added to determine if a given #PLIST_INT node has a negative value or not. The old type PLIST_UINT is defined as a macro with the value of PLIST_INT for backwards compatibility. This commit also adds int vs. uint support to the C++ interface, and the python bindings in a hopefully useful way.
2023-01-08Add support for OpenStep plist formatGravatar Nikias Bassen1-5/+49
2022-09-05Fix up warning with `-Wbad-function-cast`Gravatar Dave MacLachlan1-1/+4
2022-04-06Skip whitespace to properly detect format in plist_from_memory()Gravatar Nikias Bassen1-3/+8
2021-12-23Add support for JSON formatGravatar Nikias Bassen1-0/+6
2021-12-22Add a return value to plist_to_* and plist_from_* functionsGravatar Nikias Bassen1-7/+11
This way it can be easier determined why an import/export operation failed instead of just having a NULL result.
2021-12-19Add support for PLIST_NULL typeGravatar Nikias Bassen1-0/+9
2021-12-19Add new plist_mem_free() functionGravatar Nikias Bassen1-0/+8
Thanks to @azerg for bringing this to my attention. Instead of having multiple (internally identical) plist_*_free() functions, this commit introduces a single plist_mem_free() that can be used to free the memory allocated by plist_to_xml(), plist_to_bin(), plist_get_key_val(), plist_get_string_val(), and plist_get_data_val(). Note: This commit REMOVES plist_to_bin_free() and plist_to_xml_free().
2021-09-13Check availability of constructor attribute and use it on Windows in favor ↵Gravatar Nikias Bassen1-16/+23
of DllMain
2021-09-11windows: Make thread_once static and remove const qualifiers from ↵Gravatar Nikias Bassen1-3/+3
thread_once_t globals
2021-06-22[clang-tidy] Remove casts to the same typeGravatar Rosen Penev1-1/+1
Found with google-readability-casting Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-06-22[clang-tidy] Avoid global non-const variablesGravatar Rosen Penev1-2/+2
Found with cppcoreguidelines-avoid-non-const-global-variables Signed-off-by: Rosen Penev <rosenp@gmail.com>
2021-06-22[clang-tidy] Remove pointless constGravatar Rosen Penev1-1/+1
The const is actually misplaced. const plist_t evaluates to void *const instead of const void *. const qualification of the former makes no sense in function declarations. Found with misc-misplaced-const Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-11-24Improve code readability by not using else after returnGravatar Rosen Penev1-38/+40
[clang-tidy] Found with readability-else-after-return Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-06-08Remove whitespace errors from all filesGravatar Martin Szulecki1-1/+1
2020-06-03Remove pointless return in void functionsGravatar Rosen Penev1-10/+0
[clang-tidy] Found with readability-redundant-control-flow Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-05-26Make plist_bool_val_is_true() return 0 instead of -1 if node is NULL or not ↵Gravatar Nikias Bassen1-1/+1
a PLIST_BOOLEAN
2020-05-25Return NULL from plist_copy() if passed a NULL pointerGravatar Xiao Deng1-1/+1
This will prevent an assert if a NULL pointer is passed, and can make writing some code easier and cleaner without the need for a NULL check. For example, plist_copy(plist_dict_get_item(dict, "abc")) would give us a copy of the dict's node if the dict has a value for the given key, or NULL without any further checks.
2020-05-21Fix symbol mismatch between public header and interface (plist_bool_val_is_true)Gravatar Nikias Bassen1-1/+1
2020-05-11Suppress compiler warning about memmem on LinuxGravatar Nikias Bassen1-0/+1
2020-05-11Add plist_*_val_compare, plist_*_val_contains, etc. for the respective node ↵Gravatar Nikias Bassen1-0/+231
types ... except container node types like PLIST_ARRAY or PLIST_DICT.
2019-11-07Add plist_get_data_ptr() and plist_get_string_ptr() to the interfaceGravatar Nikias Bassen1-0/+25
2019-08-13plist: Remove unnecessary parameter from plist_copy_node()Gravatar Xiao Deng1-14/+6
2019-08-09Make sure to copy hash table entries properly when cloning array/dict nodesGravatar Nikias Bassen1-18/+22
As mentioned in #142, plist_copy_node() was not correctly handling the hash tables when cloning array or dict nodes; it incorrectly filled the hash table with the original child node info, which effectively would lead to a segmentation fault / UaF if the original array/dict would be freed followed by an attempt to access an element in the new hash table.
2019-05-20plist_set_key_val(): prevent setting a key value that already exists in a ↵Gravatar Nikias Bassen1-0/+5
PLIST_DICT
2019-05-20Add plist_dict_item_get_key() to allow retrieving the key node for a given ↵Gravatar Nikias Bassen1-0/+11
item of a #PLIST_DICT
2019-05-19Add plist_array_item_remove() to allow removing an array's child node ↵Gravatar Nikias Bassen1-0/+15
without relying on the index
2019-05-19plist_array_get_item_index(): return UINT_MAX instead of 0 when node can't ↵Gravatar Nikias Bassen1-1/+1
be found
2019-05-19Add index lookup table for large PLIST_ARRAY nodesGravatar Nikias Bassen1-11/+69
2019-05-16Ignore invalid input in plist_get_*_val() to prevent unnecessary assertionsGravatar Nikias Bassen1-19/+50
Also fixes #126 by skipping the strlen() in the assert() if for some reason NULL is returned as data
2019-01-21plist: Add iterator for #PLIST_ARRAY nodesGravatar Nikias Bassen1-4/+34
Similar to #PLIST_DICT, an iterator can now be used for #PLIST_ARRAY nodes. Get an iterator with plist_array_new_iter() and use plist_array_next_item() to iterate over the elements.