On 7/29/25 14:18, Zhuoying Cai wrote: > Thank you for the feedback! > > On 7/28/25 4:59 PM, Collin Walling wrote: >> On 7/11/25 17:10, Zhuoying Cai wrote: > > ... >
[...] >> >> You need a check somewhere for no certs found in either the specified >> range or no certs exist in the store at all: >> - VCB output len = 64 >> - stored and remaining count = 0 >> - response code 0x0001 >> >>> + if (in_len % TARGET_PAGE_SIZE != 0) { >>> + return DIAG_320_RC_INVAL_VCB_LEN; >>> + } >>> + >>> + if (first_vc_index > last_vc_index) { >>> + return DIAG_320_RC_BAD_RANGE; >>> + } >>> + >>> + if (first_vc_index == 0) { >>> + /* >>> + * Zero is a valid index for the first and last VC index. >>> + * Zero index results in the VCB header and zero certificates >>> returned. >>> + */ >>> + if (last_vc_index == 0) { >>> + goto out; >>> + } >>> + >>> + /* DIAG320 certificate store remains a one origin for cert entries >>> */ >>> + vcb->first_vc_index = 1; >>> + first_vc_index = 1; >>> + } >>> + >>> + vce_offset = VCB_HEADER_LEN; >>> + vcb->out_len = VCB_HEADER_LEN; >>> + remaining_space = in_len - VCB_HEADER_LEN; >>> + > > Re: check for no certs found in either the specified range or no certs > exist. > > This case is already handled. > > vcb->out_len = VCB_HEADER_LEN is set outside the for loop. If the index > is invalid, the loop won’t execute, and both the stored and remaining VC > counts remain unchanged at 0. > >>> + for (int i = first_vc_index - 1; i < last_vc_index && i < qcs->count; >>> i++) { >>> + VCEntry *vce; >>> + S390IPLCertificate qcert = qcs->certs[i]; >>> + /* >>> + * Each VCE is word aligned. >>> + * Each variable length field within the VCE is also word aligned. >>> + */ >>> + keyid_buf_size = ROUND_UP(qcert.key_id_size, 4); >>> + hash_buf_size = ROUND_UP(qcert.hash_size, 4); >>> + cert_buf_size = ROUND_UP(qcert.der_size, 4); >>> + vce_len = VCE_HEADER_LEN + cert_buf_size + keyid_buf_size + >>> hash_buf_size; >> >> You could define & set the above four lines inside build_vce (or as >> respective fields in the helper functions mentioned above). >> >> The remaining space check could be done after the vce has been built. >> >>> + >>> + /* >>> + * If there is no more space to store the cert, >>> + * set the remaining verification cert count and >>> + * break early. >>> + */ >>> + if (remaining_space < vce_len) { >>> + vcb->remain_ct = cpu_to_be16(last_vc_index - i); >>> + break; >>> + } >> >> You also need to check somewhere if there is enough space to store *at >> least* the first cert in the range: >> - VCB output len = 64 >> - stored count = 0 >> - remaining count = // however are remaining >> - response code 0x0001 >> > > This case is also covered by the if statement above: > > if (remaining_space < vce_len) { > vcb->remain_ct = cpu_to_be16(last_vc_index - i); > break; > } > > Response code 0x0001 is returned at the end of the function for both cases. > Sorry, I neglected to mentally trace some different loop variables to see that these cases are indeed handled. Thanks for clarifying! [...] -- Regards, Collin