Skip to contentSkip to conversation

clk: basic clock hardware types

DISCUSSION Dan Carpenter 1 participant 1 message Jan 24, 2013 Kernel janitors

lore
Share & tools
lore
#0 lore raw

Hello Mike Turquette,

The patch 9d9f78ed9af0: "clk: basic clock hardware types" from Mar 15, 2012, leads to the following warning:
drivers/clk/clk-mux.c:54 clk_mux_get_parent()
warn: signedness bug returning '(-22)'

drivers/clk/clk-mux.c

    32  static u8 clk_mux_get_parent(struct clk_hw *hw)
    33  {
    34          struct clk_mux *mux = to_clk_mux(hw);
    35          u32 val;
    36  
    37          /*
    38           * FIXME need a mux-specific flag to determine if val is bitwise or numeric
    39           * e.g. sys_clkin_ck's clksel field is 3 bits wide, but ranges from 0x1
    40           * to 0x7 (index starts at one)
    41           * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so
    42           * val = 0x4 really means "bit 2, index starts at bit 0"
    43           */
    44          val = readl(mux->reg) >> mux->shift;
    45          val &= (1 << mux->width) - 1;
    46  
    47          if (val && (mux->flags & CLK_MUX_INDEX_BIT))
    48                  val = ffs(val) - 1;
    49  
    50          if (val && (mux->flags & CLK_MUX_INDEX_ONE))
    51                  val--;
    52  
    53          if (val >= __clk_get_num_parents(hw->clk))
    54                  return -EINVAL;
                        ^^^^^^^^^^^^^^^

The return type is u8 so -EINVAL gets truncated to 234. None of the caller check for error so it could result in memory corruption.

    55  
    56          return val;
    57  }

regards,
dan carpenter