Revision 38d840e6 linux-user/syscall.c

b/linux-user/syscall.c
3437 3437
        ret = 0; /* avoid warning */
3438 3438
        break;
3439 3439
    case TARGET_NR_read:
3440
        if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
3441
            goto efault;
3442
        ret = get_errno(read(arg1, p, arg3));
3443
        unlock_user(p, arg2, ret);
3440
        if (arg3 == 0)
3441
            ret = 0;
3442
        else {
3443
            if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
3444
                goto efault;
3445
            ret = get_errno(read(arg1, p, arg3));
3446
            unlock_user(p, arg2, ret);
3447
        }
3444 3448
        break;
3445 3449
    case TARGET_NR_write:
3446 3450
        if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
......
3941 3945
        goto unimplemented;
3942 3946
#endif
3943 3947
    case TARGET_NR_acct:
3944
        if (!(p = lock_user_string(arg1)))
3945
            goto efault;
3946
        ret = get_errno(acct(path(p)));
3947
        unlock_user(p, arg1, 0);
3948
        if (arg1 == 0) {
3949
            ret = get_errno(acct(NULL));
3950
        } else {
3951
            if (!(p = lock_user_string(arg1)))
3952
                goto efault;
3953
            ret = get_errno(acct(path(p)));
3954
            unlock_user(p, arg1, 0);
3955
        }
3948 3956
        break;
3949 3957
#ifdef TARGET_NR_umount2 /* not on alpha */
3950 3958
    case TARGET_NR_umount2:

Also available in: Unified diff