forked from pool/e2fsprogs
191 lines
6.0 KiB
Diff
191 lines
6.0 KiB
Diff
Index: e2fsprogs-1.40.4/lib/et/com_err.pc.in
|
|
===================================================================
|
|
--- e2fsprogs-1.40.4.orig/lib/et/com_err.pc.in
|
|
+++ e2fsprogs-1.40.4/lib/et/com_err.pc.in
|
|
@@ -7,5 +7,5 @@ Name: com_err
|
|
Description: Common error description library
|
|
Version: @E2FSPROGS_VERSION@
|
|
Requires:
|
|
-Cflags: -I${includedir}
|
|
-Libs: -L${libdir} -lcom_err
|
|
+Cflags: -I${includedir} -pthread
|
|
+Libs: -L${libdir} -lcom_err -pthread
|
|
Index: e2fsprogs-1.40.4/lib/et/error_message.c
|
|
===================================================================
|
|
--- e2fsprogs-1.40.4.orig/lib/et/error_message.c
|
|
+++ e2fsprogs-1.40.4/lib/et/error_message.c
|
|
@@ -20,6 +20,7 @@
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
+#include <pthread.h>
|
|
#ifdef HAVE_SYS_PRCTL_H
|
|
#include <sys/prctl.h>
|
|
#else
|
|
@@ -41,6 +42,17 @@
|
|
struct et_list * _et_list = (struct et_list *) NULL;
|
|
struct et_list * _et_dynamic_list = (struct et_list *) NULL;
|
|
|
|
+static pthread_mutex_t _et_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
+
|
|
+int et_list_lock()
|
|
+{
|
|
+ return pthread_mutex_lock(&_et_lock);
|
|
+}
|
|
+
|
|
+int et_list_unlock()
|
|
+{
|
|
+ return pthread_mutex_unlock(&_et_lock);
|
|
+}
|
|
|
|
const char * error_message (errcode_t code)
|
|
{
|
|
@@ -66,22 +78,32 @@ const char * error_message (errcode_t co
|
|
goto oops;
|
|
#endif
|
|
}
|
|
+ et_list_lock();
|
|
for (et = _et_list; et; et = et->next) {
|
|
if ((et->table->base & 0xffffffL) == (table_num & 0xffffffL)) {
|
|
/* This is the right table */
|
|
- if (et->table->n_msgs <= offset)
|
|
- goto oops;
|
|
- return(et->table->msgs[offset]);
|
|
+ if (et->table->n_msgs <= offset) {
|
|
+ break;
|
|
+ } else {
|
|
+ const char *msg = et->table->msgs[offset];
|
|
+ et_list_unlock();
|
|
+ return(msg);
|
|
+ }
|
|
}
|
|
}
|
|
for (et = _et_dynamic_list; et; et = et->next) {
|
|
if ((et->table->base & 0xffffffL) == (table_num & 0xffffffL)) {
|
|
/* This is the right table */
|
|
- if (et->table->n_msgs <= offset)
|
|
- goto oops;
|
|
- return(et->table->msgs[offset]);
|
|
+ if (et->table->n_msgs <= offset) {
|
|
+ break;
|
|
+ } else {
|
|
+ const char *msg = et->table->msgs[offset];
|
|
+ et_list_unlock();
|
|
+ return(msg);
|
|
+ }
|
|
}
|
|
}
|
|
+ et_list_unlock();
|
|
oops:
|
|
return "Unknown code";
|
|
}
|
|
@@ -150,6 +172,9 @@ errcode_t add_error_table(const struct e
|
|
if (!(el = (struct et_list *) malloc(sizeof(struct et_list))))
|
|
return ENOMEM;
|
|
|
|
+ if( 0 != et_list_lock())
|
|
+ return errno;
|
|
+
|
|
el->table = et;
|
|
el->next = _et_dynamic_list;
|
|
_et_dynamic_list = el;
|
|
@@ -160,6 +185,7 @@ errcode_t add_error_table(const struct e
|
|
error_table_name(et->base),
|
|
(const void *) et);
|
|
|
|
+ et_list_unlock();
|
|
return 0;
|
|
}
|
|
|
|
@@ -168,9 +194,13 @@ errcode_t add_error_table(const struct e
|
|
*/
|
|
errcode_t remove_error_table(const struct error_table * et)
|
|
{
|
|
- struct et_list *el = _et_dynamic_list;
|
|
+ struct et_list *el;
|
|
struct et_list *el2 = 0;
|
|
|
|
+ if( 0 != et_list_lock())
|
|
+ return ENOENT;
|
|
+
|
|
+ el = _et_dynamic_list;
|
|
init_debug();
|
|
while (el) {
|
|
if (el->table->base == et->base) {
|
|
@@ -184,6 +214,7 @@ errcode_t remove_error_table(const struc
|
|
"remove_error_table: %s (0x%p)\n",
|
|
error_table_name(et->base),
|
|
(const void *) et);
|
|
+ et_list_unlock();
|
|
return 0;
|
|
}
|
|
el2 = el;
|
|
@@ -193,6 +224,7 @@ errcode_t remove_error_table(const struc
|
|
fprintf(debug_f, "remove_error_table FAILED: %s (0x%p)\n",
|
|
error_table_name(et->base),
|
|
(const void *) et);
|
|
+ et_list_unlock();
|
|
return ENOENT;
|
|
}
|
|
|
|
Index: e2fsprogs-1.40.4/lib/et/error_table.h
|
|
===================================================================
|
|
--- e2fsprogs-1.40.4.orig/lib/et/error_table.h
|
|
+++ e2fsprogs-1.40.4/lib/et/error_table.h
|
|
@@ -19,6 +19,8 @@ struct et_list {
|
|
const struct error_table *table;
|
|
};
|
|
extern struct et_list * _et_list;
|
|
+extern int et_list_lock(void);
|
|
+extern int et_list_unlock(void);
|
|
|
|
#define ERRCODE_RANGE 8 /* # of bits to shift table number */
|
|
#define BITS_PER_CHAR 6 /* # bits to shift per character in name */
|
|
Index: e2fsprogs-1.40.4/lib/et/et_c.awk
|
|
===================================================================
|
|
--- e2fsprogs-1.40.4.orig/lib/et/et_c.awk
|
|
+++ e2fsprogs-1.40.4/lib/et/et_c.awk
|
|
@@ -225,6 +225,8 @@ END {
|
|
print " const struct error_table * table;" > outfile
|
|
print "};" > outfile
|
|
print "extern struct et_list *_et_list;" > outfile
|
|
+ print "extern int et_list_lock();" > outfile
|
|
+ print "extern int et_list_unlock();" > outfile
|
|
print "" > outfile
|
|
if (tab_base_high == 0) {
|
|
print "const struct error_table et_" table_name "_error_table = { text, " \
|
|
@@ -242,7 +244,22 @@ END {
|
|
print "void initialize_" table_name "_error_table(void);" > outfile
|
|
print "" > outfile
|
|
print "void initialize_" table_name "_error_table(void) {" > outfile
|
|
- print " initialize_" table_name "_error_table_r(&_et_list);" > outfile
|
|
+ print " if(0 == et_list_lock()) {" > outfile
|
|
+ print " if ( !link.table) {" > outfile
|
|
+ print " struct et_list *el = _et_list;" > outfile
|
|
+ print " while (el) {" > outfile
|
|
+ print " if (el->table->base == et_" table_name "_error_table.base) {" > outfile
|
|
+ print " et_list_unlock();" > outfile
|
|
+ print " return;" > outfile
|
|
+ print " }" > outfile
|
|
+ print " el = el->next;" > outfile
|
|
+ print " }" > outfile
|
|
+ print " link.next = _et_list;" > outfile
|
|
+ print " link.table = &et_" table_name "_error_table;" > outfile
|
|
+ print " _et_list = &link;" > outfile
|
|
+ print " }" > outfile
|
|
+ print " et_list_unlock();" > outfile
|
|
+ print " }" > outfile
|
|
print "}" > outfile
|
|
print "" > outfile
|
|
print "/* For Heimdal compatibility */" > outfile
|
|
@@ -255,9 +272,6 @@ END {
|
|
print " return;" > outfile
|
|
print " et = malloc(sizeof(struct et_list));" > outfile
|
|
print " if (et == 0) {" > outfile
|
|
- print " if (!link.table)" > outfile
|
|
- print " et = &link;" > outfile
|
|
- print " else" > outfile
|
|
print " return;" > outfile
|
|
print " }" > outfile
|
|
print " et->table = &et_" table_name "_error_table;" > outfile
|