diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 88f028e..8f39393 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -101,7 +101,11 @@ else () target_link_libraries ( airplay PUBLIC ${LIBPLIST} ) endif() if ( PLIST_FOUND ) - message( STATUS "found libplist-${PLIST_VERSION}" ) + message( STATUS "found libplist-${PLIST_VERSION}") + pkg_check_modules ( PLIST_23 libplist-2.0>=2.3.0 ) + if ( PLIST_23_FOUND ) + add_definitions( -DPLIST_23 ) + endif() endif() target_include_directories( airplay PRIVATE ${PLIST_INCLUDE_DIRS} ) diff --git a/lib/raop.c b/lib/raop.c index dbc5eca..bee8f7c 100644 --- a/lib/raop.c +++ b/lib/raop.c @@ -307,12 +307,22 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { if (data_is_plist) { plist_t req_root_node = NULL; plist_from_bin(request_data, request_datalen, &req_root_node); - char * plist_xml; + char * plist_xml = NULL; + char * stripped_xml = NULL; uint32_t plist_len; plist_to_xml(req_root_node, &plist_xml, &plist_len); - plist_xml = utils_strip_data_from_plist_xml(plist_xml); - logger_log(conn->raop->logger, LOGGER_DEBUG, "%s", plist_xml); - free(plist_xml); + stripped_xml = utils_strip_data_from_plist_xml(plist_xml); + logger_log(conn->raop->logger, LOGGER_DEBUG, "%s", (stripped_xml ? stripped_xml : plist_xml)); + if (stripped_xml) { + free(stripped_xml); + } + if (plist_xml) { +#ifdef PLIST_230 + plist_mem_free(plist_xml); +#else + plist_to_xml_free(plist_xml); +#endif + } plist_free(req_root_node); } else if (data_is_text) { char *data_str = utils_data_to_text((char *) request_data, request_datalen); @@ -442,12 +452,22 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { if (data_is_plist) { plist_t res_root_node = NULL; plist_from_bin(response_data, response_datalen, &res_root_node); - char * plist_xml; + char * plist_xml = NULL; + char * stripped_xml = NULL; uint32_t plist_len; plist_to_xml(res_root_node, &plist_xml, &plist_len); - plist_xml = utils_strip_data_from_plist_xml(plist_xml); - logger_log(conn->raop->logger, LOGGER_DEBUG, "%s", plist_xml); - free(plist_xml); + stripped_xml = utils_strip_data_from_plist_xml(plist_xml); + logger_log(conn->raop->logger, LOGGER_DEBUG, "%s", (stripped_xml ? stripped_xml : plist_xml)); + if (stripped_xml) { + free(stripped_xml); + } + if (plist_xml) { +#ifdef PLIST_230 + plist_mem_free(plist_xml); +#else + plist_to_xml_free(plist_xml); +#endif + } plist_free(res_root_node); } else if (data_is_text) { char *data_str = utils_data_to_text((char*) response_data, response_datalen); diff --git a/lib/utils.c b/lib/utils.c index ac2eee8..0eb5624 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -284,7 +284,7 @@ int utils_ipaddress_to_string(int addresslen, const unsigned char *address, unsi } char *utils_strip_data_from_plist_xml(char *plist_xml) { - /* returns pointer to *plist_xml unchanged if no data needs to be stripped out. + /* returns NULL if no data needs to be stripped out. * otherwise frees plist_xml and returns pointer to newly-allocated stripped text char *xml * WHICH (like plist_xml) MUST BE FREED AFTER USE*/ assert(plist_xml); @@ -292,20 +292,19 @@ char *utils_strip_data_from_plist_xml(char *plist_xml) { char *last = plist_xml + len * sizeof(char); // position of null termination of plist_xml char *eol; - char *xml; + char *eol_data; + char *xml = NULL; int nchars; char line[81]; int count; char *begin = strstr(plist_xml, ""); char *end; - if (!begin) { /* there are no data lines, nothing to do */ - return plist_xml; + return NULL; } else { xml = (char *) calloc((len + 1), sizeof(char)); } - char *ptr1 = plist_xml; char *ptr2 = xml; do { @@ -318,17 +317,23 @@ char *utils_strip_data_from_plist_xml(char *plist_xml) { assert(end); count = 0; do { - ptr1 = eol + 1; - eol = strchr(ptr1, '\n'); + eol_data = eol; + eol = strchr(eol + 1, '\n'); count++; } while (eol < end); count--; // last '\n' counted ends the first non-data line (contains "") - if (count) { - snprintf(line, sizeof(line), " ... (%d line%s of base64-encoded data not shown, 64 chars/line) ...\n", - count, (count == 1 ? "" : "s")); - } - memcpy(ptr2, line, strlen(line)); - ptr2 += strlen(line); + if (count > 1) { + snprintf(line, sizeof(line), " (%d lines data omitted, 64 chars/line)\n", count); + nchars = strlen(line); + memcpy(ptr2, line, nchars); + ptr2 += nchars; + ptr1 = eol_data + 1; + } else { + nchars = eol_data + 1 - ptr1; + memcpy(ptr2, ptr1, nchars); + ptr2 += nchars; + ptr1 += nchars; + } begin = strstr(ptr1, ""); if (begin == NULL) { nchars = (int) (last + 1 - ptr1); @@ -336,8 +341,6 @@ char *utils_strip_data_from_plist_xml(char *plist_xml) { break; } } while (ptr1 <= last); - - free (plist_xml); return xml; }