|
@@ -708,6 +708,7 @@ static void dload_symbols(struct dload_state *dlthis)
|
|
|
struct local_symbol *sp;
|
|
|
struct dynload_symbol *symp;
|
|
|
struct dynload_symbol *newsym;
|
|
|
+ struct doff_syment_t *my_sym_buf;
|
|
|
|
|
|
sym_count = dlthis->dfile_hdr.df_no_syms;
|
|
|
if (sym_count == 0)
|
|
@@ -741,13 +742,18 @@ static void dload_symbols(struct dload_state *dlthis)
|
|
|
become defined from the global symbol table */
|
|
|
checks = dlthis->verify.dv_sym_tab_checksum;
|
|
|
symbols_left = sym_count;
|
|
|
+
|
|
|
+ my_sym_buf = kzalloc(sizeof(*my_sym_buf) * MY_SYM_BUF_SIZ, GFP_KERNEL);
|
|
|
+ if (!my_sym_buf)
|
|
|
+ return;
|
|
|
+
|
|
|
do { /* read all symbols */
|
|
|
char *sname;
|
|
|
u32 val;
|
|
|
s32 delta;
|
|
|
struct doff_syment_t *input_sym;
|
|
|
unsigned syms_in_buf;
|
|
|
- struct doff_syment_t my_sym_buf[MY_SYM_BUF_SIZ];
|
|
|
+
|
|
|
input_sym = my_sym_buf;
|
|
|
syms_in_buf = symbols_left > MY_SYM_BUF_SIZ ?
|
|
|
MY_SYM_BUF_SIZ : symbols_left;
|
|
@@ -755,7 +761,7 @@ static void dload_symbols(struct dload_state *dlthis)
|
|
|
if (dlthis->strm->read_buffer(dlthis->strm, input_sym, siz) !=
|
|
|
siz) {
|
|
|
DL_ERROR(readstrm, sym_errid);
|
|
|
- return;
|
|
|
+ goto free_sym_buf;
|
|
|
}
|
|
|
if (dlthis->reorder_map)
|
|
|
dload_reorder(input_sym, siz, dlthis->reorder_map);
|
|
@@ -858,7 +864,7 @@ static void dload_symbols(struct dload_state *dlthis)
|
|
|
DL_ERROR("Absolute symbol %s is "
|
|
|
"defined multiple times with "
|
|
|
"different values", sname);
|
|
|
- return;
|
|
|
+ goto free_sym_buf;
|
|
|
}
|
|
|
}
|
|
|
loop_itr:
|
|
@@ -889,6 +895,9 @@ loop_cont:
|
|
|
if (~checks)
|
|
|
dload_error(dlthis, "Checksum of symbols failed");
|
|
|
|
|
|
+free_sym_buf:
|
|
|
+ kfree(my_sym_buf);
|
|
|
+ return;
|
|
|
} /* dload_symbols */
|
|
|
|
|
|
/*****************************************************************************
|