diff --git a/libibmad/src/fields.c b/libibmad/src/fields.c
index a5a510a..23ec201 100644
--- a/libibmad/src/fields.c
+++ b/libibmad/src/fields.c
@@ -611,33 +611,45 @@ static void _get_array(void *buf, int base_offs, const ib_field_t * f,
 
 uint32_t mad_get_field(void *buf, int base_offs, enum MAD_FIELDS field)
 {
+	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_ || (ib_mad_f+field)->bitlen == 0)
+		return 0;
 	return _get_field(buf, base_offs, ib_mad_f + field);
 }
 
 void mad_set_field(void *buf, int base_offs, enum MAD_FIELDS field,
 		   uint32_t val)
 {
+	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_ || (ib_mad_f+field)->bitlen == 0)
+		return;
 	_set_field(buf, base_offs, ib_mad_f + field, val);
 }
 
 uint64_t mad_get_field64(void *buf, int base_offs, enum MAD_FIELDS field)
 {
+	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_ || (ib_mad_f+field)->bitlen == 0)
+		return 0;
 	return _get_field64(buf, base_offs, ib_mad_f + field);
 }
 
 void mad_set_field64(void *buf, int base_offs, enum MAD_FIELDS field,
 		     uint64_t val)
 {
+	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_ || (ib_mad_f+field)->bitlen == 0)
+		return;
 	_set_field64(buf, base_offs, ib_mad_f + field, val);
 }
 
 void mad_set_array(void *buf, int base_offs, enum MAD_FIELDS field, void *val)
 {
+	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_ || (ib_mad_f+field)->bitlen == 0)
+		return;
 	_set_array(buf, base_offs, ib_mad_f + field, val);
 }
 
 void mad_get_array(void *buf, int base_offs, enum MAD_FIELDS field, void *val)
 {
+	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_ || (ib_mad_f+field)->bitlen == 0)
+		return;
 	_get_array(buf, base_offs, ib_mad_f + field, val);
 }
 
@@ -645,7 +657,7 @@ void mad_decode_field(uint8_t * buf, enum MAD_FIELDS field, void *val)
 {
 	const ib_field_t *f = ib_mad_f + field;
 
-	if (!field) {
+	if (!field || f->bitlen == 0) {
 		*(int *)val = *(int *)buf;
 		return;
 	}
@@ -664,7 +676,7 @@ void mad_encode_field(uint8_t * buf, enum MAD_FIELDS field, void *val)
 {
 	const ib_field_t *f = ib_mad_f + field;
 
-	if (!field) {
+	if (!field || f->bitlen == 0) {
 		*(int *)buf = *(int *)val;
 		return;
 	}
@@ -743,7 +755,7 @@ int mad_print_field(enum MAD_FIELDS field, const char *name, void *val)
 
 char *mad_dump_field(enum MAD_FIELDS field, char *buf, int bufsz, void *val)
 {
-	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_)
+	if (field <= IB_NO_FIELD || field >= IB_FIELD_LAST_ || (ib_mad_f + field)->bitlen == 0)
 		return NULL;
 	return _mad_dump_field(ib_mad_f + field, 0, buf, bufsz, val);
 }
