Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Cleanup and sanity-checking of use of strncpy/strcpy (Coverity static analysis)
[palacios.git] / linux_module / iface-file.c
index 062a6d2..92ed9ff 100644 (file)
@@ -49,8 +49,14 @@ static int mkdir_recursive(const char * path, unsigned short perms) {
     char * dirname_ptr;
     char * tmp_iter;
 
-    tmp_str = kmalloc(strlen(path) + 1, GFP_KERNEL);
+    tmp_str = palacios_alloc(strlen(path) + 1);
+    if (!tmp_str) { 
+       ERROR("Cannot allocate in mkdir recursive\n");
+       return -1;
+    }
+
     memset(tmp_str, 0, strlen(path) + 1);
+    // will terminate tmp_str
     strncpy(tmp_str, path, strlen(path));
 
     dirname_ptr = tmp_str;
@@ -67,6 +73,7 @@ static int mkdir_recursive(const char * path, unsigned short perms) {
 
            if ( (!isprint(*tmp_iter))) {
                ERROR("Invalid character in path name (%d)\n", *tmp_iter);
+               palacios_free(tmp_str);
                return -1;
            } else {
                tmp_iter++;
@@ -83,6 +90,7 @@ static int mkdir_recursive(const char * path, unsigned short perms) {
        if ((tmp_iter - dirname_ptr) > 1) {
            if (palacios_file_mkdir(tmp_str, perms, 0) != 0) {
                ERROR("Could not create directory (%s)\n", tmp_str);
+               palacios_free(tmp_str);
                return -1;
            }
        }
@@ -98,7 +106,7 @@ static int mkdir_recursive(const char * path, unsigned short perms) {
        dirname_ptr = tmp_iter;
     }
     
-    kfree(tmp_str);
+    palacios_free(tmp_str);
 
     return 0;
 }
@@ -154,7 +162,7 @@ static int palacios_file_mkdir(const char * pathname, unsigned short perms, int
     {
        dentry = kern_path_create(AT_FDCWD, pathname, &tmp_path, 1);
        
-       if (IS_ERR(dentry)) {
+       if (!dentry || IS_ERR(dentry)) {
            return 0;
        }
        
@@ -163,7 +171,7 @@ static int palacios_file_mkdir(const char * pathname, unsigned short perms, int
 #endif    
 
 
-    if (!IS_ERR(dentry)) {
+    if (!(!dentry || IS_ERR(dentry))) {
        ret = vfs_mkdir(path_ptr->dentry->d_inode, dentry, perms);
     }
 
@@ -188,7 +196,11 @@ static void * palacios_file_open(const char * path, int mode, void * private_dat
        }
     }
     
-    pfile = kmalloc(sizeof(struct palacios_file), GFP_KERNEL);
+    pfile = palacios_alloc(sizeof(struct palacios_file));
+    if (!pfile) { 
+       ERROR("Cannot allocate in file open\n");
+       return NULL;
+    }
     memset(pfile, 0, sizeof(struct palacios_file));
 
     if ((mode & FILE_OPEN_MODE_READ) && (mode & FILE_OPEN_MODE_WRITE)) { 
@@ -207,18 +219,26 @@ static void * palacios_file_open(const char * path, int mode, void * private_dat
     pfile->mode |= O_LARGEFILE;
 
 
-    pfile->filp = filp_open(path, pfile->mode, 0);
+    pfile->filp = filp_open(path, pfile->mode, 0600);  // rw------- to start
     
-    if (IS_ERR(pfile->filp)) {
+    if (!pfile->filp || IS_ERR(pfile->filp)) {
        ERROR("Cannot open file: %s\n", path);
+       palacios_free(pfile);
        return NULL;
     }
 
-    pfile->path = kmalloc(strlen(path) + 1, GFP_KERNEL);
-    strncpy(pfile->path, path, strlen(path));
+    pfile->path = palacios_alloc(strlen(path) + 1);
+    
+    if (!pfile->path) { 
+       ERROR("Cannot allocate in file open\n");
+       filp_close(pfile->filp,NULL);
+       palacios_free(pfile);
+       return NULL;
+    }
+    strncpy(pfile->path, path, strlen(path)); // will terminate pfile->path
     pfile->guest = guest;
     
-    spin_lock_init(&(pfile->lock));
+    palacios_spinlock_init(&(pfile->lock));
 
     if (guest == NULL) {
        list_add(&(pfile->file_node), &(global_files));
@@ -233,12 +253,18 @@ static void * palacios_file_open(const char * path, int mode, void * private_dat
 static int palacios_file_close(void * file_ptr) {
     struct palacios_file * pfile = (struct palacios_file *)file_ptr;
 
+    if (!pfile) {
+        return -1;
+    }
+
     filp_close(pfile->filp, NULL);
     
     list_del(&(pfile->file_node));
 
-    kfree(pfile->path);    
-    kfree(pfile);
+    palacios_spinlock_deinit(&(pfile->lock));
+
+    palacios_free(pfile->path);    
+    palacios_free(pfile);
 
     return 0;
 }
@@ -323,15 +349,27 @@ static int file_init( void ) {
 
 
 static int file_deinit( void ) {
-    if (!list_empty(&(global_files))) {
-       ERROR("Error removing module with open files\n");
+    struct palacios_file * pfile = NULL;
+    struct palacios_file * tmp = NULL;
+    
+    list_for_each_entry_safe(pfile, tmp, &(global_files), file_node) { 
+        filp_close(pfile->filp, NULL);
+        list_del(&(pfile->file_node));
+        palacios_free(pfile->path);    
+        palacios_free(pfile);
     }
 
     return 0;
 }
 
 static int guest_file_init(struct v3_guest * guest, void ** vm_data) {
-    struct vm_file_state * state = kmalloc(sizeof(struct vm_file_state), GFP_KERNEL);
+    struct vm_file_state * state = palacios_alloc(sizeof(struct vm_file_state));
+
+    if (!state) {
+       ERROR("Cannot allocate when intializing file services for guest\n");
+       return -1;
+    }
+       
     
     INIT_LIST_HEAD(&(state->open_files));
 
@@ -343,8 +381,18 @@ static int guest_file_init(struct v3_guest * guest, void ** vm_data) {
 
 
 static int guest_file_deinit(struct v3_guest * guest, void * vm_data) {
+    struct vm_file_state * state = (struct vm_file_state *)vm_data;
+    struct palacios_file * pfile = NULL;
+    struct palacios_file * tmp = NULL;
     
-    kfree(vm_data);
+    list_for_each_entry_safe(pfile, tmp, &(state->open_files), file_node) { 
+        filp_close(pfile->filp, NULL);
+        list_del(&(pfile->file_node));
+        palacios_free(pfile->path);    
+        palacios_free(pfile);
+    }
+
+    palacios_free(state);
     return 0;
 }