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 #include #include +#include #ifdef HAVE_SYS_PRCTL_H #include #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