Hi Christophe, The following patch adds error and size checking to the REPORT TARGET PORT GROUPS command issued by rtpg.c. The old code issued a buffer of 128 bytes, but never checked the return length. The new code starts with a buffer of 128 bytes, but reallocates it if the buffer is too small (SCSI returns the necessary length in the response data). This is more robust as it handles devices that consume more than 128 bytes for RTPG, like the Incipient NSP. I tried to handle errors, etc. as closely as I could to what is already there in the code. Let me know if you'd prefer anything written differently. Thanks, Brian Geisel --- a/path_priority/pp_alua/rtpg.c +++ b/path_priority/pp_alua/rtpg.c @@ -21,6 +21,7 @@ #include <sys/stat.h> #include <unistd.h> #include <errno.h> +#include <inttypes.h> #define __user #include <scsi/sg.h> @@ -251,14 +252,33 @@ int get_asymmetric_access_state(int fd, unsigned int tpg) { - unsigned char buf[128]; + unsigned char *buf; struct rtpg_data * tpgd; struct rtpg_tpg_dscr * dscr; int rc; + int buflen; + uint32_t scsi_buflen; - rc = do_rtpg(fd, buf, sizeof(buf)); + buflen = 128; /* Initial value from old code */ + buf = (unsigned char *)malloc(buflen); + rc = do_rtpg(fd, buf, buflen); if (rc < 0) return rc; + scsi_buflen = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]; + if (buflen < (scsi_buflen + 4)) { + free(buf); + buf = (unsigned char *)malloc(scsi_buflen); + if (buf == NULL) { + PRINT_DEBUG ("malloc failed: could not allocate" + "%u bytes\n", scsi_buflen); + return -RTPG_RTPG_FAILED; + } + buflen = scsi_buflen; + rc = do_rtpg(fd, buf, buflen); + if (rc < 0) + return rc; + } + tpgd = (struct rtpg_data *) buf; rc = -RTPG_TPG_NOT_FOUND; @@ -275,6 +295,7 @@ } } + free(buf); return rc; } -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel