summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorRichard Yao <[email protected]>2013-02-14 23:37:43 -0500
committerBrian Behlendorf <[email protected]>2013-03-04 08:49:32 -0800
commitb01615d5ac86913da1e092d0378bfb8f0e72af30 (patch)
tree905cd8431cce678140c8e3d1bbf35800cffe4e66 /module
parentc38367c73f592ca9729ba0d5e70b5e3bc67e0745 (diff)
Constify structures containing function pointers
The PaX team modified the kernel's modpost to report writeable function pointers as section mismatches because they are potential exploit targets. We could ignore the warnings, but their presence can obscure actual issues. Proper const correctness can also catch programming mistakes. Building the kernel modules against a PaX/GrSecurity patched Linux 3.4.2 kernel reports 133 section mismatches prior to this patch. This patch eliminates 130 of them. The quantity of writeable function pointers eliminated by constifying each structure is as follows: vdev_opts_t 52 zil_replay_func_t 24 zio_compress_info_t 24 zio_checksum_info_t 9 space_map_ops_t 7 arc_byteswap_func_t 5 The remaining 3 writeable function pointers cannot be addressed by this patch. 2 of them are in zpl_fs_type. The kernel's sget function requires that this be non-const. The final writeable function pointer is created by SPL_SHRINKER_DECLARE. The kernel's set_shrinker() and remove_shrinker() functions also require that this be non-const. Signed-off-by: Richard Yao <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #1300
Diffstat (limited to 'module')
-rw-r--r--module/zfs/arc.c8
-rw-r--r--module/zfs/sa.c2
-rw-r--r--module/zfs/zfs_replay.c44
-rw-r--r--module/zfs/zil.c4
-rw-r--r--module/zfs/zvol.c28
5 files changed, 43 insertions, 43 deletions
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
index b7499ee96..da070cd26 100644
--- a/module/zfs/arc.c
+++ b/module/zfs/arc.c
@@ -2802,10 +2802,10 @@ arc_read_done(zio_t *zio)
if (BP_SHOULD_BYTESWAP(zio->io_bp) && zio->io_error == 0) {
dmu_object_byteswap_t bswap =
DMU_OT_BYTESWAP(BP_GET_TYPE(zio->io_bp));
- arc_byteswap_func_t *func = BP_GET_LEVEL(zio->io_bp) > 0 ?
- byteswap_uint64_array :
- dmu_ot_byteswap[bswap].ob_func;
- func(buf->b_data, hdr->b_size);
+ if (BP_GET_LEVEL(zio->io_bp) > 0)
+ byteswap_uint64_array(buf->b_data, hdr->b_size);
+ else
+ dmu_ot_byteswap[bswap].ob_func(buf->b_data, hdr->b_size);
}
arc_cksum_compute(buf, B_FALSE);
diff --git a/module/zfs/sa.c b/module/zfs/sa.c
index f4d264f71..581cf4b0d 100644
--- a/module/zfs/sa.c
+++ b/module/zfs/sa.c
@@ -136,7 +136,7 @@ static int sa_modify_attrs(sa_handle_t *hdl, sa_attr_type_t newattr,
sa_data_op_t action, sa_data_locator_t *locator, void *datastart,
uint16_t buflen, dmu_tx_t *tx);
-arc_byteswap_func_t *sa_bswap_table[] = {
+arc_byteswap_func_t sa_bswap_table[] = {
byteswap_uint64_array,
byteswap_uint32_array,
byteswap_uint16_array,
diff --git a/module/zfs/zfs_replay.c b/module/zfs/zfs_replay.c
index aa6366e11..813250c37 100644
--- a/module/zfs/zfs_replay.c
+++ b/module/zfs/zfs_replay.c
@@ -910,26 +910,26 @@ zfs_replay_acl(zfs_sb_t *zsb, lr_acl_t *lr, boolean_t byteswap)
/*
* Callback vectors for replaying records
*/
-zil_replay_func_t *zfs_replay_vector[TX_MAX_TYPE] = {
- (zil_replay_func_t *)zfs_replay_error, /* no such type */
- (zil_replay_func_t *)zfs_replay_create, /* TX_CREATE */
- (zil_replay_func_t *)zfs_replay_create, /* TX_MKDIR */
- (zil_replay_func_t *)zfs_replay_create, /* TX_MKXATTR */
- (zil_replay_func_t *)zfs_replay_create, /* TX_SYMLINK */
- (zil_replay_func_t *)zfs_replay_remove, /* TX_REMOVE */
- (zil_replay_func_t *)zfs_replay_remove, /* TX_RMDIR */
- (zil_replay_func_t *)zfs_replay_link, /* TX_LINK */
- (zil_replay_func_t *)zfs_replay_rename, /* TX_RENAME */
- (zil_replay_func_t *)zfs_replay_write, /* TX_WRITE */
- (zil_replay_func_t *)zfs_replay_truncate, /* TX_TRUNCATE */
- (zil_replay_func_t *)zfs_replay_setattr, /* TX_SETATTR */
- (zil_replay_func_t *)zfs_replay_acl_v0, /* TX_ACL_V0 */
- (zil_replay_func_t *)zfs_replay_acl, /* TX_ACL */
- (zil_replay_func_t *)zfs_replay_create_acl, /* TX_CREATE_ACL */
- (zil_replay_func_t *)zfs_replay_create, /* TX_CREATE_ATTR */
- (zil_replay_func_t *)zfs_replay_create_acl, /* TX_CREATE_ACL_ATTR */
- (zil_replay_func_t *)zfs_replay_create_acl, /* TX_MKDIR_ACL */
- (zil_replay_func_t *)zfs_replay_create, /* TX_MKDIR_ATTR */
- (zil_replay_func_t *)zfs_replay_create_acl, /* TX_MKDIR_ACL_ATTR */
- (zil_replay_func_t *)zfs_replay_write2, /* TX_WRITE2 */
+zil_replay_func_t zfs_replay_vector[TX_MAX_TYPE] = {
+ (zil_replay_func_t)zfs_replay_error, /* no such type */
+ (zil_replay_func_t)zfs_replay_create, /* TX_CREATE */
+ (zil_replay_func_t)zfs_replay_create, /* TX_MKDIR */
+ (zil_replay_func_t)zfs_replay_create, /* TX_MKXATTR */
+ (zil_replay_func_t)zfs_replay_create, /* TX_SYMLINK */
+ (zil_replay_func_t)zfs_replay_remove, /* TX_REMOVE */
+ (zil_replay_func_t)zfs_replay_remove, /* TX_RMDIR */
+ (zil_replay_func_t)zfs_replay_link, /* TX_LINK */
+ (zil_replay_func_t)zfs_replay_rename, /* TX_RENAME */
+ (zil_replay_func_t)zfs_replay_write, /* TX_WRITE */
+ (zil_replay_func_t)zfs_replay_truncate, /* TX_TRUNCATE */
+ (zil_replay_func_t)zfs_replay_setattr, /* TX_SETATTR */
+ (zil_replay_func_t)zfs_replay_acl_v0, /* TX_ACL_V0 */
+ (zil_replay_func_t)zfs_replay_acl, /* TX_ACL */
+ (zil_replay_func_t)zfs_replay_create_acl, /* TX_CREATE_ACL */
+ (zil_replay_func_t)zfs_replay_create, /* TX_CREATE_ATTR */
+ (zil_replay_func_t)zfs_replay_create_acl, /* TX_CREATE_ACL_ATTR */
+ (zil_replay_func_t)zfs_replay_create_acl, /* TX_MKDIR_ACL */
+ (zil_replay_func_t)zfs_replay_create, /* TX_MKDIR_ATTR */
+ (zil_replay_func_t)zfs_replay_create_acl, /* TX_MKDIR_ACL_ATTR */
+ (zil_replay_func_t)zfs_replay_write2, /* TX_WRITE2 */
};
diff --git a/module/zfs/zil.c b/module/zfs/zil.c
index c9618c13e..99d932fc0 100644
--- a/module/zfs/zil.c
+++ b/module/zfs/zil.c
@@ -1956,7 +1956,7 @@ zil_resume(zilog_t *zilog)
}
typedef struct zil_replay_arg {
- zil_replay_func_t **zr_replay;
+ zil_replay_func_t *zr_replay;
void *zr_arg;
boolean_t zr_byteswap;
char *zr_lr;
@@ -2075,7 +2075,7 @@ zil_incr_blks(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
* If this dataset has a non-empty intent log, replay it and destroy it.
*/
void
-zil_replay(objset_t *os, void *arg, zil_replay_func_t *replay_func[TX_MAX_TYPE])
+zil_replay(objset_t *os, void *arg, zil_replay_func_t replay_func[TX_MAX_TYPE])
{
zilog_t *zilog = dmu_objset_zil(os);
const zil_header_t *zh = zilog->zl_header;
diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c
index c6cfac26d..f8e325676 100644
--- a/module/zfs/zvol.c
+++ b/module/zfs/zvol.c
@@ -453,20 +453,20 @@ zvol_replay_err(zvol_state_t *zv, lr_t *lr, boolean_t byteswap)
* Callback vectors for replaying records.
* Only TX_WRITE is needed for zvol.
*/
-zil_replay_func_t *zvol_replay_vector[TX_MAX_TYPE] = {
- (zil_replay_func_t *)zvol_replay_err, /* no such transaction type */
- (zil_replay_func_t *)zvol_replay_err, /* TX_CREATE */
- (zil_replay_func_t *)zvol_replay_err, /* TX_MKDIR */
- (zil_replay_func_t *)zvol_replay_err, /* TX_MKXATTR */
- (zil_replay_func_t *)zvol_replay_err, /* TX_SYMLINK */
- (zil_replay_func_t *)zvol_replay_err, /* TX_REMOVE */
- (zil_replay_func_t *)zvol_replay_err, /* TX_RMDIR */
- (zil_replay_func_t *)zvol_replay_err, /* TX_LINK */
- (zil_replay_func_t *)zvol_replay_err, /* TX_RENAME */
- (zil_replay_func_t *)zvol_replay_write, /* TX_WRITE */
- (zil_replay_func_t *)zvol_replay_err, /* TX_TRUNCATE */
- (zil_replay_func_t *)zvol_replay_err, /* TX_SETATTR */
- (zil_replay_func_t *)zvol_replay_err, /* TX_ACL */
+zil_replay_func_t zvol_replay_vector[TX_MAX_TYPE] = {
+ (zil_replay_func_t)zvol_replay_err, /* no such transaction type */
+ (zil_replay_func_t)zvol_replay_err, /* TX_CREATE */
+ (zil_replay_func_t)zvol_replay_err, /* TX_MKDIR */
+ (zil_replay_func_t)zvol_replay_err, /* TX_MKXATTR */
+ (zil_replay_func_t)zvol_replay_err, /* TX_SYMLINK */
+ (zil_replay_func_t)zvol_replay_err, /* TX_REMOVE */
+ (zil_replay_func_t)zvol_replay_err, /* TX_RMDIR */
+ (zil_replay_func_t)zvol_replay_err, /* TX_LINK */
+ (zil_replay_func_t)zvol_replay_err, /* TX_RENAME */
+ (zil_replay_func_t)zvol_replay_write, /* TX_WRITE */
+ (zil_replay_func_t)zvol_replay_err, /* TX_TRUNCATE */
+ (zil_replay_func_t)zvol_replay_err, /* TX_SETATTR */
+ (zil_replay_func_t)zvol_replay_err, /* TX_ACL */
};
/*