From 34f62961e049d808185f8ad58e426fa96e6c7e10 Mon Sep 17 00:00:00 2001 From: Boaz Harrosh Date: Sun, 7 Mar 2010 19:54:19 +0200 Subject: [PATCH] osd-target: mem_clear in case of OSD_ASC_READ_PAST_END_OF_USER_OBJECT If OSD_SSK_RECOVERED_ERROR/OSD_ASC_READ_PAST_END_OF_USER_OBJECT is returned by target then extra bytes must be returned as zeros. Other wise a bigger then OSD_SSK_RECOVERED_ERROR should be returned like "offset or length, bad_parameter_in_cdb". The problem was found by the holey cthon test. Signed-off-by: Boaz Harrosh --- osd-target/osd.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/osd-target/osd.c b/osd-target/osd.c index ce3f06d..3c9ae26 100644 --- a/osd-target/osd.c +++ b/osd-target/osd.c @@ -2888,22 +2888,19 @@ static int contig_read(struct osd_device *osd, uint64_t pid, uint64_t oid, goto out_cdb_err; readlen = pread(fd, outdata, len, offset); - if (readlen < 0) { - close(fd); - goto out_hw_err; - } - ret = close(fd); - if (ret != 0) + if ((readlen < 0) || (ret != 0)) goto out_hw_err; - *used_outlen = readlen; - /* valid, but return a sense code */ - if ((size_t) readlen < len) + if ((size_t) readlen < len) { + memset(outdata + readlen, 0, len - readlen); ret = sense_build_sdd_csi(sense, OSD_SSK_RECOVERED_ERROR, OSD_ASC_READ_PAST_END_OF_USER_OBJECT, pid, oid, readlen); + } + + *used_outlen = len; fill_ccap(&osd->ccap, NULL, USEROBJECT, pid, oid, 0); return ret;