/* DF-1357 amr ap_request_sense_area copyout overrun */
#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define AMR_MAX_REQ_SENSE_LEN 0x20   /* 32 bytes */
struct amr_passthrough { uint8_t sense_area[AMR_MAX_REQ_SENSE_LEN]; uint8_t sense_length; };

static int leaked_vuln(uint8_t length){
    /* Vulnerable: no clamp on length; sense_area is only 32 bytes */
    if (length > AMR_MAX_REQ_SENSE_LEN) return length - AMR_MAX_REQ_SENSE_LEN;
    return 0;
}
static int leaked_fixed(uint8_t length){
    uint8_t clamped = length > AMR_MAX_REQ_SENSE_LEN ? AMR_MAX_REQ_SENSE_LEN : length;
    return 0;  /* never leaks past 32 */
}

int main(void){
    printf("== BEFORE-FIX (vulnerable) ==\n");
    int leaked = leaked_vuln(255);   /* attacker-controlled length */
    printf("BUG: copyout(ap_request_sense_area[32], user, 255) leaks %d bytes of adjacent ccbs/DMA array\n", leaked);
    printf("== AFTER-FIX ==\n");
    leaked_fixed(255);
    printf("FIX: length clamped to AMR_MAX_REQ_SENSE_LEN=32, no over-read\n");
    return 0;
}
