@@ -570,6 +570,7 @@ int ubifs_hmac_wkm(struct ubifs_info *c, u8 *hmac)
int err;
const char well_known_message[] = "UBIFS";
+ ubifs_assert(c, !c->ro_mount);
if (!ubifs_authenticated(c))
return 0;
@@ -410,6 +410,7 @@ static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb)
moved = 1;
}
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c) && moved) {
struct ubifs_auth_node *auth;
@@ -80,6 +80,7 @@ static inline void zero_trun_node_unused(struct ubifs_trun_node *trun)
static void ubifs_add_auth_dirt(struct ubifs_info *c, int lnum)
{
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c))
ubifs_add_dirt(c, lnum, ubifs_auth_node_sz(c));
}
@@ -278,7 +279,9 @@ static int write_head(struct ubifs_info *c, int jhead, void *buf, int len,
dbg_jnl("jhead %s, LEB %d:%d, len %d",
dbg_jhead(jhead), *lnum, *offs, len);
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c)) {
+
err = ubifs_hash_nodes(c, buf, len, c->jheads[jhead].log_hash);
if (err)
return err;
@@ -572,6 +575,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
len = aligned_dlen + aligned_ilen + UBIFS_INO_NODE_SZ;
/* Make sure to also account for extended attributes */
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c))
len += ALIGN(host_ui->data_len, 8) + ubifs_auth_node_sz(c);
else
@@ -778,6 +782,8 @@ int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
}
dlen = UBIFS_DATA_NODE_SZ + out_len;
+
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c))
write_len = ALIGN(dlen, 8) + auth_len;
else
@@ -860,6 +866,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
write_len += UBIFS_INO_NODE_SZ * ui->xattr_cnt;
}
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c))
write_len += ALIGN(ilen, 8) + ubifs_auth_node_sz(c);
else
@@ -1572,6 +1579,7 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
/* Must make reservation before allocating sequence numbers */
len = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ;
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c))
len += ALIGN(dlen, 8) + ubifs_auth_node_sz(c);
else
@@ -595,6 +595,7 @@ static int authenticate_sleb(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
u8 hash[UBIFS_HASH_ARR_SZ];
u8 hmac[UBIFS_HMAC_ARR_SZ];
+ ubifs_assert(c, !c->ro_mount);
if (!ubifs_authenticated(c))
return sleb->nodes_cnt;
@@ -176,6 +176,7 @@ static int create_default_filesystem(struct ubifs_info *c)
sup_flags |= UBIFS_FLG_BIGLPT;
sup_flags |= UBIFS_FLG_DOUBLE_HASH;
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c)) {
sup_flags |= UBIFS_FLG_AUTHENTICATION;
sup->hash_algo = cpu_to_le16(c->auth_hash_algo);
@@ -1447,6 +1447,7 @@ static int mount_ubifs(struct ubifs_info *c)
}
if (c->need_recovery) {
+ ubifs_assert(c, !c->ro_mount);
if (!ubifs_authenticated(c)) {
err = ubifs_recover_size(c, true);
if (err)
@@ -1457,6 +1458,7 @@ static int mount_ubifs(struct ubifs_info *c)
if (err)
goto out_orphans;
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c)) {
err = ubifs_recover_size(c, false);
if (err)
@@ -1703,6 +1705,8 @@ static int ubifs_remount_rw(struct ubifs_info *c)
err = ubifs_write_rcvrd_mst_node(c);
if (err)
goto out;
+
+ ubifs_assert(c, !c->ro_mount);
if (!ubifs_authenticated(c)) {
err = ubifs_recover_size(c, true);
if (err)
@@ -1788,6 +1792,7 @@ static int ubifs_remount_rw(struct ubifs_info *c)
if (err)
goto out;
+ ubifs_assert(c, !c->ro_mount);
if (ubifs_authenticated(c)) {
err = ubifs_recover_size(c, false);
if (err)
@@ -1650,6 +1650,8 @@ int __ubifs_node_insert_hmac(const struct ubifs_info *c, void *buf,
static inline int ubifs_node_insert_hmac(const struct ubifs_info *c, void *buf,
int len, int ofs_hmac)
{
+ ubifs_assert(c, !c->ro_mount);
+
if (ubifs_authenticated(c))
return __ubifs_node_insert_hmac(c, buf, len, ofs_hmac);
else
@@ -1661,6 +1663,8 @@ int __ubifs_node_verify_hmac(const struct ubifs_info *c, const void *buf,
static inline int ubifs_node_verify_hmac(const struct ubifs_info *c,
const void *buf, int len, int ofs_hmac)
{
+ ubifs_assert(c, !c->ro_mount);
+
if (ubifs_authenticated(c))
return __ubifs_node_verify_hmac(c, buf, len, ofs_hmac);
else
@@ -1677,6 +1681,8 @@ static inline int ubifs_node_verify_hmac(const struct ubifs_info *c,
*/
static inline int ubifs_auth_node_sz(const struct ubifs_info *c)
{
+ ubifs_assert(c, !c->ro_mount);
+
if (ubifs_authenticated(c))
return sizeof(struct ubifs_auth_node) + c->hmac_desc_len;
else
@@ -1694,6 +1700,8 @@ static inline int ubifs_shash_copy_state(const struct ubifs_info *c,
struct shash_desc *src,
struct shash_desc *target)
{
+ ubifs_assert(c, !c->ro_mount);
+
if (ubifs_authenticated(c))
return __ubifs_shash_copy_state(c, src, target);
else
make sure that the hmac ubifs authentication code, which uses the hmac is only called, for rw mounts. This allows to ensure that we are not in the new read only authentication mode, when the hmac is accessed. Signed-off-by: Torben Hohn <torben.hohn@linutronix.de> --- fs/ubifs/auth.c | 1 + fs/ubifs/gc.c | 1 + fs/ubifs/journal.c | 8 ++++++++ fs/ubifs/replay.c | 1 + fs/ubifs/sb.c | 1 + fs/ubifs/super.c | 5 +++++ fs/ubifs/ubifs.h | 8 ++++++++ 7 files changed, 25 insertions(+)