char  rule_array[8];
                struct lv1 {
                        u16 len;
-                       u8  clrkey[0];
+                       u8  clrkey[];
                } lv1;
-               struct lv2 {
-                       u16 len;
-                       struct keyid {
-                               u16 len;
-                               u16 attr;
-                               u8  data[SECKEYBLOBSIZE];
-                       } keyid;
-               } lv2;
+               /* followed by struct lv2 */
        } __packed * preqparm;
-       struct lv2 *plv2;
+       struct lv2 {
+               u16 len;
+               struct keyid {
+                       u16 len;
+                       u16 attr;
+                       u8  data[SECKEYBLOBSIZE];
+               } keyid;
+       } __packed * plv2;
        struct cmrepparm {
                u8  subfunc_code[2];
                u16 rule_array_len;
        }
        preqparm->lv1.len = sizeof(struct lv1) + keysize;
        memcpy(preqparm->lv1.clrkey, clrkey, keysize);
-       plv2 = (struct lv2 *)(((u8 *)&preqparm->lv2) + keysize);
+       plv2 = (struct lv2 *)(((u8 *)preqparm) + sizeof(*preqparm) + keysize);
        plv2->len = sizeof(struct lv2);
        plv2->keyid.len = sizeof(struct keyid);
        plv2->keyid.attr = 0x30;
-       preqcblk->req_parml = sizeof(struct cmreqparm) + keysize;
+       preqcblk->req_parml = sizeof(*preqparm) + keysize + sizeof(*plv2);
 
        /* fill xcrb struct */
        prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
                        u16 key_name_2_len;
                        u16 user_data_1_len;
                        u16 user_data_2_len;
-                       u8  key_name_1[0];
-                       u8  key_name_2[0];
-                       u8  user_data_1[0];
-                       u8  user_data_2[0];
+                       /* u8  key_name_1[]; */
+                       /* u8  key_name_2[]; */
+                       /* u8  user_data_1[]; */
+                       /* u8  user_data_2[]; */
                } vud;
                struct {
                        u16 len;
                        struct {
                                u16 len;
                                u16 flag;
-                               u8  kek_id_1[0];
+                               /* u8  kek_id_1[]; */
                        } tlv1;
                        struct {
                                u16 len;
                                u16 flag;
-                               u8  kek_id_2[0];
+                               /* u8  kek_id_2[]; */
                        } tlv2;
                        struct {
                                u16 len;
                        struct {
                                u16 len;
                                u16 flag;
-                               u8  gen_key_id_1_label[0];
+                               /* u8  gen_key_id_1_label[]; */
                        } tlv4;
                        struct {
                                u16 len;
                                u16 flag;
-                               u8  gen_key_id_2[0];
+                               /* u8  gen_key_id_2[]; */
                        } tlv5;
                        struct {
                                u16 len;
                                u16 flag;
-                               u8  gen_key_id_2_label[0];
+                               /* u8  gen_key_id_2_label[]; */
                        } tlv6;
                } kb;
        } __packed * preqparm;
                        struct {
                                u16 len;
                                u16 flag;
-                               u8  gen_key[0]; /* 120-136 bytes */
+                               u8  gen_key[]; /* 120-136 bytes */
                        } tlv1;
                } kb;
        } __packed * prepparm;
        struct rule_array_block {
                u8  subfunc_code[2];
                u16 rule_array_len;
-               char rule_array[0];
+               char rule_array[];
        } __packed * preq_ra_block;
        struct vud_block {
                u16 len;
                struct {
                        u16 len;
                        u16 flag;       /* 0x0063 */
-                       u8  clr_key[0]; /* clear key value bytes */
+                       u8  clr_key[];  /* clear key value bytes */
                } tlv2;
        } __packed * preq_vud_block;
        struct key_block {
                struct {
                        u16 len;
                        u16 flag;         /* 0x0030 */
-                       u8  key_token[0]; /* key skeleton */
+                       u8  key_token[];  /* key skeleton */
                } tlv1;
        } __packed * preq_key_block;
        struct iprepparm {
                        struct {
                                u16 len;
                                u16 flag;         /* 0x0030 */
-                               u8  key_token[0]; /* key token */
+                               u8  key_token[];  /* key token */
                        } tlv1;
                } kb;
        } __packed * prepparm;
                        u16 len;
                        u16 cca_key_token_len;
                        u16 cca_key_token_flags;
-                       u8  cca_key_token[0]; // 64 or more
+                       u8  cca_key_token[]; /* 64 or more */
                } kb;
        } __packed * preqparm;
        struct aurepparm {
                        u16 len;
                        u16 cca_key_token_len;
                        u16 cca_key_token_flags;
-                       u8  cca_key_token[0];
+                       u8  cca_key_token[];
                } kb;
        } __packed * preqparm;
        struct aurepparm {
                                u8  form;
                                u8  pad1[3];
                                u16 keylen;
-                               u8  key[0];  /* the key (keylen bytes) */
-                               u16 keyattrlen;
-                               u8  keyattr[32];
-                               u8  pad2[1];
-                               u8  vptype;
-                               u8  vp[32];  /* verification pattern */
+                               u8  key[];  /* the key (keylen bytes) */
+                               /* u16 keyattrlen; */
+                               /* u8  keyattr[32]; */
+                               /* u8  pad2[1]; */
+                               /* u8  vptype; */
+                               /* u8  vp[32];  verification pattern */
                        } ckb;
                } vud;
-               struct {
-                       u16 len;
-               } kb;
+               /* followed by a key block */
        } __packed * prepparm;
        int keylen = ((struct eccprivkeytoken *)key)->len;
 
        size_t parmbsize = sizeof(struct fqreqparm);
        struct fqrepparm {
                u8  subfunc_code[2];
-               u8  lvdata[0];
+               u8  lvdata[];
        } __packed * prepparm;
 
        /* get already prepared memory for 2 cprbs with param block each */