Skip to content

Commit 141820f

Browse files
committed
dosirq.c (irq_hook): cache handler_size, avoid use-after-free for djgpp
1 parent aec68fd commit 141820f

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

src/dos/dosirq.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ struct irq_handle *irq_hook(int irqno, irq_handler handler, irq_handler end)
135135
__dpmi_version_ret version;
136136
_go32_dpmi_seginfo info;
137137
unsigned long old_sel, old_ofs;
138+
unsigned long size;
138139

139140
__dpmi_get_version(&version);
140141
if (irqno < 8)
@@ -153,14 +154,15 @@ struct irq_handle *irq_hook(int irqno, irq_handler handler, irq_handler end)
153154
return NULL;
154155

155156
/* Lock the interrupt handler in memory */
156-
if (dpmi_lock_linear_region_base((void *)handler, (unsigned long)end - (unsigned long)handler)) {
157+
size = (unsigned long)end - (unsigned long)handler;
158+
if (dpmi_lock_linear_region_base((void *)handler, size)) {
157159
_free_iret_wrapper(&info);
158160
return NULL;
159161
}
160162

161163
irq = (struct irq_handle *) malloc(sizeof(struct irq_handle));
162164
irq->c_handler = handler;
163-
irq->handler_size = (unsigned long)end - (unsigned long)handler;
165+
irq->handler_size = size;
164166
irq->handler = info.pm_offset;
165167
irq->prev_selector = old_sel;
166168
irq->prev_offset = old_ofs;
@@ -170,7 +172,7 @@ struct irq_handle *irq_hook(int irqno, irq_handler handler, irq_handler end)
170172

171173
if (dpmi_lock_linear_region_base(irq, sizeof(struct irq_handle))) {
172174
free(irq);
173-
dpmi_unlock_linear_region_base((void *)handler, irq->handler_size);
175+
dpmi_unlock_linear_region_base((void *)handler, size);
174176
_free_iret_wrapper(&info);
175177
return NULL;
176178
}

0 commit comments

Comments
 (0)