Skip to content
Snippets Groups Projects
Commit e018ea72 authored by Thierno souleymane Bah's avatar Thierno souleymane Bah
Browse files

fix(load_mbr bufferoverflow issue fixed by implementing read_sector_n function)

parent 8b495e92
No related branches found
No related tags found
No related merge requests found
...@@ -11,7 +11,9 @@ void load_mbr() ...@@ -11,7 +11,9 @@ void load_mbr()
int i; int i;
unsigned char buffer[sizeof(mbr_t)]; unsigned char buffer[sizeof(mbr_t)];
read_sector(buffer, 0, 0); /* read_sector(buffer, 0, 0); */
read_sector_n(buffer, 0, 0, sizeof(mbr_t));
mbr.magic = buffer[0] + (buffer[1] << 8); mbr.magic = buffer[0] + (buffer[1] << 8);
if (mbr.magic == MBR_MAGIC) if (mbr.magic == MBR_MAGIC)
...@@ -21,7 +23,7 @@ void load_mbr() ...@@ -21,7 +23,7 @@ void load_mbr()
{ {
mbr.vols[i].sector = buffer[3 + (i * 4)]; mbr.vols[i].sector = buffer[3 + (i * 4)];
mbr.vols[i].cylinder = buffer[4 + (i * 4)]; mbr.vols[i].cylinder = buffer[4 + (i * 4)];
mbr.vols[i].nb_sectors = buffer[5 + (i * 4)]; mbr.vols[i].nb_blocs = buffer[5 + (i * 4)];
mbr.vols[i].type = buffer[6 + (i * 4)]; mbr.vols[i].type = buffer[6 + (i * 4)];
} }
return; return;
...@@ -43,48 +45,58 @@ void save_mbr() ...@@ -43,48 +45,58 @@ void save_mbr()
{ {
buffer[3 + (i * 4)] = mbr.vols[i].sector; buffer[3 + (i * 4)] = mbr.vols[i].sector;
buffer[4 + (i * 4)] = mbr.vols[i].cylinder; buffer[4 + (i * 4)] = mbr.vols[i].cylinder;
buffer[5 + (i * 4)] = mbr.vols[i].nb_sectors; buffer[5 + (i * 4)] = mbr.vols[i].nb_blocs;
buffer[6 + (i * 4)] = mbr.vols[i].type; buffer[6 + (i * 4)] = mbr.vols[i].type;
} }
write_sector(0, 0, buffer); write_sector(0, 0, buffer);
} }
unsigned int *get_sector_cylinder(unsigned int vol, unsigned int nbloc) void get_sector_cylinder(unsigned int vol, unsigned int nbloc, unsigned int *sector_cylinder)
{ {
int sector_cylinder[2], absolute_nbloc; int absolute_nbloc;
vol_t volume; vol_t volume;
assert(vol < mbr.nb_vols); assert(vol < mbr.nb_vols);
volume = mbr.vols[vol]; volume = mbr.vols[vol];
assert(nbloc < volume.nb_sectors); assert(nbloc < volume.nb_blocs);
absolute_nbloc = (volume.cylinder * HDA_MAXSECTOR + volume.sector + nbloc); absolute_nbloc = (volume.cylinder * HDA_MAXSECTOR + volume.sector + nbloc);
sector_cylinder[0] = absolute_nbloc % HDA_MAXSECTOR; sector_cylinder[0] = absolute_nbloc % HDA_MAXSECTOR;
sector_cylinder[1] = absolute_nbloc / HDA_MAXCYLINDER; sector_cylinder[1] = absolute_nbloc / HDA_MAXCYLINDER;
return sector_cylinder;
} }
void read_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer) void read_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer)
{ {
int sector_cylinder[2] = get_sector_cylinder(vol, nbloc); // [sector, cylinder] unsigned int sector_cylinder[2];
get_sector_cylinder(vol, nbloc, sector_cylinder); /* [sector, cylinder] */
read_sector(buffer, sector_cylinder[1], sector_cylinder[0]); read_sector(buffer, sector_cylinder[1], sector_cylinder[0]);
} }
void write_bloc(unsigned int vol, unsigned int nbloc, const unsigned char *buffer) void write_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer)
{ {
int sector_cylinder[2] = get_sector_cylinder(vol, nbloc); // [sector, cylinder] unsigned int sector_cylinder[2];
get_sector_cylinder(vol, nbloc, sector_cylinder); /* [sector, cylinder] */
write_sector(sector_cylinder[1], sector_cylinder[0], buffer); write_sector(sector_cylinder[1], sector_cylinder[0], buffer);
} }
void format_vol(unsigned int vol) void format_vol(unsigned int vol)
{ {
unsigned int nbloc; unsigned int nbloc, sector_cylinder[2];
vol_t volume = mbr.vols[vol]; vol_t volume = mbr.vols[vol];
for (nbloc = 0; nbloc < volume.nb_sectors; nbloc++) for (nbloc = 0; nbloc < volume.nb_blocs; nbloc++)
{ {
int sector_cylinder[2] = get_sector_cylinder(vol, nbloc); get_sector_cylinder(vol, nbloc, sector_cylinder); /* [sector, cylinder] */
format_sector(sector_cylinder[1], sector_cylinder[1], FMT_SIZE, FMT_DATA); format_sector(sector_cylinder[1], sector_cylinder[1], FMT_SIZE, FMT_DATA);
} }
} }
void read_sector_n(unsigned char *buf, int cylinder, int sector, int size)
{
int i;
unsigned char buffer[HDA_SECTORSIZE];
read_sector(buffer, cylinder, sector);
for (i = 0; i < size; i++)
buf[i] = buffer[i];
}
\ No newline at end of file
...@@ -2,38 +2,40 @@ ...@@ -2,38 +2,40 @@
#define VOL_H #define VOL_H
#define VOLS_MAX 8 #define VOLS_MAX 8
#define MBR_MAGIC 0xCAFE // Savoir si le mbr a déjà été initialisé ou non #define MBR_MAGIC 0xCAFE /* Savoir si le mbr a déjà été initialisé ou non */
#define FMT_DATA 0xCAFEBABE #define FMT_DATA 0xCAFEBABE
#define FMT_SIZE 0x1 #define FMT_SIZE 0x1
static mbr_t mbr;
typedef enum typedef enum
{ {
BASE, BASE,
ANNEXE, ANNEXE,
OTHER OTHER
} vtypes_t; // Volume type } vtypes_t; /* Volume type */
typedef struct vol_s typedef struct vol_s
{ {
unsigned int sector; unsigned int sector;
unsigned int cylinder; unsigned int cylinder;
unsigned int nb_sectors; unsigned int nb_blocs;
vtypes_t type; vtypes_t type;
} vol_t; } vol_t;
typedef struct mbr_s typedef struct mbr_s
{ {
unsigned int magic; unsigned int magic;
unsigned int nb_vols; // nombre de volumes actuels unsigned int nb_vols; /* nombre de volumes actuels */
vol_t vols[VOLS_MAX]; vol_t vols[VOLS_MAX];
} mbr_t; } mbr_t;
mbr_t mbr;
void load_mbr(void); void load_mbr(void);
void save_mbr(void); void save_mbr(void);
unsigned int *get_sector_cylinder(unsigned int vol, unsigned int nbloc); void get_sector_cylinder(unsigned int vol, unsigned int nbloc, unsigned int *sector_cylinder);
void read_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer); void read_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer);
void write_bloc(unsigned int vol, unsigned int nbloc, const unsigned char *buffer); void write_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer);
void read_sector_n(unsigned char *buf, int cylinder, int sector, int size);
#endif // VOL_H #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment