@@ -228,7 +228,7 @@ static const char *pseudo_random_global_id(const char *device)
228
228
unsigned char hash [SHA_DIGEST_LENGTH ];
229
229
struct ntptimeval ntv ;
230
230
struct ifreq ifr ;
231
- const unsigned char * mac ;
231
+ unsigned char mac [ 18 ] ;
232
232
int sockfd ;
233
233
234
234
sockfd = socket (AF_INET , SOCK_DGRAM , 0 );
@@ -246,11 +246,20 @@ static const char *pseudo_random_global_id(const char *device)
246
246
strncpy (ifr .ifr_name , device , sizeof (ifr .ifr_name ) - 1 );
247
247
248
248
if (ioctl (sockfd , SIOCGIFHWADDR , & ifr ) < 0 ) {
249
- perror ("cannot get dev hwaddr" );
250
- return NULL ;
249
+ int rand = open ("/dev/urandom" , O_RDONLY );
250
+ if (rand == -1 ) {
251
+ rand = open ("/dev/random" , O_RDONLY );
252
+ }
253
+ if (rand == -1 ) {
254
+ perror ("cannot get dev hwaddr and cannot open random" );
255
+ return NULL ;
256
+ }
257
+ read (rand , & mac , sizeof (mac ));
258
+ close (rand );
259
+ }
260
+ else {
261
+ strncpy (mac , ifr .ifr_ifru .ifru_addr .sa_data , sizeof (mac ));
251
262
}
252
-
253
- mac = (unsigned char * )ifr .ifr_ifru .ifru_addr .sa_data ;
254
263
255
264
/* https://tools.ietf.org/html/rfc4193
256
265
*
@@ -1177,7 +1186,7 @@ static int slirp4netns_config_from_options(struct slirp4netns_config *cfg,
1177
1186
if (cidr == NULL ) {
1178
1187
cidr = DEFAULT_CIDR6 ;
1179
1188
if (opt -> ipv6_random ) {
1180
- cidr = pseudo_random_global_id ("lo " );
1189
+ cidr = pseudo_random_global_id ("tap0 " );
1181
1190
if (cidr == NULL ) {
1182
1191
fprintf (stderr , "cannot create pseudo random global id\n" );
1183
1192
rc = -1 ;
0 commit comments