Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools/hv: Check for read/write errors

hv_kvp_daemon currently does not check whether fread() or fwrite()
succeed. Add the necessary checks. Also, remove the incorrect use of
feof() before fread().

Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Ben Hutchings and committed by
Greg Kroah-Hartman
436473bc 6bb22fea

+19 -3
+19 -3
tools/hv/hv_kvp_daemon.c
··· 160 160 sizeof(struct kvp_record), 161 161 kvp_file_info[pool].num_records, filep); 162 162 163 - fclose(filep); 163 + if (ferror(filep) || fclose(filep)) { 164 + kvp_release_lock(pool); 165 + syslog(LOG_ERR, "Failed to write file, pool: %d", pool); 166 + exit(EXIT_FAILURE); 167 + } 168 + 164 169 kvp_release_lock(pool); 165 170 } 166 171 ··· 186 181 syslog(LOG_ERR, "Failed to open file, pool: %d", pool); 187 182 exit(EXIT_FAILURE); 188 183 } 189 - while (!feof(filep)) { 184 + for (;;) { 190 185 readp = &record[records_read]; 191 186 records_read += fread(readp, sizeof(struct kvp_record), 192 187 ENTRIES_PER_BLOCK * num_blocks, 193 188 filep); 189 + 190 + if (ferror(filep)) { 191 + syslog(LOG_ERR, "Failed to read file, pool: %d", pool); 192 + exit(EXIT_FAILURE); 193 + } 194 194 195 195 if (!feof(filep)) { 196 196 /* ··· 259 249 fclose(filep); 260 250 return 1; 261 251 } 262 - while (!feof(filep)) { 252 + for (;;) { 263 253 readp = &record[records_read]; 264 254 records_read += fread(readp, sizeof(struct kvp_record), 265 255 ENTRIES_PER_BLOCK, 266 256 filep); 257 + 258 + if (ferror(filep)) { 259 + syslog(LOG_ERR, "Failed to read file, pool: %d", 260 + i); 261 + exit(EXIT_FAILURE); 262 + } 267 263 268 264 if (!feof(filep)) { 269 265 /*