Skip to content

Commit 4ecd6af

Browse files
fix weird crash in iso9660 with stricter kfree, make sure error messages are shown with interrupts off by forcibly flipping backbuffer
1 parent dd6fff7 commit 4ecd6af

File tree

7 files changed

+21
-27
lines changed

7 files changed

+21
-27
lines changed

src/dhcp.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ void dhcp_discover() {
5252
return;
5353
}
5454
udp_register_daemon(DHCP_DST_PORT, &dhcp_handle_packet);
55-
kprintf("Configuring network via DHCP\n");
5655
memset(packet, 0, sizeof(dhcp_packet_t));
5756
uint16_t optsize = make_dhcp_packet(packet, DHCPDISCOVER, request_ip, DHCP_TRANSACTION_IDENTIFIER, 0);
5857
udp_send_packet(dst_ip, DHCP_DST_PORT, DHCP_SRC_PORT, packet, optsize);

src/e1000.c

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ void e1000_handle_receive() {
180180
return;
181181
}
182182
netdev_t* dev = get_active_network_device();
183-
if (!dev && dev->deviceid != ((INTEL_VEND << 16) | e1000_device_id)) {
183+
if (!dev || dev->deviceid != ((INTEL_VEND << 16) | e1000_device_id)) {
184184
return;
185185
}
186186

@@ -212,6 +212,10 @@ bool e1000_send_packet(void *p_data, uint16_t p_len) {
212212
return false;
213213
}
214214

215+
if (!tx_descs[tx_cur]) {
216+
return false;
217+
}
218+
215219
// Check if descriptor is available
216220
if (!(tx_descs[tx_cur]->status & TX_DD)) {
217221
dprintf("e1000: TX ring full, dropping packet\n");
@@ -255,18 +259,6 @@ void e1000_up() {
255259
void e1000_handler([[maybe_unused]] uint8_t isr, [[maybe_unused]] uint64_t error, [[maybe_unused]] uint64_t irq, void* opaque) {
256260
uint32_t status = e1000_read_command(REG_ICR);
257261

258-
if (status & ICR_TXQE) {
259-
dprintf("Transmit queue empty\n");
260-
}
261-
if (status & ICR_RXSEQ) {
262-
dprintf("Recv sequence error\n");
263-
}
264-
if (status & ICR_LSC) {
265-
e1000_up();
266-
}
267-
if (status & ICR_RXDMT0) {
268-
// RX threshold met
269-
}
270262
if (status & ICR_RXT0) {
271263
e1000_handle_receive();
272264
}
@@ -298,10 +290,6 @@ void e1000_enable_interrupts() {
298290
e1000_read_command(REG_ICR);
299291
}
300292

301-
void e1000_idle() {
302-
//e1000_handler(32 + 10, 0, 10, NULL);
303-
}
304-
305293
bool e1000_start(pci_dev_t *pci_device) {
306294

307295
// Cache actual detected device ID
@@ -383,8 +371,6 @@ bool e1000_start(pci_dev_t *pci_device) {
383371

384372
interrupts_on();
385373

386-
proc_register_idle(e1000_idle, IDLE_FOREGROUND);
387-
388374
return true;
389375
}
390376

src/errorhandler.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ void error_handler(uint8_t int_no, uint64_t errorcode, [[maybe_unused]] uint64_t
5656
kprintf("Fatal exception %02X (Error code %016lx): %s\n", int_no, errorcode, error_table[int_no]);
5757
setforeground(current_console, COLOUR_WHITE);
5858
backtrace();
59+
rr_flip();
5960
wait_forever();
6061
}
6162

src/iso9660.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ int parse_pvd(iso9660 *info, unsigned char *buffer) {
5959

6060
fs_directory_entry_t *parse_directory(fs_tree_t *node, iso9660 *info, uint32_t start_lba, uint32_t lengthbytes) {
6161

62+
if (lengthbytes < 2048) {
63+
lengthbytes *= 2048;
64+
}
65+
6266
unsigned char *dirbuffer = kmalloc(lengthbytes);
6367
if (!dirbuffer) {
6468
return NULL;
@@ -94,7 +98,7 @@ fs_directory_entry_t *parse_directory(fs_tree_t *node, iso9660 *info, uint32_t s
9498

9599
// Sanity: Does this entry stay within the buffer?
96100
if (walkbuffer + fentry->length > dirbuffer + lengthbytes) {
97-
kprintf("ISO9660: Directory entry overflows buffer\n");
101+
kprintf("ISO9660: Directory entry overflows buffer. fentry->length=%d lengthbytes=%d\n", fentry->length, lengthbytes);
98102
break;
99103
}
100104

@@ -104,7 +108,6 @@ fs_directory_entry_t *parse_directory(fs_tree_t *node, iso9660 *info, uint32_t s
104108
if (entrycount > 2) {
105109
fs_directory_entry_t *thisentry = kmalloc(sizeof(fs_directory_entry_t));
106110
if (!thisentry) {
107-
entrycount--;
108111
break;
109112
}
110113

@@ -129,8 +132,6 @@ fs_directory_entry_t *parse_directory(fs_tree_t *node, iso9660 *info, uint32_t s
129132
if (info->joliet == 0) {
130133
uint32_t safe_len = fentry->filename_length;
131134
thisentry->filename = kmalloc(safe_len + 1);
132-
dprintf("filename alloc: %d bytes\n", safe_len + 1);
133-
134135
uint32_t j = 0;
135136
char *ptr = fentry->filename;
136137

@@ -147,8 +148,6 @@ fs_directory_entry_t *parse_directory(fs_tree_t *node, iso9660 *info, uint32_t s
147148
} else {
148149
uint32_t safe_len = fentry->filename_length / 2;
149150
thisentry->filename = kmalloc(safe_len + 1);
150-
dprintf("filename alloc: %d bytes\n", safe_len + 1);
151-
152151
uint32_t j = 0;
153152
char *ptr = fentry->filename;
154153

@@ -249,9 +248,10 @@ void *iso_get_directory(void *t) {
249248
fs_tree_t *treeitem = (fs_tree_t *) t;
250249
if (treeitem) {
251250
iso9660 *info = (iso9660 *) treeitem->opaque;
251+
dprintf("iso_get_directory size: %d %d %d\n", treeitem->size, info->rootextent_len, treeitem->size ? treeitem->size : info->rootextent_len);
252252
return (void *) parse_directory(treeitem, (iso9660 *) treeitem->opaque,
253253
treeitem->lbapos ? treeitem->lbapos : info->rootextent_lba,
254-
treeitem->size ? treeitem->size : info->rootextent_len);
254+
treeitem->size ? treeitem->size : info->rootextent_len * 2048);
255255
} else {
256256
kprintf("*** BUG *** iso_get_directory: null fs_tree_t*!\n");
257257
return NULL;

src/kernel.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ void kmain()
99
preboot_fail("Failed to mount boot drive to VFS!");
1010
}
1111

12+
kprintf("Bringing up network...\n");
1213
netdev_t* network = get_active_network_device();
1314
if (network) {
1415
kprintf("Active network card: %s\n", network->description);

src/net.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,17 @@ uint32_t ntohl(uint32_t netlong) {
9595

9696
void network_up()
9797
{
98+
kprintf(" arp,");
9899
arp_init();
100+
kprintf(" IP,");
99101
ip_init();
102+
kprintf(" TCP,");
100103
tcp_init();
104+
kprintf(" DHCP,");
101105
dhcp_discover();
106+
kprintf(" DNS");
102107
init_dns();
108+
kprintf("\n");
103109
}
104110

105111
void network_down()

src/printf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ int dprintf(const char *fmt, ...)
303303

304304
va_start(args, fmt);
305305
rv = dvprintf(fmt, args);
306+
//rv = vprintf(fmt, args);
306307
va_end(args);
307308
return rv;
308309
}

0 commit comments

Comments
 (0)