From 1b062b32391b5ec34652853eddaa79ab9d625cc1 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Sun, 7 Jan 2001 17:06:26 +0000 Subject: 2000-12-21 Marcus Brinkmann * rr.c (rrip_work): Use strdup instead malloc and strcpy. Assert that strdup and malloc (for rr->trans) succeeds. * pager.c: Include . (create_disk_pager): If malloc fails, exit with error. * main.c (read_sblock): Fail if malloc does. * inode.c (diskfs_cached_lookup): When allocating memory for dn or np fails, release spinlock, rrip (and allocated memory) and return ENOMEM. (load_inode): Likewise (but no rrip). Also, if *npp is non-zero, release diskfs_node_refcnt_lock before returning. Reported by Igor Khavkine . --- isofs/inode.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'isofs/inode.c') diff --git a/isofs/inode.c b/isofs/inode.c index 2aa73a93..f3b04c7d 100644 --- a/isofs/inode.c +++ b/isofs/inode.c @@ -188,10 +188,23 @@ diskfs_cached_lookup (int id, struct node **npp) assert (!(rr.valid & VALID_CL)); dn = malloc (sizeof (struct disknode)); + if (!dn) + { + spin_unlock (&diskfs_node_refcnt_lock); + release_rrip (&rr); + return ENOMEM; + } dn->fileinfo = 0; dn->dr = c->dr; dn->file_start = c->file_start; np = diskfs_make_node (dn); + if (!np) + { + free (dn); + spin_unlock (&diskfs_node_refcnt_lock); + release_rrip (&rr); + return ENOMEM; + } np->cache_id = id + 1; /* see above for rationale for increment */ mutex_lock (&np->lock); c->np = np; @@ -327,15 +340,29 @@ load_inode (struct node **npp, struct dirrect *record, inode_cache_find ((off_t) ((void *) record - (void *) disk_image), npp); if (*npp) - return 0; + { + spin_unlock (&diskfs_node_refcnt_lock); + return 0; + } /* Create a new node */ dn = malloc (sizeof (struct disknode)); + if (!dn) + { + spin_unlock (&diskfs_node_refcnt_lock); + return ENOMEM; + } dn->fileinfo = 0; dn->dr = record; dn->file_start = file_start; np = diskfs_make_node (dn); + if (!np) + { + free (dn); + spin_unlock (&diskfs_node_refcnt_lock); + return ENOMEM; + } mutex_lock (&np->lock); -- cgit v1.2.3