summaryrefslogtreecommitdiff
path: root/procfs.c
diff options
context:
space:
mode:
authorJeremie Koenig <jk@jk.fr.eu.org>2010-08-23 11:33:22 +0000
committerJeremie Koenig <jk@jk.fr.eu.org>2010-08-30 14:31:31 +0200
commit6e202c432e2f16dfa83a7dc21b759c03623fa394 (patch)
tree4b3a656b37a78f89ce85082c5e754d83e4c24e45 /procfs.c
parent0f2bdacd6ad3dbcc905925dee12cb30918c33a11 (diff)
Detect asprintf's ENOMEM in procfs.c rather than everywhere
* procfs.h: Make CONTENTS_LEN an ssize_t rather than a size_t, and document the change. * procfs.c (procfs_get_contents): Initialize CONTENTS_LEN to a negative value, and fail with ENOMEM if it's still negative after the callback returns. (everywhere): Update to ssize_t. * dircat.c, netfs.c, process.c, procfs_dir.c, proclist.c, rootdir.c: Update to ssize_t and the new GET_CONTENTS semantics.
Diffstat (limited to 'procfs.c')
-rw-r--r--procfs.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/procfs.c b/procfs.c
index a5f52b5..6d15e4f 100644
--- a/procfs.c
+++ b/procfs.c
@@ -13,20 +13,20 @@ struct netnode
/* (cached) contents of the node */
char *contents;
- size_t contents_len;
+ ssize_t contents_len;
/* parent directory, if applicable */
struct node *parent;
};
void
-procfs_cleanup_contents_with_free (void *hook, char *cont, size_t len)
+procfs_cleanup_contents_with_free (void *hook, char *cont, ssize_t len)
{
free (cont);
}
void
-procfs_cleanup_contents_with_vm_deallocate (void *hook, char *cont, size_t len)
+procfs_cleanup_contents_with_vm_deallocate (void *hook, char *cont, ssize_t len)
{
vm_deallocate (mach_task_self (), (vm_address_t) cont, (vm_size_t) len);
}
@@ -109,7 +109,7 @@ procfs_make_ino (struct node *np, const char *filename)
return (unsigned long) jrand48 (x);
}
-error_t procfs_get_contents (struct node *np, char **data, size_t *data_len)
+error_t procfs_get_contents (struct node *np, char **data, ssize_t *data_len)
{
if (np->nn->ops->enable_refresh_hack_and_break_readdir && np->nn->contents)
{
@@ -122,12 +122,15 @@ error_t procfs_get_contents (struct node *np, char **data, size_t *data_len)
if (! np->nn->contents && np->nn->ops->get_contents)
{
char *contents;
- size_t contents_len;
+ ssize_t contents_len;
error_t err;
+ contents_len = -1;
err = np->nn->ops->get_contents (np->nn->hook, &contents, &contents_len);
if (err)
return err;
+ if (contents_len < 0)
+ return ENOMEM;
np->nn->contents = contents;
np->nn->contents_len = contents_len;