@@ -176,9 +176,11 @@ nonnull_all
176
176
static int32_t resolve_path (
177
177
const char * includer , const char * include , char * * path )
178
178
{
179
+ char * resolved ;
180
+ char buffer [PATH_MAX + 1 ];
181
+
179
182
if (* includer && * include != '/' ) {
180
183
assert (* includer == '/' );
181
- char buffer [16 ];
182
184
int length = snprintf (
183
185
buffer , sizeof (buffer ), "%s/%s" , includer , include );
184
186
if (length < 0 )
@@ -188,15 +190,21 @@ static int32_t resolve_path(
188
190
return ZONE_OUT_OF_MEMORY ;
189
191
(void )snprintf (
190
192
absolute , (size_t )length + 1 , "%s/%s" , includer , include );
191
- * path = realpath (absolute , NULL );
193
+ resolved = realpath (absolute , buffer );
192
194
free (absolute );
193
195
} else {
194
- * path = realpath (include , NULL );
196
+ resolved = realpath (include , buffer );
195
197
}
196
198
197
- if (* path )
198
- return 0 ;
199
- return (errno == ENOMEM ) ? ZONE_OUT_OF_MEMORY : ZONE_NOT_A_FILE ;
199
+ if (!resolved )
200
+ return (errno == ENOMEM ) ? ZONE_OUT_OF_MEMORY : ZONE_NOT_A_FILE ;
201
+ assert (resolved == buffer );
202
+ size_t length = strlen (buffer );
203
+ if (!(resolved = malloc (length + 1 )))
204
+ return ZONE_OUT_OF_MEMORY ;
205
+ memcpy (resolved , buffer , length + 1 );
206
+ * path = resolved ;
207
+ return 0 ;
200
208
}
201
209
#endif
202
210
@@ -280,6 +288,7 @@ static int32_t open_file(
280
288
281
289
initialize_file (parser , file );
282
290
291
+ file -> path = NULL ;
283
292
if (!(file -> name = malloc (length + 1 )))
284
293
return ZONE_OUT_OF_MEMORY ;
285
294
memcpy (file -> name , include , length );
0 commit comments