aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/directory.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/src/directory.c b/src/directory.c
index d15894633..4ad281c43 100644
--- a/src/directory.c
+++ b/src/directory.c
@@ -449,14 +449,29 @@ Directory * addDirectoryPathToDB(char * utf8path, char ** shortname) {
if(strlen(parent)==0) parentDirectory = (void *)mp3rootDirectory;
else parentDirectory = addDirectoryPathToDB(parent,shortname);
+ if(!parentDirectory) {
+ free(parent);
+ return NULL;
+ }
+
*shortname = utf8path+strlen(parent);
while(*(*shortname) && *(*shortname)=='/') (*shortname)++;
if(!findInList(parentDirectory->subDirectories,*shortname, &directory))
{
- directory = newDirectory(utf8path, parentDirectory);
- insertInList(parentDirectory->subDirectories,*shortname,
- directory);
+ struct stat st;
+ if(myStat(utf8path, &st) < 0 ||
+ inodeFoundInParent(parentDirectory,
+ st.st_ino, st.st_dev))
+ {
+ free(parent);
+ return NULL;
+ }
+ else {
+ directory = newDirectory(utf8path, parentDirectory);
+ insertInList(parentDirectory->subDirectories,*shortname,
+ directory);
+ }
}
/* if we're adding directory paths, make sure to delete filenames
@@ -465,7 +480,7 @@ Directory * addDirectoryPathToDB(char * utf8path, char ** shortname) {
free(parent);
- return (Directory *)parentDirectory;
+ return (Directory *)directory;
}
Directory * addParentPathToDB(char * utf8path, char ** shortname) {
@@ -477,6 +492,11 @@ Directory * addParentPathToDB(char * utf8path, char ** shortname) {
if(strlen(parent)==0) parentDirectory = (void *)mp3rootDirectory;
else parentDirectory = addDirectoryPathToDB(parent,shortname);
+ if(!parentDirectory) {
+ free(parent);
+ return NULL;
+ }
+
*shortname = utf8path+strlen(parent);
while(*(*shortname) && *(*shortname)=='/') (*shortname)++;
@@ -562,15 +582,17 @@ int updatePath(char * utf8path) {
*/
if(isDir(path) || isMusic(path,NULL)) {
parentDirectory = addParentPathToDB(path,&shortname);
- if(!parentDirectory->stat && statDirectory(parentDirectory) < 0)
+ if(!parentDirectory || (
+ !parentDirectory->stat &&
+ statDirectory(parentDirectory) < 0))
{
}
- else if(inodeFoundInParent(parentDirectory->parent,
+ else if(0 == inodeFoundInParent(parentDirectory->parent,
parentDirectory->stat->inode,
- parentDirectory->stat->device))
+ parentDirectory->stat->device) &&
+ addToDirectory(parentDirectory, shortname, path)
+ >0)
{
- }
- else if(addToDirectory(parentDirectory,shortname,path)>0) {
ret = 1;
}
}