xfrm_smark_init(attrs, &x->props.smark);
 
-       if (attrs[XFRMA_IF_ID])
+       if (attrs[XFRMA_IF_ID]) {
                x->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
+               if (!x->if_id) {
+                       err = -EINVAL;
+                       goto error;
+               }
+       }
 
        err = __xfrm_init_state(x, false, attrs[XFRMA_OFFLOAD_DEV]);
        if (err)
 
        mark = xfrm_mark_get(attrs, &m);
 
-       if (attrs[XFRMA_IF_ID])
+       if (attrs[XFRMA_IF_ID]) {
                if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
+               if (!if_id) {
+                       err = -EINVAL;
+                       goto out_noput;
+               }
+       }
 
        if (p->info.seq) {
                x = xfrm_find_acq_byseq(net, mark, p->info.seq);
 
        xfrm_mark_get(attrs, &xp->mark);
 
-       if (attrs[XFRMA_IF_ID])
+       if (attrs[XFRMA_IF_ID]) {
                xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
+               if (!xp->if_id) {
+                       err = -EINVAL;
+                       goto error;
+               }
+       }
 
        return xp;
  error: