| Added |
Translation |
|
Title: Linux, Description: En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:
drm/amd/display: Corrección de índice de codificador de flujo fuera de límites v3
eng_id puede ser negativo y que stream_enc_regs[]
puede ser indexado fuera de límites.
eng_id se usa directamente como un índice en stream_enc_regs[], que tiene
solo 5 entradas. Cuando eng_id es 5 (ENGINE_ID_DIGF) o negativo, esto puede
acceder a memoria más allá del final del array.
Añadir una comprobación de límites usando ARRAY_SIZE() antes de usar eng_id como un índice.
La conversión a tipo sin signo también rechaza valores negativos.
Esto evita el acceso fuera de límites.
Corrige el siguiente error de smatch:
dcn_resource.c: stream_encoder_create() puede indexar
stream_enc_regs[eng_id] fuera de límites (tamaño 5).
drivers/gpu/drm/amd/amdgpu/../display/dc/resource/dcn351/dcn351_resource.c
1246 static struct stream_encoder dcn35_stream_encoder_create(
1247 enum engine_id eng_id,
1248 struct dc_context ctx)
1249 {
...
1255
1256 /* Mapeo de bloques de registro VPG, AFMT, DME a instancia de bloque DIO */
1257 if (eng_id <= ENGINE_ID_DIGF) {
ENGINE_ID_DIGF es 5. ¿debería <= ser <?
Sin relación, pero, ugh, ¿por qué Smatch dice que 'eng_id' puede ser negativo?
end_id es de tipo signed long, pero hay comprobaciones en la función llamadora que impiden que sea negativo.
1258 vpg_inst = eng_id;
1259 afmt_inst = eng_id;
1260 } else
1261 return NULL;
1262
...
1281
1282 dcn35_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
1283 eng_id, vpg, afmt,
--> 1284 &stream_enc_regs[eng_id],
^^^^^^^^^^^^^^^^^^^^^^^ Este array stream_enc_regs[] tiene 5 elementos, por lo que estamos un elemento más allá del final del array.
...
1287 return &enc1->base;
1288 }
v2: usar comprobación de límites explícita como sugirieron Roman/Dan; evitar conversión a unsigned int
v3: El compilador ya sabe cómo comparar los dos valores, por lo que la
conversión (int) no es necesaria. (Roman)
|