summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpiano/src/crypt.c9
-rw-r--r--libpiano/src/main.c111
-rw-r--r--libpiano/src/main.h1
-rw-r--r--libpiano/src/xml.c5
4 files changed, 71 insertions, 55 deletions
diff --git a/libpiano/src/crypt.c b/libpiano/src/crypt.c
index 10744e0..c4871dc 100644
--- a/libpiano/src/crypt.c
+++ b/libpiano/src/crypt.c
@@ -26,6 +26,7 @@ THE SOFTWARE.
#include "crypt_key_output.h"
#include "crypt_key_input.h"
+#include "main.h"
/* hex string to array of unsigned int values
* @param hex string
@@ -133,8 +134,8 @@ char *PianoDecryptString (char *strInput) {
PianoDecipherInts (cipherInts, cipherIntsN, &plainInts);
strDecrypted = PianoIntsToString (plainInts, cipherIntsN);
- free (cipherInts);
- free (plainInts);
+ PianoFree (cipherInts, cipherIntsN * sizeof (*cipherInts));
+ PianoFree (plainInts, cipherIntsN * sizeof (*plainInts));
return strDecrypted;
}
@@ -258,8 +259,8 @@ char *PianoEncryptString (char *strInput) {
PianoEncipherInts (plainInts, plainIntsN, &cipherInts);
strHex = PianoIntsToHexString (cipherInts, plainIntsN);
- free (plainInts);
- free (cipherInts);
+ PianoFree (plainInts, plainIntsN * sizeof (*plainInts));
+ PianoFree (cipherInts, plainIntsN * sizeof (*cipherInts));
return strHex;
}
diff --git a/libpiano/src/main.c b/libpiano/src/main.c
index 1d5a6d0..0659283 100644
--- a/libpiano/src/main.c
+++ b/libpiano/src/main.c
@@ -32,6 +32,23 @@ THE SOFTWARE.
#include "xml.h"
#include "crypt.h"
+/* more "secure" free version; only use this function, not original free ()
+ * in this library
+ * @public no!!!
+ * @param free this pointer
+ * @param zero n bytes; 0 disables zeroing (for strings with unknown size,
+ * e.g.)
+ */
+void PianoFree (void *ptr, size_t size) {
+ if (ptr != NULL) {
+ if (size > 0) {
+ /* avoid reuse of freed memory */
+ memset ((char *) ptr, 0, size);
+ }
+ free (ptr);
+ }
+}
+
/* initialize piano handle, set up curl handle and settings; note: you
* _must_ init curl and libxml2 using curl_global_init (CURL_GLOBAL_SSL)
* and xmlInitParser (), you also _must_ cleanup their garbage on your own!
@@ -57,23 +74,21 @@ void PianoDestroySearchResult (PianoSearchResult_t *searchResult) {
curArtist = searchResult->artists;
while (curArtist != NULL) {
- free (curArtist->name);
- free (curArtist->musicId);
+ PianoFree (curArtist->name, 0);
+ PianoFree (curArtist->musicId, 0);
lastArtist = curArtist;
curArtist = curArtist->next;
- memset (lastArtist, 0, sizeof (*lastArtist));
- free (lastArtist);
+ PianoFree (lastArtist, sizeof (*lastArtist));
}
curSong = searchResult->songs;
while (curSong != NULL) {
- free (curSong->title);
- free (curSong->artist);
- free (curSong->musicId);
+ PianoFree (curSong->title, 0);
+ PianoFree (curSong->artist, 0);
+ PianoFree (curSong->musicId, 0);
lastSong = curSong;
curSong = curSong->next;
- memset (lastSong, 0, sizeof (*lastSong));
- free (lastSong);
+ PianoFree (lastSong, sizeof (*lastSong));
}
}
@@ -82,8 +97,8 @@ void PianoDestroySearchResult (PianoSearchResult_t *searchResult) {
* @param station
*/
void PianoDestroyStation (PianoStation_t *station) {
- free (station->name);
- free (station->id);
+ PianoFree (station->name, 0);
+ PianoFree (station->id, 0);
memset (station, 0, sizeof (station));
}
@@ -98,7 +113,7 @@ void PianoDestroyStations (PianoHandle_t *ph) {
lastStation = curStation;
curStation = curStation->next;
PianoDestroyStation (lastStation);
- free (lastStation);
+ PianoFree (lastStation, sizeof (*lastStation));
}
ph->stations = NULL;
}
@@ -113,17 +128,16 @@ void PianoDestroyPlaylist (PianoHandle_t *ph) {
curSong = ph->playlist;
while (curSong != NULL) {
- free (curSong->audioUrl);
- free (curSong->artist);
- free (curSong->focusTraitId);
- free (curSong->matchingSeed);
- free (curSong->musicId);
- free (curSong->title);
- free (curSong->userSeed);
+ PianoFree (curSong->audioUrl, 0);
+ PianoFree (curSong->artist, 0);
+ PianoFree (curSong->focusTraitId, 0);
+ PianoFree (curSong->matchingSeed, 0);
+ PianoFree (curSong->musicId, 0);
+ PianoFree (curSong->title, 0);
+ PianoFree (curSong->userSeed, 0);
lastSong = curSong;
curSong = curSong->next;
- memset (lastSong, 0, sizeof (*lastSong));
- free (lastSong);
+ PianoFree (lastSong, sizeof (*lastSong));
}
ph->playlist = NULL;
}
@@ -136,10 +150,9 @@ void PianoDestroyPlaylist (PianoHandle_t *ph) {
*/
void PianoDestroy (PianoHandle_t *ph) {
curl_easy_cleanup (ph->curlHandle);
- /* FIXME: only free if pointer != NULL */
- free (ph->user.webAuthToken);
- free (ph->user.authToken);
- free (ph->user.listenerId);
+ PianoFree (ph->user.webAuthToken, 0);
+ PianoFree (ph->user.authToken, 0);
+ PianoFree (ph->user.listenerId, 0);
PianoDestroyStations (ph);
PianoDestroyPlaylist (ph);
@@ -163,8 +176,8 @@ PianoReturn_t PianoConnect (PianoHandle_t *ph, char *user, char *password) {
snprintf (url, sizeof (url), PIANO_RPC_URL "rid=%s&method=sync",
ph->routeId);
PianoHttpPost (ph->curlHandle, url, requestStr, &retStr);
- free (requestStr);
- free (retStr);
+ PianoFree (requestStr, 0);
+ PianoFree (retStr, 0);
/* authenticate */
snprintf (requestStrPlain, sizeof (requestStrPlain),
@@ -180,8 +193,8 @@ PianoReturn_t PianoConnect (PianoHandle_t *ph, char *user, char *password) {
PianoHttpPost (ph->curlHandle, url, requestStr, &retStr);
ret = PianoXmlParseUserinfo (ph, retStr);
- free (requestStr);
- free (retStr);
+ PianoFree (requestStr, 0);
+ PianoFree (retStr, 0);
return ret;
}
@@ -206,8 +219,8 @@ PianoReturn_t PianoGetStations (PianoHandle_t *ph) {
ph->user.listenerId);
PianoHttpPost (ph->curlHandle, url, requestStr, &retStr);
ret = PianoXmlParseStations (ph, retStr);
- free (retStr);
- free (requestStr);
+ PianoFree (retStr, 0);
+ PianoFree (requestStr, 0);
return ret;
}
@@ -241,8 +254,8 @@ PianoReturn_t PianoGetPlaylist (PianoHandle_t *ph, char *stationId) {
ph->user.listenerId, stationId);
PianoHttpPost (ph->curlHandle, url, requestStr, &retStr);
ret = PianoXmlParsePlaylist (ph, retStr);
- free (retStr);
- free (requestStr);
+ PianoFree (retStr, 0);
+ PianoFree (requestStr, 0);
return ret;
}
@@ -291,8 +304,8 @@ PianoReturn_t PianoRateTrack (PianoHandle_t *ph, PianoStation_t *station,
song->rating = rating;
}
- free (requestStr);
- free (retStr);
+ PianoFree (requestStr, 0);
+ PianoFree (retStr, 0);
return ret;
}
@@ -329,14 +342,14 @@ PianoReturn_t PianoRenameStation (PianoHandle_t *ph, PianoStation_t *station,
ret = PianoXmlParseSimple (retStr);
if (ret == PIANO_RET_OK) {
- free (station->name);
+ PianoFree (station->name, 0);
station->name = strdup (newName);
}
curl_free (urlencodedNewName);
- free (xmlencodedNewName);
- free (requestStr);
- free (retStr);
+ PianoFree (xmlencodedNewName, 0);
+ PianoFree (requestStr, 0);
+ PianoFree (retStr, 0);
return ret;
}
@@ -379,15 +392,15 @@ PianoReturn_t PianoDeleteStation (PianoHandle_t *ph, PianoStation_t *station) {
ph->stations = curStation->next;
}
PianoDestroyStation (curStation);
- free (curStation);
+ PianoFree (curStation, sizeof (*curStation));
}
lastStation = curStation;
curStation = curStation->next;
}
}
- free (requestStr);
- free (retStr);
+ PianoFree (requestStr, 0);
+ PianoFree (retStr, 0);
return ret;
}
@@ -425,9 +438,9 @@ PianoReturn_t PianoSearchMusic (PianoHandle_t *ph, char *searchStr,
ret = PianoXmlParseSearch (retStr, searchResult);
curl_free (urlencodedSearchStr);
- free (xmlencodedSearchStr);
- free (retStr);
- free (requestStr);
+ PianoFree (xmlencodedSearchStr, 0);
+ PianoFree (retStr, 0);
+ PianoFree (requestStr, 0);
return ret;
}
@@ -459,8 +472,8 @@ PianoReturn_t PianoCreateStation (PianoHandle_t *ph, char *musicId) {
PianoHttpPost (ph->curlHandle, url, requestStr, &retStr);
ret = PianoXmlParseCreateStation (ph, retStr);
- free (requestStr);
- free (retStr);
+ PianoFree (requestStr, 0);
+ PianoFree (retStr, 0);
return ret;
}
@@ -497,8 +510,8 @@ PianoReturn_t PianoStationAddMusic (PianoHandle_t *ph,
PianoHttpPost (ph->curlHandle, url, requestStr, &retStr);
ret = PianoXmlParseAddSeed (ph, retStr, station);
- free (requestStr);
- free (retStr);
+ PianoFree (requestStr, 0);
+ PianoFree (retStr, 0);
return ret;
}
diff --git a/libpiano/src/main.h b/libpiano/src/main.h
index 1746e53..50edec4 100644
--- a/libpiano/src/main.h
+++ b/libpiano/src/main.h
@@ -23,5 +23,6 @@ THE SOFTWARE.
#ifndef _MAIN_H
#define _MAIN_H
+void PianoFree (void *ptr, size_t size);
#endif /* _MAIN_H */
diff --git a/libpiano/src/xml.c b/libpiano/src/xml.c
index 2d9e82d..2613f40 100644
--- a/libpiano/src/xml.c
+++ b/libpiano/src/xml.c
@@ -29,6 +29,7 @@ THE SOFTWARE.
#include "piano.h"
#include "crypt.h"
#include "config.h"
+#include "main.h"
void PianoXmlStructParser (xmlNode *structRoot,
void (*callback) (char *, xmlNode *, void *), void *data);
@@ -65,7 +66,7 @@ void PianoXmlIsFaultCb (char *key, xmlNode *value, void *data) {
printf (PACKAGE ": Unknown error %s in %s\n",
matchStr, valueStr);
}
- free (matchStr);
+ PianoFree (matchStr, 0);
}
}
}
@@ -228,7 +229,7 @@ void PianoXmlParsePlaylistCb (char *key, xmlNode *value, void *data) {
/* FIXME: the key seems to be broken... so ignore 8 x 0x08 postfix;
* urlTailN/2 because the encrypted hex string is now decoded */
strncat (song->audioUrl, urlTail, (urlTailN/2)-8);
- free (urlTail);
+ PianoFree (urlTail, 0);
} else if (strcmp ("artistSummary", key) == 0) {
song->artist = strdup (valueStr);