Changeset 0dbd4a9 in mainline


Ignore:
Timestamp:
2025-06-28T22:52:18Z (3 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
9c9955ab
Parents:
2192a01
Message:

hr: metadata: validate magic early in decode

Location:
uspace/srv/bd/hr
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/metadata/foreign/geom/g_mirror.h

    r2192a01 r0dbd4a9  
    172172
    173173        bcopy(data, md->md_magic, 16);
     174        if (str_lcmp(md->md_magic, G_MIRROR_MAGIC, 16) != 0)
     175                return (EINVAL);
     176
    174177        md->md_version = le32dec(data + 16);
    175178        switch (md->md_version) {
  • uspace/srv/bd/hr/metadata/foreign/geom/hr_g_mirror.c

    r2192a01 r0dbd4a9  
    6060static errno_t meta_gmirror_get_block(service_id_t, void **);
    6161/* static errno_t meta_gmirror_write_block(service_id_t, const void *); */
    62 static bool meta_gmirror_has_valid_magic(const void *);
    6362
    6463static errno_t meta_gmirror_probe(service_id_t, void **);
     
    116115                goto error;
    117116
    118         if (!meta_gmirror_has_valid_magic(metadata_struct)) {
    119                 rc = ENOFS;
    120                 goto error;
    121         }
    122 
    123117        *rmd = metadata_struct;
    124118        return EOK;
     
    126120error:
    127121        free(metadata_struct);
    128         return ENOFS;
     122        return rc;
    129123}
    130124
     
    401395#endif
    402396
    403 static bool meta_gmirror_has_valid_magic(const void *md_v)
    404 {
    405         HR_DEBUG("%s()", __func__);
    406 
    407         const struct g_mirror_metadata *md = md_v;
    408 
    409         if (str_lcmp(md->md_magic, G_MIRROR_MAGIC, 16) != 0)
    410                 return false;
    411 
    412         return true;
    413 }
    414 
    415397/** @}
    416398 */
  • uspace/srv/bd/hr/metadata/foreign/geom/hr_g_stripe.c

    r2192a01 r0dbd4a9  
    6060static errno_t meta_gstripe_get_block(service_id_t, void **);
    6161/* static errno_t meta_gstripe_write_block(service_id_t, const void *); */
    62 static bool meta_gstripe_has_valid_magic(const void *);
    6362
    6463static errno_t meta_gstripe_probe(service_id_t, void **);
     
    116115                goto error;
    117116
    118         if (!meta_gstripe_has_valid_magic(metadata_struct)) {
    119                 rc = ENOFS;
    120                 goto error;
    121         }
    122 
    123117        *rmd = metadata_struct;
    124118        return EOK;
     
    126120error:
    127121        free(metadata_struct);
    128         return ENOFS;
     122        return rc;
    129123}
    130124
     
    318312        HR_DEBUG("%s()", __func__);
    319313
    320         stripe_metadata_decode(block, md_v);
     314        struct g_stripe_metadata *md = md_v;
     315
     316        stripe_metadata_decode(block, md);
     317
     318        if (str_lcmp(md->md_magic, G_STRIPE_MAGIC, 16) != 0)
     319                return EINVAL;
    321320
    322321        return EOK;
     
    397396#endif
    398397
    399 static bool meta_gstripe_has_valid_magic(const void *md_v)
    400 {
    401         HR_DEBUG("%s()", __func__);
    402 
    403         const struct g_stripe_metadata *md = md_v;
    404 
    405         if (str_lcmp(md->md_magic, G_STRIPE_MAGIC, 16) != 0)
    406                 return false;
    407 
    408         return true;
    409 }
    410 
    411398/** @}
    412399 */
  • uspace/srv/bd/hr/metadata/foreign/md/hr_md.c

    r2192a01 r0dbd4a9  
    5959static errno_t meta_md_get_block(service_id_t, void **);
    6060/* static errno_t meta_md_write_block(service_id_t, const void *); */
    61 static bool meta_md_has_valid_magic(const void *);
    6261
    6362static errno_t meta_md_probe(service_id_t, void **);
     
    115114                goto error;
    116115
    117         if (!meta_md_has_valid_magic(metadata_struct)) {
    118                 rc = ENOFS;
    119                 goto error;
    120         }
    121 
    122116        *rmd = metadata_struct;
    123117        return EOK;
     
    125119error:
    126120        free(metadata_struct);
    127         return ENOFS;
     121        return rc;
    128122}
    129123
     
    610604#endif
    611605
    612 static bool meta_md_has_valid_magic(const void *md_v)
    613 {
    614         HR_DEBUG("%s()", __func__);
    615 
    616         const struct mdp_superblock_1 *md = md_v;
    617 
    618         if (md->magic != MD_MAGIC)
    619                 return false;
    620 
    621         return true;
    622 }
    623 
    624606/** @}
    625607 */
  • uspace/srv/bd/hr/metadata/foreign/softraid/hr_softraid.c

    r2192a01 r0dbd4a9  
    6060static errno_t meta_softraid_get_block(service_id_t, void **);
    6161/* static errno_t meta_softraid_write_block(service_id_t, const void *); */
    62 static bool meta_softraid_has_valid_magic(const void *);
    6362
    6463static errno_t meta_softraid_probe(service_id_t, void **);
     
    116115                goto error;
    117116
    118         if (!meta_softraid_has_valid_magic(metadata_struct)) {
    119                 rc = ENOFS;
    120                 goto error;
    121         }
    122 
    123117        *rmd = metadata_struct;
    124118        return EOK;
     
    126120error:
    127121        free(metadata_struct);
    128         return ENOFS;
     122        return rc;
    129123}
    130124
     
    539533#endif
    540534
    541 static bool meta_softraid_has_valid_magic(const void *md_v)
    542 {
    543         HR_DEBUG("%s()", __func__);
    544 
    545         const struct sr_metadata *md = md_v;
    546 
    547         if (md->ssdi.ssd_magic != SR_MAGIC)
    548                 return false;
    549 
    550         return true;
    551 }
    552 
    553535/** @}
    554536 */
  • uspace/srv/bd/hr/metadata/native.c

    r2192a01 r0dbd4a9  
    116116                goto error;
    117117
    118         if (!meta_native_has_valid_magic(metadata_struct)) {
    119                 rc = ENOFS;
    120                 goto error;
    121         }
    122 
    123118        *rmd = metadata_struct;
    124119        return EOK;
     
    126121error:
    127122        free(metadata_struct);
    128         return ENOFS;
     123        return rc;
    129124}
    130125
     
    440435
    441436        memcpy(metadata->magic, scratch_md.magic, HR_NATIVE_MAGIC_SIZE);
     437        if (!meta_native_has_valid_magic(metadata))
     438                return EINVAL;
     439
    442440        memcpy(metadata->uuid, scratch_md.uuid, HR_NATIVE_UUID_LEN);
    443441
  • uspace/srv/bd/hr/superblock.c

    r2192a01 r0dbd4a9  
    9696
    9797                rc = meta_ops->probe(svc_id, &metadata_struct);
    98                 if (rc != EOK) {
    99                         if (rc != ENOFS)
    100                                 return rc;
     98                if (rc == ENOMEM)
     99                        return ENOMEM;
     100                if (rc != EOK)
    101101                        continue;
    102                 }
    103102
    104103                *rmetadata = metadata_struct;
Note: See TracChangeset for help on using the changeset viewer.