@@ -707,6 +707,19 @@ check_running_in_user_namespace (libcrun_error_t *err)
707707 return ret ;
708708}
709709
710+ static size_t
711+ get_page_size ()
712+ {
713+ static atomic_long cached_pagesize = 0 ;
714+ atomic_long pagesize = cached_pagesize ;
715+ if (pagesize == 0 )
716+ {
717+ pagesize = (long ) sysconf (_SC_PAGESIZE );
718+ cached_pagesize = pagesize ;
719+ }
720+ return (size_t ) pagesize ;
721+ }
722+
710723static int selinux_enabled = -1 ;
711724static int apparmor_enabled = -1 ;
712725
@@ -725,7 +738,7 @@ libcrun_initialize_selinux (libcrun_error_t *err)
725738 if (UNLIKELY (fd < 0 ))
726739 return crun_make_error (err , errno , "open /proc/mounts" );
727740
728- ret = read_all_fd (fd , "/proc/mounts" , & out , & len , err );
741+ ret = read_all_fd_with_size_hint (fd , "/proc/mounts" , & out , & len , get_page_size () , err );
729742 if (UNLIKELY (ret < 0 ))
730743 return ret ;
731744
@@ -866,21 +879,26 @@ set_apparmor_profile (const char *profile, bool now, libcrun_error_t *err)
866879}
867880
868881int
869- read_all_fd (int fd , const char * description , char * * out , size_t * len , libcrun_error_t * err )
882+ read_all_fd_with_size_hint (int fd , const char * description , char * * out , size_t * len , size_t size_hint , libcrun_error_t * err )
870883{
871- int ret ;
884+ cleanup_free char * buf = NULL ;
872885 size_t nread , allocated ;
886+ size_t pagesize = 0 ;
873887 off_t size = 0 ;
874- cleanup_free char * buf = NULL ;
888+ int ret ;
875889
876- ret = get_file_size (fd , & size );
877- if (UNLIKELY (ret < 0 ))
878- return crun_make_error (err , errno , "error stat'ing file `%s`" , description );
890+ if (size_hint )
891+ allocated = size_hint ;
892+ else
893+ {
894+ ret = get_file_size (fd , & size );
895+ if (UNLIKELY (ret < 0 ))
896+ return crun_make_error (err , errno , "error stat'ing file `%s`" , description );
897+
898+ allocated = size == 0 ? 1023 : size ;
899+ }
879900
880901 /* NUL terminate the buffer. */
881- allocated = size + 1 ;
882- if (size == 0 )
883- allocated = 1023 ;
884902 buf = xmalloc (allocated + 1 );
885903 nread = 0 ;
886904 while ((size && nread < (size_t ) size ) || size == 0 )
@@ -896,7 +914,14 @@ read_all_fd (int fd, const char *description, char **out, size_t *len, libcrun_e
896914
897915 if (nread == allocated )
898916 {
899- allocated += 4096 ;
917+ if (size )
918+ break ;
919+
920+ if (pagesize == 0 )
921+ pagesize = get_page_size ();
922+
923+ allocated += pagesize ;
924+
900925 buf = xrealloc (buf , allocated + 1 );
901926 }
902927 }
@@ -1160,15 +1185,14 @@ copy_from_fd_to_fd (int src, int dst, int consume, libcrun_error_t *err)
11601185{
11611186 int ret ;
11621187 ssize_t nread ;
1188+ size_t pagesize = get_page_size ();
11631189 do
11641190 {
11651191 cleanup_free char * buffer = NULL ;
11661192 ssize_t remaining ;
11671193
1168- #define BUFFER_SIZE 4096
1169-
11701194#ifdef HAVE_COPY_FILE_RANGE
1171- nread = copy_file_range (src , NULL , dst , NULL , BUFFER_SIZE , 0 );
1195+ nread = copy_file_range (src , NULL , dst , NULL , pagesize , 0 );
11721196 if (nread < 0 && (errno == EINVAL || errno == EXDEV ))
11731197 goto fallback ;
11741198 if (consume && nread < 0 && errno == EAGAIN )
@@ -1182,8 +1206,8 @@ copy_from_fd_to_fd (int src, int dst, int consume, libcrun_error_t *err)
11821206 fallback :
11831207#endif
11841208
1185- buffer = xmalloc (BUFFER_SIZE );
1186- nread = TEMP_FAILURE_RETRY (read (src , buffer , BUFFER_SIZE ));
1209+ buffer = xmalloc (pagesize );
1210+ nread = TEMP_FAILURE_RETRY (read (src , buffer , pagesize ));
11871211 if (consume && nread < 0 && errno == EAGAIN )
11881212 return 0 ;
11891213 if (nread < 0 && errno == EIO )
0 commit comments