Am 05.11.2016 14:37, schrieb Arnout Vandecappelle (Essensium/Mind):
> When makedevs is called for a second time with the same device file, it
> will fail because the files already exist and mknod() gives -EEXISTS.
> 
> To avoid this, check if the file already exists and if so, if it is of
> the right type. The chmod and chown changes are still done.
> 


i am not familiar with that program. Is this std. behavior ?

re,
 wh


> function                                             old     new   delta
> makedevs_main                                       1086    1201    +115
> .rodata                                           138731  138832    +101
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 2/0 up/down: 216/0)             Total: 216 bytes
>    text    data     bss     dec     hex filename
>  856021   15958    1968  873947   d55db busybox_old
>  856237   15958    1968  874163   d56b3 busybox_unstripped
> 
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <[email protected]>
> ---
>  miscutils/makedevs.c | 18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c
> index c945a13..49f011d 100644
> --- a/miscutils/makedevs.c
> +++ b/miscutils/makedevs.c
> @@ -225,6 +225,7 @@ int makedevs_main(int argc UNUSED_PARAM, char **argv)
>                       dev_t rdev;
>                       unsigned i;
>                       char *full_name_inc;
> +                     struct stat st;
>  
>                       if (type == 'p') {
>                               mode |= S_IFIFO;
> @@ -244,10 +245,23 @@ int makedevs_main(int argc UNUSED_PARAM, char **argv)
>                       for (i = start; i <= start + count; i++) {
>                               sprintf(full_name_inc, count ? "%s%u" : "%s", 
> full_name, i);
>                               rdev = makedev(major, minor + (i - start) * 
> increment);
> -                             if (mknod(full_name_inc, mode, rdev) < 0) {
> +                             if (stat(full_name_inc, &st) == 0) {
> +                                     if ((mode & S_IFMT) != (st.st_mode & 
> S_IFMT)) {
> +                                             bb_error_msg("line %d: node %s 
> exists but is of wrong file type", linenum, full_name_inc);
> +                                             ret = EXIT_FAILURE;
> +                                             continue;
> +                                     }
> +                                     if (st.st_rdev != rdev) {
> +                                             bb_error_msg("line %d: node %s 
> exists but is wrong device number", linenum, full_name_inc);
> +                                             ret = EXIT_FAILURE;
> +                                             continue;
> +                                     }
> +                             } else if (mknod(full_name_inc, mode, rdev) < 
> 0) {
>                                       bb_perror_msg("line %d: can't create 
> node %s", linenum, full_name_inc);
>                                       ret = EXIT_FAILURE;
> -                             } else if (chown(full_name_inc, uid, gid) < 0) {
> +                                     continue;
> +                             }
> +                             if (chown(full_name_inc, uid, gid) < 0) {
>                                       bb_perror_msg("line %d: can't chown 
> %s", linenum, full_name_inc);
>                                       ret = EXIT_FAILURE;
>                               } else if (chmod(full_name_inc, mode) < 0) {
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to