[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 3/8] s390/sclp: rework sclp boundary and length checks
From: |
Janosch Frank |
Subject: |
Re: [PATCH v3 3/8] s390/sclp: rework sclp boundary and length checks |
Date: |
Fri, 19 Jun 2020 12:50:11 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 |
On 6/19/20 12:22 AM, Collin Walling wrote:
> Rework the SCLP boundary check to account for different SCLP commands
> (eventually) allowing different boundary sizes.
>
> Move the length check code into a separate function, and introduce a
> new function to determine the length of the read SCP data (i.e. the size
> from the start of the struct to where the CPU entries should begin).
>
> The format of read CPU info is unlikely to change in the future,
> so we do not require a separate function to calculate its length.
>
> Signed-off-by: Collin Walling <walling@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
> ---
[...]
> +/*
> + * The data length denotes the start of the struct to where the first
> + * CPU entry is to be allocated. This value also denotes the offset_cpu
> + * field.
> + */
> +static inline int get_read_scp_info_data_len(void)
> +{
> + return offsetof(ReadInfo, entries);
> +}
> +
> /* Provide information about the configuration, CPUs and storage */
> static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
> {
> @@ -74,17 +112,16 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
> int cpu_count;
> int rnsize, rnmax;
> IplParameterBlock *ipib = s390_ipl_get_iplb();
> + int data_len = get_read_scp_info_data_len();
Does somebody have a better name than data_len at hand?
>
> - if (be16_to_cpu(sccb->h.length) <
> - (sizeof(ReadInfo) + machine->possible_cpus->len *
> sizeof(CPUEntry))) {
> - sccb->h.response_code =
> cpu_to_be16(SCLP_RC_INSUFFICIENT_SCCB_LENGTH);
> + if (!sccb_sufficient_len(sccb, machine->possible_cpus->len, data_len)) {
> return;
> }
>
> /* CPU information */
> prepare_cpu_entries(machine, read_info->entries, &cpu_count);
> read_info->entries_cpu = cpu_to_be16(cpu_count);
> - read_info->offset_cpu = cpu_to_be16(offsetof(ReadInfo, entries));
> + read_info->offset_cpu = cpu_to_be16(data_len);
> read_info->highest_cpu = cpu_to_be16(machine->smp.max_cpus - 1);
>
> read_info->ibc_val = cpu_to_be32(s390_get_ibc_val());
> @@ -133,17 +170,16 @@ static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB
> *sccb)
> {
> MachineState *machine = MACHINE(qdev_get_machine());
> ReadCpuInfo *cpu_info = (ReadCpuInfo *) sccb;
> + int data_len = offsetof(ReadCpuInfo, entries);
> int cpu_count;
>
> - if (be16_to_cpu(sccb->h.length) <
> - (sizeof(ReadInfo) + machine->possible_cpus->len *
> sizeof(CPUEntry))) {
> - sccb->h.response_code =
> cpu_to_be16(SCLP_RC_INSUFFICIENT_SCCB_LENGTH);
> + if (!sccb_sufficient_len(sccb, machine->possible_cpus->len, data_len)) {
> return;
> }
>
> prepare_cpu_entries(machine, cpu_info->entries, &cpu_count);
> cpu_info->nr_configured = cpu_to_be16(cpu_count);
> - cpu_info->offset_configured = cpu_to_be16(offsetof(ReadCpuInfo,
> entries));
> + cpu_info->offset_configured = cpu_to_be16(data_len);
> cpu_info->nr_standby = cpu_to_be16(0);
>
> /* The standby offset is 16-byte for each CPU */
> @@ -229,6 +265,10 @@ int sclp_service_call_protected(CPUS390XState *env,
> uint64_t sccb,
> goto out_write;
> }
>
> + if (!sccb_has_valid_boundary(sccb, code, &work_sccb.h)) {
> + goto out_write;
> + }
> +
> sclp_c->execute(sclp, &work_sccb, code);
> out_write:
> s390_cpu_pv_mem_write(env_archcpu(env), 0, &work_sccb,
> @@ -274,8 +314,7 @@ int sclp_service_call(CPUS390XState *env, uint64_t sccb,
> uint32_t code)
> goto out_write;
> }
>
> - if ((sccb + be16_to_cpu(work_sccb.h.length)) > ((sccb & PAGE_MASK) +
> PAGE_SIZE)) {
> - work_sccb.h.response_code =
> cpu_to_be16(SCLP_RC_SCCB_BOUNDARY_VIOLATION);
> + if (!sccb_has_valid_boundary(sccb, code, &work_sccb.h)) {
> goto out_write;
> }
>
>
signature.asc
Description: OpenPGP digital signature
- [PATCH v3 1/8] s390/sclp: get machine once during read scp/cpu info, (continued)
- [PATCH v3 1/8] s390/sclp: get machine once during read scp/cpu info, Collin Walling, 2020/06/18
- [PATCH v3 5/8] s390/sclp: use cpu offset to locate cpu entries, Collin Walling, 2020/06/18
- [PATCH v3 4/8] s390/sclp: read sccb from mem based on sccb length, Collin Walling, 2020/06/18
- [PATCH v3 3/8] s390/sclp: rework sclp boundary and length checks, Collin Walling, 2020/06/18
- [PATCH v3 8/8] s390: guest support for diagnose 0x318, Collin Walling, 2020/06/18
- [PATCH v3 7/8] s390/kvm: header sync for diag318, Collin Walling, 2020/06/18
- [PATCH v3 6/8] s390/sclp: add extended-length sccb support for kvm guest, Collin Walling, 2020/06/18