Skip to content

Commit d4ef54c

Browse files
Cody P Schafertom-van
Cody P Schafer
authored andcommitted
helper/types: cast to uint32_t,uint16_t to avoid UB by shifting int too far
Without this, we have some types promoted to `int` when they need to be `unsigned int`. Here's some ubsan output hitting this: Unfortunately, what happens is that things get promoted to `int`, but need to be `unsigned int`. Here's the ubsan output: src/helper/types.h:126:65: runtime error: left shift of 255 by 24 places cannot be represented in type 'int' #0 0x55978a612060 in le_to_h_u32 src/helper/types.h:126 arduino#1 0x55978a61ff9e in stlink_usb_read_reg src/jtag/drivers/stlink_usb.c:1539 arduino#2 0x55978a8cfd45 in adapter_load_core_reg_u32 src/target/hla_target.c:67 arduino#3 0x55978a9f48e3 in armv7m_read_core_reg src/target/armv7m.c:236 arduino#4 0x55978a8d24fc in adapter_load_context src/target/hla_target.c:372 arduino#5 0x55978a8d261b in adapter_debug_entry src/target/hla_target.c:396 arduino#6 0x55978a8d3123 in adapter_poll src/target/hla_target.c:457 arduino#7 0x55978a528357 in target_poll src/target/target.c:535 arduino#8 0x55978a539fd4 in target_wait_state src/target/target.c:2914 arduino#9 0x55978a556e20 in jim_target_wait_state src/target/target.c:5256 arduino#10 0x55978a5cca62 in command_unknown src/helper/command.c:1030 arduino#11 0x55978aaed894 in JimInvokeCommand /home/cody/d/openocd-code/jimtcl/jim.c:10364 Change-Id: I24f6abfd26b6980100657397d69c84f2b80a005a Signed-off-by: Cody P Schafer <[email protected]> Reviewed-on: http://openocd.zylin.com/4455 Reviewed-by: Tomas Vanek <[email protected]> Tested-by: jenkins Reviewed-by: Christopher Head <[email protected]>
1 parent 6c6b426 commit d4ef54c

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

src/helper/types.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,17 @@ static inline uint64_t le_to_h_u64(const uint8_t *buf)
128128

129129
static inline uint32_t le_to_h_u32(const uint8_t* buf)
130130
{
131-
return (uint32_t)(buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24);
131+
return (uint32_t)((uint32_t)buf[0] | (uint32_t)buf[1] << 8 | (uint32_t)buf[2] << 16 | (uint32_t)buf[3] << 24);
132132
}
133133

134134
static inline uint32_t le_to_h_u24(const uint8_t* buf)
135135
{
136-
return (uint32_t)(buf[0] | buf[1] << 8 | buf[2] << 16);
136+
return (uint32_t)((uint32_t)buf[0] | (uint32_t)buf[1] << 8 | (uint32_t)buf[2] << 16);
137137
}
138138

139139
static inline uint16_t le_to_h_u16(const uint8_t* buf)
140140
{
141-
return (uint16_t)(buf[0] | buf[1] << 8);
141+
return (uint16_t)((uint16_t)buf[0] | (uint16_t)buf[1] << 8);
142142
}
143143

144144
static inline uint64_t be_to_h_u64(const uint8_t *buf)
@@ -155,17 +155,17 @@ static inline uint64_t be_to_h_u64(const uint8_t *buf)
155155

156156
static inline uint32_t be_to_h_u32(const uint8_t* buf)
157157
{
158-
return (uint32_t)(buf[3] | buf[2] << 8 | buf[1] << 16 | buf[0] << 24);
158+
return (uint32_t)((uint32_t)buf[3] | (uint32_t)buf[2] << 8 | (uint32_t)buf[1] << 16 | (uint32_t)buf[0] << 24);
159159
}
160160

161161
static inline uint32_t be_to_h_u24(const uint8_t* buf)
162162
{
163-
return (uint32_t)(buf[2] | buf[1] << 8 | buf[0] << 16);
163+
return (uint32_t)((uint32_t)buf[2] | (uint32_t)buf[1] << 8 | (uint32_t)buf[0] << 16);
164164
}
165165

166166
static inline uint16_t be_to_h_u16(const uint8_t* buf)
167167
{
168-
return (uint16_t)(buf[1] | buf[0] << 8);
168+
return (uint16_t)((uint16_t)buf[1] | (uint16_t)buf[0] << 8);
169169
}
170170

171171
static inline void h_u64_to_le(uint8_t *buf, int64_t val)

0 commit comments

Comments
 (0)