Patrick Williams | 213cb26 | 2021-08-07 19:21:33 -0500 | [diff] [blame] | 1 | autofs-5.1.7 - use default stack size for threads |
| 2 | |
| 3 | From: Ian Kent <raven@themaw.net> |
| 4 | |
| 5 | autofs uses PTHREAD_STACK_MIN to set the stack size for threads it |
| 6 | creates. |
| 7 | |
| 8 | In two cases it is used to reduce the stack size for long running |
| 9 | service threads while it's used to allocate a larger stack for worker |
| 10 | threads that can have larger memory requirements. |
| 11 | |
| 12 | In recent glibc releases PTHREAD_STACK_MIN is no longer a constant |
| 13 | which can lead to unexpectedly different stack sizes on different |
| 14 | architectures and the autofs assumption it's a constant causes a |
| 15 | compile failure. |
| 16 | |
| 17 | The need to alter the stack size was due to observed stack overflow |
| 18 | which was thought to be due the thread stack being too small for autofs |
| 19 | and glibc alloca(3) usage. |
| 20 | |
| 21 | Quite a bit of that alloca(3) usage has been eliminated from autofs now, |
| 22 | particularly those that might be allocating largish amounts of storage, |
| 23 | and there has been a lot of change in glibc too so using the thread |
| 24 | default stack should be ok. |
| 25 | |
| 26 | Signed-off-by: Ian Kent <raven@themaw.net> |
| 27 | --- |
| 28 | CHANGELOG | 1 + |
| 29 | daemon/automount.c | 29 ----------------------------- |
| 30 | daemon/state.c | 6 +----- |
| 31 | lib/alarm.c | 6 +----- |
| 32 | 4 files changed, 3 insertions(+), 39 deletions(-) |
| 33 | |
| 34 | --- a/daemon/automount.c |
| 35 | +++ b/daemon/automount.c |
| 36 | @@ -92,7 +92,6 @@ static size_t kpkt_len; |
| 37 | /* Attributes for creating detached and joinable threads */ |
| 38 | pthread_attr_t th_attr; |
| 39 | pthread_attr_t th_attr_detached; |
| 40 | -size_t detached_thread_stack_size = PTHREAD_STACK_MIN * 144; |
| 41 | |
| 42 | struct master_readmap_cond mrc = { |
| 43 | PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, NULL, 0, 0, 0, 0}; |
| 44 | @@ -2617,34 +2616,6 @@ int main(int argc, char *argv[]) |
| 45 | if (start_pipefd[1] != -1) { |
| 46 | res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); |
| 47 | close(start_pipefd[1]); |
| 48 | - } |
| 49 | - release_flag_file(); |
| 50 | - macro_free_global_table(); |
| 51 | - exit(1); |
| 52 | - } |
| 53 | - |
| 54 | -#ifdef _POSIX_THREAD_ATTR_STACKSIZE |
| 55 | - if (pthread_attr_setstacksize( |
| 56 | - &th_attr_detached, detached_thread_stack_size)) { |
| 57 | - logerr("%s: failed to set stack size thread attribute!", |
| 58 | - program); |
| 59 | - if (start_pipefd[1] != -1) { |
| 60 | - res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); |
| 61 | - close(start_pipefd[1]); |
| 62 | - } |
| 63 | - release_flag_file(); |
| 64 | - macro_free_global_table(); |
| 65 | - exit(1); |
| 66 | - } |
| 67 | -#endif |
| 68 | - |
| 69 | - if (pthread_attr_getstacksize( |
| 70 | - &th_attr_detached, &detached_thread_stack_size)) { |
| 71 | - logerr("%s: failed to get detached thread stack size!", |
| 72 | - program); |
| 73 | - if (start_pipefd[1] != -1) { |
| 74 | - res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); |
| 75 | - close(start_pipefd[1]); |
| 76 | } |
| 77 | release_flag_file(); |
| 78 | macro_free_global_table(); |
| 79 | --- a/daemon/state.c |
| 80 | +++ b/daemon/state.c |
| 81 | @@ -1173,12 +1173,8 @@ int st_start_handler(void) |
| 82 | status = pthread_attr_init(pattrs); |
| 83 | if (status) |
| 84 | pattrs = NULL; |
| 85 | - else { |
| 86 | + else |
| 87 | pthread_attr_setdetachstate(pattrs, PTHREAD_CREATE_DETACHED); |
| 88 | -#ifdef _POSIX_THREAD_ATTR_STACKSIZE |
| 89 | - pthread_attr_setstacksize(pattrs, PTHREAD_STACK_MIN*4); |
| 90 | -#endif |
| 91 | - } |
| 92 | |
| 93 | status = pthread_create(&thid, pattrs, st_queue_handler, NULL); |
| 94 | |
| 95 | --- a/lib/alarm.c |
| 96 | +++ b/lib/alarm.c |
| 97 | @@ -270,12 +270,8 @@ int alarm_start_handler(void) |
| 98 | status = pthread_attr_init(pattrs); |
| 99 | if (status) |
| 100 | pattrs = NULL; |
| 101 | - else { |
| 102 | + else |
| 103 | pthread_attr_setdetachstate(pattrs, PTHREAD_CREATE_DETACHED); |
| 104 | -#ifdef _POSIX_THREAD_ATTR_STACKSIZE |
| 105 | - pthread_attr_setstacksize(pattrs, PTHREAD_STACK_MIN*4); |
| 106 | -#endif |
| 107 | - } |
| 108 | |
| 109 | status = pthread_condattr_init(&condattrs); |
| 110 | if (status) |