summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2004-11-17 23:43:31 +0000
committerIlia Alshanetsky <iliaa@php.net>2004-11-17 23:43:31 +0000
commit4bd84a5e6946f3d103919900d73a3c4c80b9defb (patch)
tree6d75f5abbe4da908902484332930fdbcfbd9044c
parentb5d739b88b229c7457dc658533647bf4a031114a (diff)
downloadphp-git-4bd84a5e6946f3d103919900d73a3c4c80b9defb.tar.gz
MFH: Gracefully handle allocation failure.
-rw-r--r--ext/dio/dio.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/ext/dio/dio.c b/ext/dio/dio.c
index 5315ef69b3..e81e966696 100644
--- a/ext/dio/dio.c
+++ b/ext/dio/dio.c
@@ -79,8 +79,10 @@ ZEND_GET_MODULE(dio)
static void _dio_close_fd(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
php_fd_t *f = (php_fd_t *) rsrc->ptr;
- close(f->fd);
- free(f);
+ if (f) {
+ close(f->fd);
+ free(f);
+ }
}
#define RDIOC(c) REGISTER_LONG_CONSTANT(#c, c, CONST_CS | CONST_PERSISTENT)
@@ -142,10 +144,13 @@ PHP_MINFO_FUNCTION(dio)
php_info_print_table_end();
}
-static void new_php_fd(php_fd_t **f, int fd)
+static int new_php_fd(php_fd_t **f, int fd)
{
- *f = malloc(sizeof(php_fd_t));
+ if (!(*f = malloc(sizeof(php_fd_t)))) {
+ return 0;
+ }
(*f)->fd = fd;
+ return 1;
}
/* {{{ proto resource dio_open(string filename, int flags[, int mode])
@@ -179,7 +184,10 @@ PHP_FUNCTION(dio_open)
RETURN_FALSE;
}
- new_php_fd(&f, fd);
+
+ if (!new_php_fd(&f, fd)) {
+ RETURN_FALSE;
+ }
ZEND_REGISTER_RESOURCE(return_value, f, le_fd);
}
/* }}} */
@@ -421,7 +429,9 @@ PHP_FUNCTION(dio_fcntl)
RETURN_FALSE;
}
- new_php_fd(&new_f, fcntl(f->fd, cmd, Z_LVAL_P(arg)));
+ if (!new_php_fd(&new_f, fcntl(f->fd, cmd, Z_LVAL_P(arg)))) {
+ RETURN_FALSE;
+ }
ZEND_REGISTER_RESOURCE(return_value, new_f, le_fd);
break;
}