@@ -128,28 +128,38 @@ static char *findmnt(const char *path)
128128
129129static const char * var_list [] = { "_crt0_startup_flags" , NULL };
130130
131- static int cp (const char * from , const char * to )
131+ static int copy_file (const char * src , const char * dest )
132132{
133- char buf [1024 ];
134- int ret ;
135- size_t sz = snprintf (buf , sizeof (buf ), "cp %s %s" , from , to );
136- if (sz >= sizeof (buf ))
133+ char buffer [4096 ];
134+ size_t bytes ;
135+ int rc = 0 ;
136+ FILE * source = fopen (src , "rb" );
137+ FILE * destination = fopen (dest , "wb" );
138+
139+ if (!source || !destination ) {
140+ if (source ) {
141+ fprintf (stderr , "failed to open for writing %s\n" , dest );
142+ fclose (source );
143+ } else {
144+ fprintf (stderr , "failed to open for reading %s\n" , src );
145+ }
137146 return -1 ;
138- ret = system (buf );
139- switch (ret ) {
140- case -1 :
141- fprintf (stderr , "system(cp) failed: %s\n" , strerror (errno ));
142- break ;
143- case 0 :
144- break ;
145- case 127 :
146- fprintf (stderr , "system(cp): shell unavailable\n" );
147- break ;
148- default :
149- fprintf (stderr , "system(cp): command failed with %i\n" , ret );
147+ }
148+
149+ while ((bytes = fread (buffer , 1 , sizeof (buffer ), source )) > 0 ) {
150+ size_t wr = fwrite (buffer , 1 , bytes , destination );
151+ if (wr != bytes ) {
152+ fprintf (stderr , "failed to write to %s\n" , dest );
153+ rc = -1 ;
150154 break ;
155+ }
151156 }
152- return ret ;
157+
158+ fclose (source );
159+ fclose (destination );
160+ if (rc )
161+ remove (dest );
162+ return rc ;
153163}
154164
155165static void * emu_dlmopen (int handle , const char * filename , int flags ,
@@ -170,7 +180,7 @@ static void *emu_dlmopen(int handle, const char *filename, int flags,
170180 p ++ ;
171181 unlink (path );
172182 /* glibc compares inodes from stat(), so symlinks do not help - use cp */
173- err = cp (filename , path );
183+ err = copy_file (filename , path );
174184 if (err ) {
175185 fprintf (stderr , "cp(%s %s) failed\n" , filename , path );
176186#if 1
0 commit comments