Skip to content

Commit b0cc295

Browse files
rizlikdanielinux
authored andcommitted
disk.c: fix silent sz truncation and explicitly bound disk IO
1 parent 8c826d4 commit b0cc295

2 files changed

Lines changed: 11 additions & 2 deletions

File tree

include/disk.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
#include <stdint.h>
2626
#include "gpt.h"
2727

28+
/* cap DISK I/O write operation to a reasonable size */
29+
#define DISK_IO_MAX_SIZE 0x7FFFFFFFUL
30+
2831
#ifndef MAX_PARTITIONS
2932
#define MAX_PARTITIONS 16
3033
#endif

src/disk.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,12 +276,15 @@ static struct disk_partition *open_part(int drv, int part)
276276
int disk_part_read(int drv, int part, uint64_t off, uint64_t sz, uint8_t *buf)
277277
{
278278
struct disk_partition *p = open_part(drv, part);
279-
int len = sz;
280279
uint64_t start;
280+
int len;
281281
int ret;
282282
if (p == NULL) {
283283
return -1;
284284
}
285+
if (sz > DISK_IO_MAX_SIZE)
286+
sz = DISK_IO_MAX_SIZE;
287+
len = (int)sz;
285288
start = p->start + off;
286289
/* overflow */
287290
if (start < p->start) {
@@ -325,12 +328,15 @@ int disk_part_read(int drv, int part, uint64_t off, uint64_t sz, uint8_t *buf)
325328
int disk_part_write(int drv, int part, uint64_t off, uint64_t sz, const uint8_t *buf)
326329
{
327330
struct disk_partition *p = open_part(drv, part);
328-
int len = sz;
329331
uint64_t start;
332+
int len;
330333
int ret;
331334
if (p == NULL) {
332335
return -1;
333336
}
337+
if (sz > DISK_IO_MAX_SIZE)
338+
sz = DISK_IO_MAX_SIZE;
339+
len = (int)sz;
334340
start = p->start + off;
335341
/* overflow */
336342
if (start < p->start) {

0 commit comments

Comments
 (0)