1
1
// SPDX-License-Identifier: GPL-3.0-only
2
2
#define _GNU_SOURCE
3
3
4
+ #include <sys/wait.h>
4
5
#include <unistd.h>
5
6
#include <stdio.h>
6
7
#include <stdint.h>
@@ -59,6 +60,11 @@ static int in_envvar(const char *envname, const char *value)
59
60
return in_list (getenv (envname ), ',' , value );
60
61
}
61
62
63
+ static pid_t waitpid_retry (pid_t pid , int * wstatus , int options )
64
+ {
65
+ return (pid_t ) TEMP_FAILURE_RETRY (waitpid (pid , wstatus , options ));
66
+ }
67
+
62
68
static int resolve_soname (const char * * soname , size_t len , char * outbuf )
63
69
{
64
70
int pipefd [2 ];
@@ -108,6 +114,10 @@ static int resolve_soname(const char **soname, size_t len, char *outbuf)
108
114
}
109
115
ret = 0 ;
110
116
out_parent :
117
+ int status ;
118
+ if (waitpid_retry (pid , & status , 0 ) < 0 )
119
+ warn ("waitpid" );
120
+
111
121
close (pipefd [0 ]); // read
112
122
close (pipefd [1 ]); // write
113
123
@@ -123,17 +133,17 @@ static int resolve_soname(const char **soname, size_t len, char *outbuf)
123
133
if (handle )
124
134
dlclose (handle );
125
135
126
- if (!( handle = dlopen ( soname [ i ], RTLD_LAZY )))
127
- continue ;
136
+ offset = 0 ;
137
+ siz = 0 ;
128
138
129
- if (dlinfo (handle , RTLD_DI_LINKMAP , & map ) < 0 ) {
130
- warnx ("dladdr(%s) failed: %s" , soname [i ], dlerror ());
131
- continue ;
139
+ if ((handle = dlopen (soname [i ], RTLD_LAZY )) != NULL ) {
140
+ if (dlinfo (handle , RTLD_DI_LINKMAP , & map ) == 0 ) {
141
+ siz = strlen (map -> l_name ) + 1 ;
142
+ } else {
143
+ warnx ("dladdr(%s) failed: %s" , soname [i ], dlerror ());
144
+ }
132
145
}
133
146
134
- offset = 0 ;
135
- siz = strlen (map -> l_name ) + 1 ;
136
-
137
147
errno = 0 ;
138
148
n = TEMP_FAILURE_RETRY (write (pipefd [1 ], & siz , sizeof (siz )));
139
149
if (n < 0 ) {
@@ -154,7 +164,8 @@ static int resolve_soname(const char **soname, size_t len, char *outbuf)
154
164
offset += (size_t ) n ;
155
165
}
156
166
157
- break ;
167
+ if (map )
168
+ break ;
158
169
}
159
170
ret = EXIT_SUCCESS ;
160
171
out_child :
0 commit comments