@@ -174,12 +174,14 @@ nonnull_all
174
174
static int32_t resolve_path (
175
175
const char * includer , const char * include , char * * path )
176
176
{
177
+ char * resolved ;
178
+ char buffer [PATH_MAX + 1 ];
179
+
177
180
if (* includer && * include != '/' ) {
178
181
assert (* includer == '/' );
179
182
const char * separator = strrchr (includer , '/' );
180
183
if (separator - include > INT_MAX )
181
184
return ZONE_OUT_OF_MEMORY ;
182
- char buffer [16 ];
183
185
int offset = (int )(separator - includer );
184
186
int length = snprintf (
185
187
buffer , sizeof (buffer ), "%.*s/%s" , offset , includer , include );
@@ -190,15 +192,21 @@ static int32_t resolve_path(
190
192
return ZONE_OUT_OF_MEMORY ;
191
193
(void )snprintf (
192
194
absolute , (size_t )length + 1 , "%.*s/%s" , offset , includer , include );
193
- * path = realpath (absolute , NULL );
195
+ resolved = realpath (absolute , buffer );
194
196
free (absolute );
195
197
} else {
196
- * path = realpath (include , NULL );
198
+ resolved = realpath (include , buffer );
197
199
}
198
200
199
- if (* path )
200
- return 0 ;
201
- return (errno == ENOMEM ) ? ZONE_OUT_OF_MEMORY : ZONE_NOT_A_FILE ;
201
+ if (!resolved )
202
+ return (errno == ENOMEM ) ? ZONE_OUT_OF_MEMORY : ZONE_NOT_A_FILE ;
203
+ assert (resolved == buffer );
204
+ size_t length = strlen (buffer );
205
+ if (!(resolved = malloc (length + 1 )))
206
+ return ZONE_OUT_OF_MEMORY ;
207
+ memcpy (resolved , buffer , length + 1 );
208
+ * path = resolved ;
209
+ return 0 ;
202
210
}
203
211
#endif
204
212
@@ -276,6 +284,7 @@ static int32_t open_file(
276
284
277
285
initialize_file (parser , file );
278
286
287
+ file -> path = NULL ;
279
288
if (!(file -> name = malloc (length + 1 )))
280
289
return ZONE_OUT_OF_MEMORY ;
281
290
memcpy (file -> name , include , length );
0 commit comments